lagrange返回的多项式不会求出插值点

时间:2018-11-30 15:18:18

标签: python scipy polynomial-math

使用以下代码:

import numpy as np
from scipy.interpolate import lagrange
def fib(n):
     a, b = 0, 1
     for _ in range(n):
         a, b = b, a+b
     return a
x = np.array(range(64))
y = np.array([fib(n) for n in xrange(64)])
P = lagrange(x, y)
print P(10)

我使用scipy通过在64点上插值函数(P)来创建多项式fib。因此,我希望P(n) == fib(n)等于0 <= n < 64。相反,例如对于P(10),我得到-248014823183360.0而不是55fib(10))。我想这是某处的精度错误,但我不确定在哪里。如何构造满足此期望的多项式函数P

1 个答案:

答案 0 :(得分:0)

您可以尝试numpy.polyfit,它在较高的多项式秩上更稳定

import numpy as np
from scipy.interpolate import lagrange

N = 30

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a+b
    return a


x = np.arange(N)
y = np.array([fib(i) for i in x])


P = np.polyfit(x, y, N)

n = int(N/2)
print ((y[n], np.polyval(P, n))) 

L = lagrange(x, y)
print ((y[n], L(n)))

610,609.9896

610,-645662.4698

在此之上,我想说多项式拟合在很多点上很少是一个好的解决方案。如果您对斐波那契数列感兴趣(或者仅是一个示例?),则可以使用基于可以导出为浮动指数的黄金数的幂的分析公式(请查看斐波那契Wikipedia页面)。