我试图在Python 3.10中从一个以降序系数给出的多项式中计算出某个Y值处所有可能的真实的X值。我希望得到的X值以list
的形式提供给我。
我试过使用numpy
库的roots()
函数,如this post的一个答案所示,但它似乎不起作用:
import numpy as np
import matplotlib.pyplot as plt
def main():
coeffs = np.array([1, 2, 2])
y = 1.5
polyDataX = np.linspace(-2, 0)
polyDataY = np.empty(shape = len(polyDataX), dtype = float)
for i in range(len(polyDataX)):
polyDataY[i] = coeffs[0] * pow(polyDataX[i], 2) + coeffs[1] * polyDataX[i] + coeffs[2]
coeffs[-1] -= y
x = np.roots(coeffs).tolist()
plt.axhline(y, color = "orange")
plt.plot(polyDataX, polyDataY, color = "blue")
plt.title("X = " + str(x))
plt.show()
plt.close()
plt.clf()
if (__name__ == "__main__"):
main()
字符串
在上面的例子中,我将多项式的系数存储在局部变量coeffs
中,按降序排列。然后,我尝试收集0.5
的Y值处的所有X值,它们分别存储在x
和y
局部变量中。然后将收集的X值显示为所示图的标题。
上面的脚本将生成以下图:
的数据
X值显示为[-2.0, 0.0]
,而不是正确的:
的
在Python中,在某个Y值处获得多项式的所有真实的X值的正确方法是什么?
感谢您阅读我的文章,任何指导都很感激。
3条答案
按热度按时间ghhaqwfi1#
您的代码是正确的,并且您正确地使用了根函数。数据类型只有一个小问题。您可以通过调试器或在
coeffs[-1] -= y
之后打印coeff
来查看错误。在你的coeffs = np.array([1, 2, 2])
行,numpy将创建一个整数类型的数组,因此你的减法,这应该导致0.5
实际上导致0
,所以你的系数变成[1, 2, 0]
。对于这些,计算出正确的结果。所以我们只需要将dtype设置为float:字符串
的数据
pepwfjgg2#
您应该使用numpy v1.4中添加的
numpy.polynomial.Polynomial
类(更多信息here)。使用该类,可以创建多项式对象。要找到解决方案,可以从Polynomial
对象中减去y
,然后调用roots
方法。另一个很好的特性是,您可以直接调用该对象,您可以使用它来计算polyDataY
。请注意,
Polynomial
类期望从np.roots
向后给出系数,即x^2 + 2x + 2
的二次函数应该具有系数(2, 2, 1)
。为了保持与您给出的一致,我只传递了反向的coeffs
。字符串
的数据
7rtdyuoh3#
coeffs
中的值为int32
,coeffs[-1] -= y
之后的结果为0,而不是0.5。只需将
coeffs = np.array([1, 2, 2])
更改为coeffs = np.array([1., 2., 2.])