【问题标题】:Polynomial returned by `lagrange` doesn't evaluate to the interpolated points`lagrange` 返回的多项式不计算为插值点
【发布时间】:2018-11-30 15:18:17
【问题描述】:

关于以下代码:

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 个点上插值函数 (fib) 创建多项式 P。因此,我希望P(n) == fib(n) 可以用于任何0 <= n < 64。相反,对于P(10),例如,我得到-248014823183360.0 而不是55 (fib(10))。我想这是某个地方的精度错误,但我不确定在哪里。如何构造满足这个期望的多项式函数P

【问题讨论】:

  • 来自the doc:警告:这个实现在数值上是不稳定的。即使选择最佳,也不要期望能够使用超过 20 点。

标签: python scipy polynomial-math


【解决方案1】:

你可以试试 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

除此之外,我想说多项式拟合很少是解决大量点的好方法。如果您对斐波那契数列感兴趣(或者它只是一个示例?),您可以使用基于黄金数幂的分析公式,您可以将其推导出为浮动指数(查看斐波那契维基百科页面)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多