2013-05-30 244 views
3

我正在尝试使用已知的y来求解x值。我能够得到多项式以适合我的数据,现在我想知道选择的y会落在曲线上的x值。在scipy/numpy中求解已知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

回答

3
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。

4

可以解决使用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',所以对方法的第二次调用实际上会给出错误的答案,也就是说,它会在不同于原始多项式的多项式中为'x'求解'y = 1'。 –

+1

使用[复制](http://docs.python.org/2/library/copy.html) –

+0

@Amit:是的,我的不好。我认为函数参数是按值传递的,而且它只对不可变类型才是真的。由于'np.array'是可变的,它通过引用传递。我会编辑帖子,谢谢。 –

相关问题