废墟。
您的示例存在三个问题:
您正在拟合只有四个数据点的五阶多项式。这是一个不确定的情况,它可能会产生 RankWarnings。不过,这是偶然的,而不是您问题的主要部分。
您希望pol(0)
像 一样工作numpy.polyval
,但事实并非如此。我实际上不确定它的作用。该类提供了 a __call__
,它可以pol(0)
工作,但据我所知,没有可调用的文档(请参阅Polynomial docs)。numpy.polynomial.polynomial
包含自己的polyval
. 我将对其进行测试,np.polyval
并与自制版本test_polyval
一起测试。
最重要的是,Polynomial
类对系数的排序与numpy.polyfit
和不同numpy.polyval
。正如您所描述的,在Polynomial
列表/数组中,最高阶系数位于最后。但是,在numpy
函数中,最高阶系数是第一位的(请参阅polyval 文档)。
下面的代码片段说明了如何Polynomial
在任意一组 x 值处评估由您的对象表示的多项式,并且还表明为了从 中获得相同的行为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!'