使用以下代码:
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
而不是55
(fib(10)
)。我想这是某处的精度错误,但我不确定在哪里。如何构造满足此期望的多项式函数P
?
答案 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页面)。