Как получить вывод полиномов Лагранжа вместо его значения аппроксимации в алгоритме интерполяции Лагранжа? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть эта программа, которая дает мне вывод значения аппроксимации. Как я могу получить вывод его полиномов Лагранжа. Thx

x_points = eval(input('list of point : '))
y_points = eval(input('value : '))
eval_x = eval(input('point that you want to interpolate: '))

def LagrangePol(x,x_points,y_points):
    pol = 0                                                    
    n = len(x_points)                                          
    for k in range(n):
        L = 1                                                  
        for i in range(n):
            if i!=k:
                L*=((x-x_points[i])/(x_points[k]-x_points[i])) 
        pol += y_points[k]*L                                   
    return pol

y_aproks = LagrangePol(eval_x,titik_x,titik_y)

print('the approximation value of x = {0} is y = {1:.5f}'.format(eval_x,y_aproks))

1 Ответ

0 голосов
/ 06 ноября 2019

Может быть, вам понравится решение SymPy ?

from sympy import *

xi = [1, 2, 3, 5, 6]
yi = [10, 17, 8, 2, 4]
n = len(xi)
assert n == len(yi), "xi and yi need to be the same length"

x = Symbol('x', real=True)

lagrange_base = [prod([(x-xi[j])/(xi[i]-xi[j]) for j in range(n) if j != i ]) for i in range(n)]

lagrange = sum([yi[j] * lagrange_base[j] for j in range(n)])
#print(lagrange)
lagrange = simplify(lagrange)
print(lagrange)
print("for x=4: ", lagrange.subs(x, 4))

Это напечатает:

-31*x**4/60 + 491*x**3/60 - 2651*x**2/60 + 5401*x/60 - 87/2
for x=4:  11/10
...