Ich habe in einer Universitätsklasse etwas über die Lagrange-Interpolation gelernt und sie in Python implementiert.
Die Funktionsinterpolation besteht darin, eine verkettete Funktion abzuleiten, die sie aus den diskret erhaltenen Punkten verbindet.
[Diskret]
【Kontinuierlich】
Wenn die Werte von xj und f (xj) als bekannte Datenpunkte für j = 0,1,2… n gesetzt werden
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)
Es wird so sein. Der wichtige Punkt ist, das j-te zu überspringen, wenn lj (x) gefunden wird. (Weil es 0 sein wird)
Es wird wie folgt sein.
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()
Ich denke, es gibt eine effizientere Art zu schreiben, weil ich sie so implementiert habe, wie sie ist, ohne primitiv über irgendetwas nachzudenken. In diesem Programm ist x der Funktion y = x ^ 3 als Daten in 3 Schritten bekannt, und die Lagrange-Interpolation wird im Bereich von x = -10 bis 10 in Schritten von 0,1 durchgeführt.
Bekannte Datenpunkte
Nach Lagrange-Interpolation
Sie haben eine feste Näherung von y = x ^ 3.
Recommended Posts