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)
これは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
複雑な分析(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は、それ自体、複素数値、複素屈折率ですが、実際の部分(屈折率)のみに関心があることが多いので、これが返されます。
お役に立てれば