[Calcul scientifique / technique par Python] Interpolation de Lagrange, calcul numérique

introduction

** Effectuer une interpolation en utilisant la méthode lagrange d'interpolation de scipy. ** **

** Interpoler un jeu de données N + 1 donné ($ x_i $, $ y_i $) (i = 0,2, 3, ..., N) par polynôme d'ordre N ([Interpolation de Lagrange](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)) Implémentez le programme en Python3. ** **

Considérez $ y = 1 / (1 + x ^ 2) $ comme exemple. Échantillonnez un ensemble de données à 11 points ($ x_i $, $ y_i $) et interpolez-le avec un polynôme d'ordre 10. Cette fonction ne fonctionne pas avec l'interpolation de Lagrange [phénomène Runge](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%B3%E3%82%B2%E7%8F%BE%E8 Il est connu comme un exemple de cause de% B1% A1).


Contenu

Code 1: utilisez scipy / numpy. Code minimal (** Cliquez ici si vous êtes pressé **) Code 2: Calculez les coefficients d'interpolation dans le code. Cliquez ici pour étudier la méthode.


Code de calcul (1): utilisez scipy / numpy

code(1)scipyを利用してラクをするcode。


from scipy.interpolate import lagrange
import numpy as np
import matplotlib.pyplot as plt

##Principale
x =np.linspace(-5,5,num=11) #[-5,5]Divisez la plage de en 11 parties égales et stockez-la en x
y = 1.0/(1.0+x**2)          #La fonction considérée dans cet exemple, y= 1/(1+x^2)Définir
f_Lag=lagrange(x,y) #scipy.interpolate.Exécution d'interpolation de Lagrange par lagrange
##

#for plot
xnew =np.linspace(-5,5,num=51) # [-5,5]Divisez la gamme de en 51 parties égales et stockez-la dans xnew
plt.plot(x, y, 'o',  xnew, f_Lag(xnew), '-')   #Données brutes"o"Donc, la ligne qui est interpolée par Lagrange('-')Dessinez avec.
plt.legend(['Raw data','Lagrange'], loc='best')  #spécification de la légende
plt.xlim([-6, 6])  #plage de tracé de l'axe des x
plt.ylim([0, 1.4]) #plage de tracé de l'axe y
plt.show()

Résultat (1)

t.png

11 points de données échantillonnés en bleu. La ligne orange est interpolée de Lagrange.


Code de calcul (2) Calculer le coefficient d'interpolation avec python

code(2)code中に直接数値計算を実行する



"""
interpolation: ラグランジュinterpolation
exemple: y = 1/(1+x**2):Section-11 points de 5 à 5 sont échantillonnés et Lagrange interpolés.
"""
from math import pi,e, log, factorial
import matplotlib.pyplot as plt


### 
def g(i, x): #Calcul du coefficient d'interpolation de Lagrange. Principale.
    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): #Interpolation de Lagrange
    dum=0.0
    for j in range(m):
        dum += y_lis[j]*g(j, x)
    
    return dum
###
    
##Construction du jeu de données pour l'exemple
m = 11  #  x= -Échantillonnage en 11 points à intervalles réguliers de 5 à 5
x_lis = []
y_lis = []
def yy(x):
    return 1/(1+x**2) #Exemple de fonction 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')
##

###Exécution d'interpolation de Lagrange
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()¥

Résultat (2)

Lag.png

11 points de données échantillonnés en bleu. La ligne rouge est interpolée de Lagrange. La ligne noire représente la solution exacte.

** Au fur et à mesure que l'ordre (points de données) augmente, l'approximation de la partie centrale devient meilleure, mais l'approximation de la partie près des deux extrémités devient pire. Il est connu comme un exemple dans lequel l'erreur augmente à mesure que l'ordre augmente et diverge finalement vers l'infini. Ceci est dû à l'utilisation de points de division régulièrement espacés, et il est connu que cela peut être évité en rendant la coordination des points de division approximative près du centre et finement divisée aux deux extrémités [1]. ** **


