** Führen Sie die Interpolation mit der Lagrange-Methode zur Interpolation von Scipy durch. ** **.
** Interpoliere einen gegebenen N + 1-Datensatz ($ x_i $, $ y_i $) (i = 0,2, 3, ..., N) durch ein Polynom n-ter Ordnung ([Lagrange-Interpolation](https :: //ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B0%E3%83%A9%E3%83%B3%E3%82%B8%E3%83%A5%E8%A3 % 9C% E9% 96% 93)) Implementieren Sie das Programm in Python3. ** **.
Betrachten Sie als Beispiel $ y = 1 / (1 + x ^ 2)
Code 1: Verwenden Sie scipy / numpy. Minimaler Code (** Klicken Sie hier, wenn Sie es eilig haben **) Code 2: Berechnen Sie die Interpolationskoeffizienten im Code. Klicken Sie hier, um die Methode zu studieren.
Code(1)scipyを利用してラクをするCode。
from scipy.interpolate import lagrange
import numpy as np
import matplotlib.pyplot as plt
##Maine
x =np.linspace(-5,5,num=11) #[-5,5]Teilen Sie den Bereich von in 11 gleiche Teile und speichern Sie in x
y = 1.0/(1.0+x**2) #Die in diesem Beispiel betrachtete Funktion y= 1/(1+x^2)Definieren
f_Lag=lagrange(x,y) #scipy.interpolate.Ausführung der Lagrange-Interpolation durch Lagrange
##
#for plot
xnew =np.linspace(-5,5,num=51) # [-5,5]Teilen Sie den Bereich von in 51 gleiche Teile und speichern Sie ihn in xnew
plt.plot(x, y, 'o', xnew, f_Lag(xnew), '-') #Rohdaten"o"Also die Linie, die Lagrange ist, interpoliert('-')Malen mit.
plt.legend(['Raw data','Lagrange'], loc='best') #Spezifikation der Legende
plt.xlim([-6, 6]) #x-Achsen-Plotbereich
plt.ylim([0, 1.4]) #y-Achsen-Plotbereich
plt.show()
11 Datenpunkte werden blau abgetastet. Die orange Linie ist Lagrange interpoliert.
Code(2)Code中に直接数値計算を実行する
"""
Interpolation: ラグランジュInterpolation
Beispiel: y = 1/(1+x**2):Sektion-11 Punkte von 5 bis 5 werden abgetastet und Lagrange interpoliert.
"""
from math import pi,e, log, factorial
import matplotlib.pyplot as plt
###
def g(i, x): #Berechnung des Lagrange-Interpolationskoeffizienten. Maine.
dum=1.0
for j in range(len(x_lis)):
if j != i :
dum *= (x-x_lis[j])/(x_lis[i]-x_lis[j])
return dum
#
def fLag(x,m): #Lagrange-Interpolation
dum=0.0
for j in range(m):
dum += y_lis[j]*g(j, x)
return dum
###
##Datensatzaufbau für das Beispiel
m = 11 # x= -11-Punkt-Probenahme in regelmäßigen Abständen von 5 bis 5
x_lis = []
y_lis = []
def yy(x):
return 1/(1+x**2) #Beispielfunktion y= 1/(1+x**2)
for k in range(m):
xm = -5.0 + 10.0*k / m
x_lis.append(xm)
y_lis.append(yy(xm))
plt.plot(x_lis,y_lis, 'o',label='Row data')
##
###Ausführung der Lagrange-Interpolation
mm = 5000
y_Laglis = []
xx_lis = []
for k in range(mm):
xm = -5.0 + 10.0*k / mm
xx_lis.append(xm)
y_lis_exact=[]
for j in range(mm):
y_Laglis.append(fLag(xx_lis[j],m))
y_lis_exact.append(yy(xx_lis[j]))
#plot
plt.grid(True)
plt.xlabel('x',fontsize=24)
plt.ylabel('f(x)',fontsize=24)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.plot(xx_lis,y_Laglis, color='Red',label='Lagrange')
plt.plot(xx_lis,y_lis_exact, color='Black',label='Exact')
plt.legend(loc='upper left')
plt.show()¥
11 Datenpunkte werden blau abgetastet. Die rote Linie ist Lagrange interpoliert. Die schwarze Linie repräsentiert die genaue Lösung.
** Wenn die Reihenfolge (Datenpunkte) erhöht wird, wird die Annäherung des zentralen Teils besser, aber die Annäherung des Teils in der Nähe beider Enden wird schlechter. Es ist als Beispiel bekannt, bei dem der Fehler mit zunehmender Reihenfolge zunimmt und schließlich gegen unendlich abweicht. Dies ist auf die Verwendung gleichmäßig verteilter Trennpunkte zurückzuführen, und es ist bekannt, dass dies vermieden werden kann, indem die Koordination der Trennpunkte nahe der Mitte rau und an beiden Enden fein gemacht wird [1]. ** **.
** Für Intervall [-1,1]: Wenn der Definitionsbereich von $ f (x) $ analysiert und mit der komplexen Ebene verbunden wird, beträgt seine Singularität $ z $ **
** Trifft nicht **.
In diesem Beispiel beträgt die Singularität z von $ f (z) = 1 / (1 + z ^ 2) $ $ ± i $.
Die rechte Seite der Ungleichung ist $ 4e ^ \ pi = 92.562770531 ...
Wenn f (x) eine stetige Funktion im Intervall [a, b] ist, nähert sich der Interpolationspolymorphismus f (x) an der Grenze, an der N unendlich ist, wenn der Teilungspunkt $ x_n $ wie folgt ausgewählt wird [2]. ..
Darüber hinaus tritt das oben gezeigte Rung-Phänomen bei der polymorphen Interpolation nicht auf, bei der der Nullpunkt eines orthogonalen Polynoms (z. B. Chebisif-Polynom) als Teilungspunkt ausgewählt wird [1].
[1] Masatake Mori, ["Numerical Analysis Second Edition"](https://www.amazon.co.jp/%E6%95%B0%E5%80%A4%E8%A7%A3%E6%9E % 90-% E5% 85% B1% E7% AB% 8B% E6% 95% B0% E5% AD% A6% E8% AC% 9B% E5% BA% A7-% E6% A3% AE-% E6% AD% A3% E6% AD% A6 / dp / 4320017013), Kyoritsu Publishing, 2002. [2] Masao Iri und Kazutake Fujino, ["Allgemeines Wissen über numerische Berechnungen"](https://www.amazon.co.jp/%E6%95%B0%E5%80%A4%E8%A8%88 % E7% AE% 97% E3% 81% AE% E5% B8% B8% E8% AD% 98-% E4% BC% 8A% E7% 90% 86-% E6% AD% A3% E5% A4% AB / dp / 4320013433), Kyoritsu Publishing, 1985.
Recommended Posts