已知y值,求解多项式的x值。

5
我正在尝试解出已知 y 值对应的 x 值。我已经成功拟合了多项式到我的数据上,现在我想知道选择的 y 值会落在曲线上的哪个 x 值上。
import numpy as np

x = [50, 25, 12.5, 6.25, 0.625, 0.0625, 0.01]
y = [0.00, 0.50, 0.68, 0.77, 0.79, 0.90, 1.00]

poly_coeffs = np.polyfit(x, y, 3)

f = np.poly1d(poly_coeffs)

我想要做0.5 = f,并解出x的值。
我可以在WolframAlpha上通过输入来解决这个问题:
0.5 = -9.1e-6*x^3 + 5.9e-4*x^2 - 2.5e-2*x + 9.05e-1

真实的 x 值约为 26

2个回答

6
In [1]: from numpy.polynomial import Polynomial as P

In [2]: x = [50, 25, 12.5, 6.25, 0.625, 0.0625, 0.01]

In [3]: y = [0.00, 0.50, 0.68, 0.77, 0.79, 0.90, 1.00]

In [4]: p = P.fit(x, y, 3)

In [5]: (p - .5).roots()
Out[5]: 
array([ 19.99806935-37.92449551j,  19.99806935+37.92449551j,
        25.36882693 +0.j        ])

看起来你需要的根是25.36882693。


5
你可以使用 np.roots 来解决方程 f(x) - y = 0。考虑以下函数:
def solve_for_y(poly_coeffs, y):
    pc = poly_coeffs.copy()
    pc[-1] -= y
    return np.roots(pc)

然后你可以使用它来解决任何你想要的 y 的多项式:

>>> print solve_for_y(poly_coeffs, 0.5)
[ 19.99806935+37.92449551j  19.99806935-37.92449551j  25.36882693 +0.j        ]
>>> print solve_for_y(poly_coeffs, 1.)
[ 40.85615395+50.1936152j  40.85615395-50.1936152j -16.34734226 +0.j       ]

2
你的方法似乎修改了 poly_coeffs,因此第二次调用该方法实际上会得到错误的答案,即它在解不同于原始多项式的 y = 1x - Amit Kumar Gupta
@Amit:是的,我的错。我认为函数参数是按值传递的,但这似乎只对不可变类型成立。由于 np.array 是可变的,因此它是按引用传递的。我会编辑帖子的内容,谢谢。 - Andrey Sobolev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接