Addendum: Conditions pour une interpolation de Lagrange régulièrement espacée pour se rapprocher de la fonction d'origine f (x) lorsque le score augmente.

** Pour l'intervalle [-1,1]: Lorsque la zone de définition de $ f (x) $ est analysée et connectée au plan complexe, sa singularité $ z $ est **

|(1+z)^{1+z}| \leqq 4 e^{\pi |Im(z)|}

** Ne répond pas **. Dans cet exemple, la singularité z de $ f (z) = 1 / (1 + z ^ 2) $ est $ ± i $. Le côté droit de l'inégalité est $ 4e ^ \ pi = 92,562770531 ... , Le côté gauche est|(1+i)^{1+i}| = 0.644793...$ Par conséquent, puisque l'inégalité ci-dessus est ** satisfaite **, l'erreur d'interpolation de Lagrange (interpolation polypolymétrique) utilisant des points de division régulièrement espacés augmente à mesure que le nombre de points de division augmente.

Si f (x) est une fonction continue dans l'intervalle [a, b], le polymorphisme d'interpolation s'approche de f (x) à la limite où N est infini si le point de division $ x_n $ est sélectionné comme suit [2]. ..

x_n = (a+b)/2 + (b-a)(sin(-\pi/2+n\pi/N))/2, $(n = 0, 1, 2, ...,N) $

De plus, le phénomène de Rung comme vu ci-dessus ne se produit pas dans l'interpolation polymorphe dans laquelle le point zéro d'un polynôme orthogonal (par exemple, le polynôme de Chebisif) est choisi comme point de division [1].

Les références

