使用Numpy的多项式的系数误差

时间:2014-09-05 16:24:47

标签: python python-2.7 numpy polynomial-math polynomials

我正在使用numpy.polynomial.polynomial.Polynomial类(Numpy库)以使方法fit()符合多项式函数的某些数据。获得的多项式是正确的,我可以绘制它并替换点以获得'y'值,并得到正确的响应。问题是.coef类的Polynomial属性返回一组以某种方式归一化或改变的系数,我不知道如何。我的意思是什么?代码如下:

x_vid = array([0.0, 50.0, 75.0, 100.0])
y_vid = array([0.0, 30.0, 55.0, 100.0])
pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!!
print  pol.coef

.coef属性返回下一个数组:

30   38.16   17.93   9.98    2.06   1.85

系数按升序排列,因此这些系数代表以下多项式函数:

  

30 + 38.16x + 17.93x ^ 2 + 9.98x ^ 3 + 2.06x ^ 4 + 1.85x ^ 5

然而,问题就出现了,如果我从我的值范围[0-100]中替换任何值,它将不会返回正确的值,尽管如果我这样做的话:

pol(0)→我会得到一个0,这是正常的,但很明显,在我写的多项式中,它不会在x = 0时返回0。

我认为多项式函数可能被归一化或移位。我可能在这里遇到一个数学问题,而不是编程问题,但任何帮助都非常受欢迎,因为我需要写下多项式,我不确定它的正确形式。感谢。

更多信息: http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.Polynomial.html#numpy.polynomial.polynomial.Polynomial

2 个答案:

答案 0 :(得分:1)

Ruips。

您的示例有三个问题:

  1. 您仅使用四个数据点拟合五阶多项式。这是一个不确定的情况,它可能会产生RankWarnings。但这是偶然的,而不是问题的主要部分。

  2. 您希望pol(0)的工作方式与numpy.polyval相同,但并非如此。{li>

    我实际上不确定它的作用。该类提供了__call__,这使得pol(0)可以工作,但据我所知,没有可调用的文档(请参阅Polynomial docs)。 numpy.polynomial.polynomial包含自己的polyval版本。我将测试它,np.polyval和自制版本test_polyval

  3. 最重要的是,Polynomial班级的系数与numpy.polyfitnumpy.polyval不同。在Polynomial中,如您所述,最高阶系数在列表/数组中是最后一个。但是,在numpy函数中,最高阶系数是第一个(参见polyval docs)。

  4. 下面的代码片段说明了如何在任意一组x值下评估Polynomial对象所表示的多项式,并且还显示为了从numpy.polyval中获得相同的行为,你必须使用coef[::-1]来反转系数的顺序。我可以等效地使用numpy.fliplr来反转系数顺序。

    import numpy as np
    from numpy.polynomial.polynomial import Polynomial,polyval
    from numpy import array
    import sys
    
    
    x_vid = array([0.0, 50.0, 75.0, 100.0])
    y_vid = array([0.0, 30.0, 55.0, 100.0])
    pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!!
    
    # I've written this, which should do what numpy.polynomial.polynomial.polyval 
    # does, as a sanity check:
    def test_polyval(polynomialInstance,xArray):
        # check that xArray is a numpy.ndarray, using ndarray.shape
        try:
            y = np.zeros(xArray.shape)
        except Exception as e:
            sys.exit('polyval error: %s'%e)
    
        # manually sum the polynomial terms on xArray
        for exp,c in enumerate(polynomialInstance.coef):
            y = y + c*x**exp
    
        return y
    
    # Define some random x values for testing, in the range of points used
    # for fitting:
    x = np.random.rand(100)*100
    
    # Compute, using our own polyval function, then Polynomial.polyval,
    # and finally using numpy.polyval, making sure to reverse the
    # coefficient order for the last:
    y_test_polyval = test_polyval(pol,x)
    y_Polynomial_polyval = polyval(x,pol.coef)
    y_numpy_polyval = np.polyval(pol.coef[::-1],x)
    
    # Make sure the two results are within machine epsilon:
    if np.allclose(y_test_polyval,y_numpy_polyval) and \
            np.allclose(y_test_polyval,y_Polynomial_polyval):
        print 'Hurray!'
    

答案 1 :(得分:1)

多项式系数用于缩放和偏移多项式,以提高数值稳定性。您可以转换为"正常"多项式,或者如果您将off + scl*x替换为xoff返回sclpol.mapparms,则直接使用该系列。要转换为标准表单(不推荐),请执行pol.convert(domain=[-1, 1])