Полином, возвращаемый `lagrange`, не оценивает интерполированные точки - PullRequest
0 голосов
/ 30 ноября 2018

Для следующего кода:

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 для создания полинома P из интерполяции функции (fib) по 64 точкам.Таким образом, я ожидаю, что P(n) == fib(n) для любого 0 <= n < 64.Например, вместо P(10) вместо 55 (fib(10)) я получаю -248014823183360.0.Я предполагаю, что это ошибка точности где-то, но я не уверен, где.Как я могу построить полиномиальную функцию P, которая удовлетворяет этому ожиданию?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете попробовать 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

Более того, ясказал бы, что полиномиальное соответствие редко является хорошим решением для большого количества точек.Если вас интересует серия Фибоначчи (или это просто пример?), Вы можете использовать аналитическую формулу, основанную на степенях золотого числа, которые вы можете получить для плавающих индексов (см. Страницу Википедии Фибоначчи).

...