我正在尝试在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
根不是为严格的负实数定义的,numpy 将为"实"dtype int
、float
的负输入产生nan
,它是两个特殊值-np.inf
和nan
。
但是,为所有复数 dtype 定义了平方根:
D型 | 例如x | np.sqrt(x) | RuntimeWarning |
---|---|---|---|
正浮点数 | 1. | 1. | |
正整数 | 1 | 1 | |
阳性复合物 | 1+0J | 1 | |
负浮点数 | -1. | nan | ⚠️ |
负整数 | -1 | nan | ⚠️ |
负复合物 | -1+0j | 1j | |
无限 | np.inf | np.inf | |
负无穷大 | -np.inf | nan | ⚠️ |
南 | np.nan | nan |
如果您希望进行复杂分析(使用由sqrt(-1(定义的虚数(,则可以导入cmath并使用cmath.sqrt(-1(而不是numpy.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 结果本身就是一个复值,即复折射率,但我通常只对实部(折射率(感兴趣,所以这就是返回的内容。
希望这有帮助
在上述答案中添加一个见解。cmath
函数总是返回复数,但如果你想统一处理复数和浮点数对象,我建议使用 numpy.lib.scimath
.
注意:其中的sqrt()
函数比 cmath
和 math
模块的版本慢,但它可以灵活地在负参数和浮点对象的情况下返回复杂对象,否则