在Y处得到多项式X?(Python 3.10,NumPy)

aor9mmx1  于 2023-08-05  发布在  Python
关注(0)|答案(3)|浏览(87)

我试图在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值,它们分别存储在xy局部变量中。然后将收集的X值显示为所示图的标题。
上面的脚本将生成以下图:

的数据
X值显示为[-2.0, 0.0],而不是正确的:


在Python中,在某个Y值处获得多项式的所有真实的X值的正确方法是什么?
感谢您阅读我的文章,任何指导都很感激。

ghhaqwfi

ghhaqwfi1#

您的代码是正确的,并且您正确地使用了根函数。数据类型只有一个小问题。您可以通过调试器或在coeffs[-1] -= y之后打印coeff来查看错误。在你的coeffs = np.array([1, 2, 2])行,numpy将创建一个整数类型的数组,因此你的减法,这应该导致0.5实际上导致0,所以你的系数变成[1, 2, 0]。对于这些,计算出正确的结果。所以我们只需要将dtype设置为float:

import numpy as np
import matplotlib.pyplot as plt

def main():
    coeffs = np.array([1, 2, 2], dtype=float)   #<-----------
    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()

字符串


的数据

pepwfjgg

pepwfjgg2#

您应该使用numpy v1.4中添加的numpy.polynomial.Polynomial类(更多信息here)。使用该类,可以创建多项式对象。要找到解决方案,可以从Polynomial对象中减去y,然后调用roots方法。另一个很好的特性是,您可以直接调用该对象,您可以使用它来计算polyDataY
请注意,Polynomial类期望从np.roots向后给出系数,即x^2 + 2x + 2的二次函数应该具有系数(2, 2, 1)。为了保持与您给出的一致,我只传递了反向的coeffs

import numpy as np
from numpy.polynomial import Polynomial
import matplotlib.pyplot as plt

plt.close("all")

coeffs = np.array([1, 2, 2])
poly = Polynomial(coeffs[::-1])

polyDataX = np.linspace(-2, 0)
polyDataY = poly(polyDataX)

y = 1.5
x = (poly - y).roots()
plt.axhline(y, color = "orange")
plt.plot(polyDataX, polyDataY, color = "blue")
plt.title("X = " + str(x))
plt.show()

字符串


的数据

7rtdyuoh

7rtdyuoh3#

coeffs中的值为int32coeffs[-1] -= y之后的结果为0,而不是0.5。
只需将coeffs = np.array([1, 2, 2])更改为coeffs = np.array([1., 2., 2.])

相关问题