我试图在python中运行二次方程。但是,它一直给我一个错误" RuntimeWarning:在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
您的专家建议将非常有帮助。提前致谢
答案 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 nan
、int
的负输入,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本身就是一个复数值,即一个复杂的折射率,但是我通常只对实数部分(折射率)感兴趣,所以返回的就是这一点。
希望这会有所帮助