我收到错误<runtimewarning:invalid =“”value =“”遇见=“”in =“”sqrt =“”>

时间:2016-08-24 12:46:55

标签: python python-2.7 python-3.x numpy math

我试图在python中运行二次方程。但是,它一直给我一个错误&#34; RuntimeWarning:在sqrt&#34;中遇到无效值。

这是我的代码:

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

您的专家建议将非常有帮助。提前致谢

3 个答案:

答案 0 :(得分:10)

这不是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

答案 1 :(得分:1)

没有为严格的负实数定义平方根,对于“实数”dtype nanint 的负输入,numpy 会产生 float,并且它是两个特殊值 {{ 1}} 和 -np.inf

然而,平方根是为所有complex dtype 定义的:

<头>
数据类型 示例nan 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

答案 2 :(得分:0)

如果希望进行复杂的分析(使用sqrt(-1)定义的虚数),则可以导入cmath并使用cmath.sqrt(-1)代替numpy.sqrt(-1)。 / p>

例如,当我根据介电常数和磁导率计算材料的折射率时(根据定义,涉及到j),我将在python中编写如下函数:

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

其中e1f等是先前定义的内插函数,所有这些函数都是入射频率f的函数。所得的y本身就是一个复数值,即一个复杂的折射率,但是我通常只对实数部分(折射率)感兴趣,所以返回的就是这一点。

希望这会有所帮助