我收到警告<运行时警告: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)

这不是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 intfloat 的负输入产生nan,它是两个特殊值-np.infnan

但是,为所有复数 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()函数比 cmathmath 模块的版本慢,但它可以灵活地在负参数和浮点对象的情况下返回复杂对象,否则

最新更新