Python matplotlib中与numpy.root相关的错误
我试图绘制二次根的(模)和,它返回一个错误,如下所示:Python matplotlib中与numpy.root相关的错误,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试图绘制二次根的(模)和,它返回一个错误,如下所示: import numpy as np import matplotlib.pyplot as plt def rooting(a, b, c): y = [a, b, c] z = np.roots(y) return np.absolute(z[0]+z[1]) x = np.linspace(1, 10, 10) plt.plot(x, rooting(x, 2, 3)) 错误是: File "C:\U
import numpy as np
import matplotlib.pyplot as plt
def rooting(a, b, c):
y = [a, b, c]
z = np.roots(y)
return np.absolute(z[0]+z[1])
x = np.linspace(1, 10, 10)
plt.plot(x, rooting(x, 2, 3))
错误是:
File "C:\Users\user\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py", line 1570, in nonzero
res = nonzero()
SystemError: <built-in method nonzero of numpy.ndarray object at 0x000001422B9BFD00> returned a result with an error set
文件“C:\Users\user\Anaconda3\lib\site packages\numpy\core\fromneric.py”,第1570行,非零格式
res=非零()
SystemError:返回了一个带有错误集的结果
有人能告诉我发生了什么吗?问题出现了,因为你要把变量传递给一个向量,然后用b和c连在一起,你必须把变量传递给一个标量,我展示了基于上面的下一个解决方案
def rooting(a, b, c):
y = [a, b, c]
z = np.roots(y)
return np.absolute(z[0]+z[1])
x = np.linspace(1, 10, 10)
y = [rooting(xi, 2, 3) for xi in x]
plt.plot(x, y)
plt.show()
使用二次公式,我们知道根是
(-b±)√(b**2-4ac))/2a
。
所以根和的模是| b/a |
。
通过这种简化,我们可以以矢量化的方式计算结果(无需列表压缩、循环或多次调用rooting
):
但是它为什么适用于plt.plot(x,x**2)这样的简单函数呢?这是因为
**
操作符对于numpy向量和矩阵是重载的。相反,串联并没有假定它,因为如果你传递一个x=[1,2,3]
,然后执行:y=[x,2,3]
,这等于ay=[1,2,3],1,2]
而根函数需要一个向量或标量列表,这不需要列表列表。如果要检查它,可以在下一行y=[a,b,c]
后打印y
,获取SystemError
可能是一个numpy错误。即使你做错了什么,你也应该得到一个标准的异常,比如ValueError
,TypeError
,或者catch-allRuntimeError
。你的方法当然适用于我演示的这个特定函数,但我使用的是一个处理多项式根的更复杂的函数。无论如何,非常感谢你的帮助。
import numpy as np
import matplotlib.pyplot as plt
def rooting(a, b, c):
# The roots are (-b ± √(b**2-4ac))/2a
# So the modulus of the sum of the roots is |b/a|
return np.abs(b/a)
x = np.linspace(0, 10, 11)
plt.plot(x, rooting(x, 2, 3))
plt.show()