web-dev-qa-db-ja.com

警告が表示されます<RuntimeWarning:invalid value遭遇したsqrt>

Pythonで二次方程式を実行しようとしています。しかし、それは私に警告を与え続けます

RuntimeWarning: invalid value encountered in sqrt

これが私のコードです:

import numpy as np


a = 0.75 + (1.25 - 0.75)*np.random.randn(10000)
print(a)
b = 8 + (12 - 8)*np.random.randn(10000)
print(b)
c = -12 + 2*np.random.randn(10000)
print(c)
x0 = (-b - np.sqrt(b**2 - (4*a*c)))/(2 * a)
print(x0)
9
Maroof G

これは100%ではありませんPython関連。負の数の平方根を計算することはできません(実際の数を扱う場合))。

b**2 - (4*a*c)が負の数である場合の予防策はありませんでした。

>>> import numpy as np
>>>
>>> np.sqrt(4)
2.0
>>> np.sqrt(-4)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan

負の値があるかどうかをテストしましょう:

>>> import numpy as np
>>> 
>>> a = 0.75 + (1.25 - 0.75) * np.random.randn(10000)
>>> b = 8 + (12 - 8) * np.random.randn(10000)
>>> c = -12 + 2 * np.random.randn(10000)
>>> 
>>> z = b ** 2 - (4 * a * c)
>>> print len([_ for _ in z if _ < 0])
71
12
DeepSpace

複雑な分析(sqrt(-1)で定義された虚数での作業)を行う場合は、cmathをインポートして、numpy.sqrt(-1)の代わりにcmath.sqrt(-1)を使用できます。

たとえば、誘電率と透磁率から材料の屈折率を計算している場合(定義により、jが含まれます)、次のように関数をpythonで記述します。

def n(f):
    y = cmath.sqrt(mu1f(f) - j*mu2f(f)) * (e1f(f) - j*e2f(f))
    return y.real

E1fなどが以前に定義された補間関数である場合、それらはすべて入射周波数fの関数です。結果として得られるyは、それ自体、複素数値、複素屈折率ですが、実際の部分(屈折率)のみに関心があることが多いので、これが返されます。

お役に立てれば

1
Michael Green