Python 使用Numpy的多项式系数误差
我正在使用Python 使用Numpy的多项式系数误差,python,python-2.7,numpy,polynomial-math,polynomials,Python,Python 2.7,Numpy,Polynomial Math,Polynomials,我正在使用numpy.polynomy.polynomy.polynomy类(numpy库),以便使用方法fit()将某些数据拟合为多项式函数。得到的多项式是正确的,我可以绘制它并替换点,以得到“y”值,我得到正确的响应。问题是多项式类的.coef属性返回一组以某种方式规范化或更改的系数,我看不出是如何实现的。我是什么意思?守则如下: x_vid = array([0.0, 50.0, 75.0, 100.0]) y_vid = array([0.0, 30.0, 55.0, 100.0]) p
numpy.polynomy.polynomy.polynomy
类(numpy库),以便使用方法fit()
将某些数据拟合为多项式函数。得到的多项式是正确的,我可以绘制它并替换点,以得到“y”值,我得到正确的响应。问题是多项式
类的.coef
属性返回一组以某种方式规范化或更改的系数,我看不出是如何实现的。我是什么意思?守则如下:
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
我认为多项式函数可能是归一化的或移位的。我可能在这里面临的是一个数学问题,而不是一个编程问题,但任何帮助都是非常受欢迎的,因为我需要写下多项式,我不确定它的正确形式。谢谢
更多信息:
Ruips
您的示例存在三个问题:
pol(0)
像numpy.polyval
一样工作,但它没有。我真的不知道它是干什么的。该类提供了一个\uuuu调用
,这使得pol(0)
可以工作,但据我所知,没有可调用的文档(请参阅)numpy.polymonery.polymonery
包含自己版本的polyval
。我将一起测试它,np.polyval
和一个自制的版本test\u polyval
多项式
类对系数的排序不同于numpy.polyfit
和numpy.polyval
。在多项式中
,如您所述,最高阶系数是列表/数组中的最后一个。但是,在numpy
函数中,最高阶系数排在第一位(请参阅)多项式
对象表示的多项式,并且还说明了为了从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!'
多项式系数用于缩放和偏移多项式,以提高数值稳定性。如果用
off+scl*x
代替x
,则可以转换为“正常”多项式,或者直接使用序列,其中off
和scl
由pol.mapparms
返回。要转换为标准格式(不推荐),请执行pol.convert(domain=[-1,1])
是否尝试使用?此外,我得到的系数与你的系数不同,我的系数比你的系数大两个数量级。感谢@darthb这两种方法应该非常相似,不管怎样,多项式拟合得很好。问题是编写多项式函数的系数。我当时出于不同的原因修正了我除以100的两个数量级。我发现polyfit
返回的系数是合理的,y截距与polyval(pol,0)
的值相匹配。我不知道从polynomic.fit()方法返回的系数是什么。我还应该说,我在许多其他时间间隔(小于或大于[0100])上测试了两个polyval
实现的相等性,它在其他地方也可以工作。我认为多项式
类和numpy.polyfit
/numpy.polyval
在拟合方面存在差异,因为前者允许您指定计算剩余误差的范围。此外,我还找到了多项式.polyval
。它就在我眼前:[谢谢你完整的回答,但查尔斯·哈里斯的回答完全符合我的要求。完全正确!非常感谢查尔斯·哈里斯