[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 et Kazutake Fujino, ["Connaissances communes du calcul numérique"](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

[Calcul scientifique / technique par Python] Interpolation de Lagrange, calcul numérique
[Calcul scientifique / technique par Python] Calcul de somme, calcul numérique
[Calcul scientifique / technique par Python] Interpolation spline de troisième ordre, scipy
[Calcul scientifique / technique par Python] Intégration Monte Carlo, calcul numérique, numpy
[Calcul scientifique / technique par Python] Intégration numérique, loi trapézoïdale / Simpson, calcul numérique, scipy
[Calcul scientifique / technique par Python] Résolution d'équations linéaires simultanées, calcul numérique, numpy
[Calcul scientifique / technique par Python] Marche aléatoire 2D (problème de marche ivre), calcul numérique
[Calcul scientifique / technique par Python] Calcul de matrice inverse, numpy
[Calcul scientifique / technique par Python] histogramme, visualisation, matplotlib
[Calcul scientifique / technique par Python] Graphique logistique, visualisation, matplotlib
[Calcul scientifique / technique par Python] Graphique de coordonnées polaires, visualisation, matplotlib
[Calcul scientifique / technique par Python] Résolution de l'équation différentielle ordinaire du second ordre par la méthode Numerov, calcul numérique
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
[Calcul scientifique / technique par Python] Fonctionnement de base du tableau, numpy
[Calcul scientifique / technique par Python] Exemple de visualisation de champ vectoriel, champ magnétique électrostatique, matplotlib
[Calcul scientifique / technique par Python] Solution numérique d'une équation différentielle ordinaire du second ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Liste des matrices qui apparaissent dans Hinpan en algèbre linéaire numérique
[Calcul scientifique / technique par Python] Solution numérique d'un problème d'oscillateur harmonique unidimensionnel par vitesse Méthode de Berle
[Calcul scientifique / technique par Python] Solution numérique du problème des valeurs propres de la matrice par multiplication de puissance, algèbre linéaire numérique
[Calcul scientifique / technique par Python] Ajustement par fonction non linéaire, équation d'état, scipy
[Calcul scientifique / technique par Python] Calcul du produit de la matrice par l'opérateur @, python3.5 ou supérieur, numpy
[Calcul scientifique / technique par Python] Résolution d'équations différentielles ordinaires, formules mathématiques, sympy
Interpolation de Lagrange en python
Calcul numérique avec Python
[Calcul scientifique / technique par Python] Résolution de problèmes de valeurs propres (généralisés) en utilisant numpy / scipy, en utilisant des bibliothèques
[Calcul scientifique / technique par Python] Dessin d'animation de mouvement parabolique avec locus, matplotlib
[Calcul scientifique / technique par Python] Solution analytique sympa pour résoudre des équations
[Calcul scientifique / technique par Python] Tracer, visualiser, matplotlib des données 2D avec barre d'erreur
[Calcul scientifique / technique par Python] Dessin de surface courbe 3D, surface, fil de fer, visualisation, matplotlib
[Calcul scientifique / technique par Python] Résolution de l'équation de Newton unidimensionnelle par la méthode Runge-Kutta du 4ème ordre
[Calcul scientifique / technique par Python] Résolution du problème de la valeur aux limites des équations différentielles ordinaires au format matriciel, calcul numérique
[Calcul scientifique / technique par Python] Tracé, visualisation, matplotlib de données 2D lues à partir d'un fichier
[Calcul scientifique / technique par Python] Dessin, visualisation, matplotlib de lignes de contour 2D (couleur), etc.
[Calcul scientifique / technique par Python] Solution numérique d'équations d'ondes unidimensionnelles et bidimensionnelles par méthode FTCS (méthode explicite), équations aux dérivées partielles bi-courbes
[Calcul scientifique / technique par Python] Solution numérique d'équations différentielles ordinaires du premier ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Liste des utilisations des fonctions (spéciales) utilisées en physique en utilisant scipy
[Calcul scientifique et technique par Python] Dessin de figures fractales [Triangle de Shelpinsky, fougère de Bernsley, arbre fractal]
[Calcul scientifique / technique par Python] Vague "gémissement" et vitesse de groupe, superposition des vagues, visualisation, physique du lycée
[Calcul scientifique / technique par Python] Simulation de Monte Carlo par la méthode metropolis de la thermodynamique du système de spin ascendant 2D
Calcul scientifique / technique avec Python] Dessin et visualisation d'isoplans 3D et de leurs vues en coupe à l'aide de mayavi
Créer un nouveau projet de calcul numérique Python
[Calcul scientifique / technique par Python] Dérivation de solutions analytiques pour équations quadratiques et cubiques, formules, sympy
[Calcul scientifique / technique par Python] Solution numérique de l'équation de Laplace-Poisson bidimensionnelle pour la position électrostatique par la méthode Jacobi, équation aux dérivées partielles elliptiques, problème des valeurs aux limites
[Calcul scientifique / technique par Python] Solution numérique d'une équation de conduction thermique non stationnaire unidimensionnelle par méthode Crank-Nicholson (méthode implicite) et méthode FTCS (méthode de solution positive)
[Calcul scientifique / technique par Python] Résolution de l'équation de Schrödinger unidimensionnelle à l'état stationnaire par méthode de tir (1), potentiel de type puits, mécanique quantique
Interpolation d'images vidéo par apprentissage en profondeur, partie 1 [Python]
Calcul des indicateurs techniques par TA-Lib et pandas
[Calcul scientifique / technique par Python] Génération de nombres aléatoires non uniformes donnant une fonction de densité de probabilité donnée, simulation Monte Carlo
[Calcul scientifique / technique par Python] Résolution d'une équation de Schrödinger unidimensionnelle en régime permanent par méthode de tir (2), potentiel d'oscillateur harmonique, mécanique quantique
[Python] Calcul numérique d'une équation de diffusion thermique bidimensionnelle par méthode ADI (méthode implicite de direction alternative)
Calcul numérique du fluide compressible par la méthode des volumes finis
Démarrer le calcul numérique avec Python (avec Homebrew et pip)