首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Numpy的多项式系数误差

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

Stack Overflow用户
提问于 2014-09-05 16:24:47
回答 2查看 3K关注 0票数 2

我使用numpy.polynomial.polynomial.Polynomial类(Numpy库)来将fit()某些数据拟合成一个多项式函数。得到的多项式是可以的,我可以绘制它并替换点,以得到‘y’值,并且得到正确的响应。问题是,.coef类的Polynomial属性返回一组系数,这些系数在某种程度上被规范化或改变了,我不知道怎么回事。我什么意思?守则如下:

代码语言:javascript
复制
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属性返回下一个数组:

代码语言:javascript
复制
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) x=0将得到一个0,这是可以的,但是现在可以看到,在我编写的多项式中,它不会在x=0返回0。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-07 17:45:04

多项式系数用于改进数值稳定性的标度多项式和偏移多项式。如果将off + scl*x替换为x,则可以将其转换为“正常”多项式,或者直接使用该系列,其中offsclpol.mapparms返回。若要转换为标准形式(而不是推荐格式),请执行pol.convert(domain=[-1, 1])

票数 4
EN

Stack Overflow用户

发布于 2014-09-05 22:31:01

鲁普斯。

您的示例有三个问题:

  1. 你只需要用四个数据点来拟合五阶多项式。这是一个缺乏决心的例子,很可能会产生RankWarnings。不过,这是偶然的,而不是你问题的主要部分。
  2. 你希望pol(0)numpy.polyval那样工作,但它没有,我不知道它能做什么。该类提供了一个__call__,它使pol(0)工作,但据我所知,没有可调用的文档(参见多项式文档)。numpy.polynomial.polynomial包含自己版本的polyval。我将测试它,np.polyval和自制版本test_polyval在一起。
  3. 最重要的是,Polynomial类对系数的排序不同于numpy.polyfitnumpy.polyval。在Polynomial中,正如您所描述的,最高阶系数是列表/数组中的最后一个。然而,在numpy函数中,最高阶系数是第一个(参见多管齐下)。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25690202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档