J'ai appris l'interpolation de Lagrange dans une classe universitaire, donc je l'ai implémentée en Python.
L'interpolation de fonction consiste à dériver une fonction concaténée qui les relie à partir des points obtenus discrètement.
[Discret]
【Continu】
Lorsque les valeurs de xj et f (xj) sont définies comme des points de données connus pour j = 0,1,2… n
l_j(x) = \frac{(x-x_0)(x-x_1)…(x-x_{j-1})(x-x_{j+1})…(x-x_n)}{(x_j-x_0)(x_j-x_1)…(x_j-x_{j-1})(x_j-x_{j+1})…(x_j-x_n)}\\
P_n(x) = \sum_{j=0}^{n}f(x_j)l_j(x)
Ce sera comme ça. Le point important est de sauter le jth lors de la recherche de lj (x). (Parce que ce sera 0)
Ce sera comme suit.
Lagrange.py
import numpy as np
import matplotlib.pyplot as plt
def lagurange(x,xp,fx):
results = [];
for l in range(len(x)):
if(x[l] in xp):
results.append(fx[np.where(xp==x[l])])
else:
result=0
for j in range(len(xp)):
lag = lx(x[l],j,xp)
result += fx[j]*lag
results.append(result)
return results
def lx(x,j,xp):
numerator,denominator = 1,1
for i in range(len(xp)):
if(i!=j):
numerator *= x-xp[i]
denominator *= xp[j]-xp[i]
return numerator/denominator
def main():
xp = np.arange(-10,10,3)
fx = xp**3
x = np.floor(np.arange(-10,10,0.1)*10)/10
y = lagurange(x,xp,fx)
plt.plot(x,y)
plt.plot(xp,fx,"o")
plt.show()
if __name__ == '__main__':
main()
Je pense qu'il y a une manière d'écrire plus efficace car je l'ai implémentée telle quelle sans penser à quoi que ce soit primitivement. Dans ce programme, x de la fonction y = x ^ 3 est connu sous le nom de données en 3 incréments, et l'interpolation de Lagrange est effectuée dans la plage de x = -10 à 10 par incréments de 0,1.
Points de données connus
Après interpolation de Lagrange
Vous avez une approximation solide de y = x ^ 3.
Recommended Posts