反向输出polyfit numpy

时间:2015-09-29 15:09:43

标签: python numpy curve-fitting

我使用了numpy的polyfit并且对于两个数组x和y获得了非常好的拟合(使用7阶多项式)。我的关系是这样的;

y(x) = p[0]* x^7 + p[1]*x^6 + p[2]*x^5 + p[3]*x^4 + p[4]*x^3 + p[5]*x^2 + p[6]*x^1 + p[7]

其中p是polyfit输出的多项式数组。

有没有办法轻松扭转这种方法,所以我有一个解决方案,

x(y) = p[0]*y^n + p[1]*y^n-1 + .... + p[n]*y^0

1 个答案:

答案 0 :(得分:1)

  1. 一般来说,没有简单的方法。对于七阶多项式,任意多项式are not available的闭式求解。

  2. 可以反向进行拟合,但仅适用于原始多项式的单调变化区域。如果原始多项式在您感兴趣的域上具有最小值或最大值,那么即使y是x的函数,x也不能是y的函数,因为它们之间没有1对1的关系。

  3. 如果你是(i)可以重做拟合程序,(ii)确保在你的拟合的单个单调区域上分段工作,那么你可以做这样的事情:

  4. -

    import numpy as np
    
    # generate a random coefficient vector a
    degree = 1
    a = 2 * np.random.random(degree+1) - 1
    
    # an assumed true polynomial y(x)
    def y_of_x(x, coeff_vector):
        """
        Evaluate a polynomial with coeff_vector and degree len(coeff_vector)-1 using Horner's method.
        Coefficients are ordered by increasing degree, from the constant term at coeff_vector[0], 
            to the linear term at coeff_vector[1], to the n-th degree term at coeff_vector[n]
        """
        coeff_rev = coeff_vector[::-1]
        b = 0
        for a in coeff_rev:
            b = b * x + a
        return b
    
    
    # generate some data
    my_x = np.arange(-1, 1, 0.01)
    my_y = y_of_x(my_x, a)
    
    
    # verify that polyfit in the "traditional" direction gives the correct result
    #     [::-1] b/c polyfit returns coeffs in backwards order rel. to y_of_x()
    p_test = np.polyfit(my_x, my_y, deg=degree)[::-1]
    
    print p_test, a
    
    # fit the data using polyfit but with y as the independent var, x as the dependent var
    p = np.polyfit(my_y, my_x, deg=degree)[::-1]
    
    # define x as a function of y
    def x_of_y(yy, a): 
        return y_of_x(yy, a)  
    
    
    # compare results
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    plt.plot(my_x, my_y, '-b', x_of_y(my_y, p), my_y, '-r')
    

    注意:此代码不会检查单调性,只是假设它。

    通过使用degree的值,您应该看到代码仅适用于adegree=1的所有随机值。对于其他学位,它偶尔也可以,但是当有很多最小/最大值时则不行。它对于degree > 1来说永远不会完美,因为用平方根函数逼近抛物线并不总是有效等等。