приведу барицентрическую формулу:
где
1. Как лучше составить алгоритм вычисления интерполянты?
Есть обычная формула, которая приведена в википедии и барицентрическая. Я написал код по одной и другой формуле. При вычислении иногда возникают выбросы большой величины, как-будто происходит деление на величину близкую к нулю. Код такой:
Код: Выделить всё
def bf(t):
D=[]; d=0; interpolyant=[]; ZZ=[]
while d<len(t)-1:
C=0; Z=0
for j in range(0,len(t)):
Aj=1
for i in range(0,len(t)):
try:
#if j<>i:
Aj*=1./(j-i)
#else: pass
except ZeroDivisionError: pass
#try:
if d<>j:
C+=(Aj*t[j])/(d-j)
Z+=Aj/(d-j)
else:
Z=1; C=t[j]; break
#except ZeroDivisionError: pass
interpolyant.append(C/Z)
D.append(d)
ZZ.append(Z)
d+=0.1
return D, interpolyant, ZZ
то есть эти выбросы происходят, когда в знаменателе дроби одинаковые слагаемые, то есть деление на нуль. Как обычно поступают в таких ситуациях?
Где можно посмотреть алгоритм (код) вычисления полинома Лагранжа?
2. Применяется ли интерполирование таким способом на практике? В статье на экспоненте утверждается, что с увеличением числа точек растут как вычислительные трудности, так и ошибка интерполирования и поэтому на практике вроде как не применяется.