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-all
RuntimeError
。你的方法当然适用于我演示的这个特定函数,但我使用的是一个处理多项式根的更复杂的函数。无论如何,非常感谢你的帮助。
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()