Polynôme
Polynôme
J'ai une question sur les polynômes de Lagrange, est-il possible de vous la poser ?
En vous remerciant, très belle journée !
-
- Messages : 3501
- Enregistré le : ven. 25 nov. 2016 14:24
Re: Polynôme
tu peux poser ta question, un modérateur la regardera et te répondra.
SoS-math
Re: Polynôme
cool, merci !
L'exo est là : https://www.cjoint.com/data/JLjpsXK8vkV ... cembre.jpg
En gros, je bloque dès la question 1...
Comment faire ?
Je pense qu'il faut utiliser une boucle for puisqu'on est dans ce chapitre en ce moment, mais comment la placer ?
merci de l'aide !
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
il faut utiliser la formule donnant les polynômes de Lagrange puis la somme de ces polynômes.
Si on veut évaluer une telle approximation en une valeur x, avec une liste d'abscisse liste_x et une liste d'ordonnées liste_y, alors on peut écrire la fonction :
Code : Tout sélectionner
def Interpolation_Lagrange(x,liste_x,liste_y):
"""renvoie la valeur du polynôme d'interpolation de Lagrange aux points (liste_x[i], liste_[i]) à l'abscisse x"""
val = 0
for i in range(len(liste_x)):
produit = 1
for j in range(len(liste_x)):
if j != i:
produit = produit * (x-liste_x[j])/(liste_x[i]-liste_x[j])
val = val + produit*liste_y[i]
return val
Code : Tout sélectionner
import sympy
x, y, z, t = sympy.symbols('x y z t')
sympy.init_printing()
liste_x=[-2,1,5,4]
liste_y=[3,2,-3,1]
f = Interpolation_Lagrange(x,liste_x,liste_y)
Bonne continuation
Re: Polynôme
Du coup pour la deuxième question 1, comment faut-il s'y prendre ?
J'ai essayé d'appeler la fonction que vous m'avez montrée, mais je ne connais pas la syntaxe exacte pour faire ça.
Et pour tracer les interpolées, comment faire ? Surtout qu'on veut à des degrés différents...
Est-ce qu'il faut commencer comme ça ?
Code : Tout sélectionner
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-5,5,100)
Merci de l'aide bonne journée !
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
c'est une bonne idée d'utiliser linspace qui te permet de partager l'intervalle de travail en \(n\) intervalles grâce aux \(n+1\) points de la subdivision régulière. Cela te donnera une liste :
Code : Tout sélectionner
liste_x = numpy.linspace(debut,fin, degre+1)
Code : Tout sélectionner
liste_y = f(liste_x)
Code : Tout sélectionner
def interpolee(f,debut,fin,degre):
liste_x = numpy.linspace(debut,fin, degre+1)
liste_y = f(liste_x)
return sympy.expand(Interpolation_Lagrange(x,liste_x,liste_y))
Code : Tout sélectionner
interpolee(lambda x:1/(1+16*x)**2,-1,1,3)
Code : Tout sélectionner
from scipy.interpolate import lagrange
def interpolees_2(f,debut,fin,degre):
liste_x = numpy.linspace(debut,fin, degre+1)
liste_y = f(liste_x)
return lagrange(liste_x,liste_y)
Code : Tout sélectionner
interpolees_2(lambda x:1/(1+16*x)**2,-1,1,3)
- Fichiers joints
-
- lagrange_exemple_3.PNG (5.27 Kio) Vu 3889 fois
Re: Polynôme
Par contre, comment fait-on pour tracer les interpolées ? Il faut utiliser matplotlib ?
Je ne vois même pas ce qui est attendu graphiquement... :(
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
pour tracer les courbes interpolées, il faut effectivement utiliser matplotlib :
Code : Tout sélectionner
def courbe(f,debut,fin,degre,precision):
abscisses = numpy.linspace(debut,fin, precision)
plt.plot(abscisses,f(abscisses),color='blue')
liste_x = numpy.linspace(debut,fin, degre+1)
liste_y = numpy.array([Interpolation_Lagrange(abscisses[i],liste_x,f(liste_x)) for i in range(len(abscisses))])
plt.scatter(liste_x,f(liste_x), color="green")
plt.plot(abscisses,liste_y, color = "red")
plt.show()
Code : Tout sélectionner
courbe(lambda x:1/(2+x**2), 0.5,15,4,1000)
Re: Polynôme
Pour la question 2, sur l'écart, je sais que l'erreur absolue est : | valeur approchée - valeur réelle |.
Donc on devrait tracer :
Code : Tout sélectionner
abs(interpolee(f,debut,fin,degre)-f(x))
Ca me semble faux...
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
En effet, matplotlib trace une courbe en faisant des lignes brisées : on trace des segments entre des points et avec un grand nombre de points resserrés, on a l'impression que cela fait une courbe.
Donc il faut tracer uniquement cette courbe d'écart absolu, tu dois sûrement observer quelque chose de remarquable.
Bon tracé, tu as tout ce qu'il faut pour le faire.
Re: Polynôme
Code : Tout sélectionner
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace (−1,1,100)
y = abs(interpolee(f,debut,fin,degre)-1/(1+16*x)**2)
plt.plot (x,y)
Je pense que ce que j'ai écrit est faux mais je vois pas quoi mettre d'autre...
Merci !
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
Donc il faut attribuer des valeurs à f, par exemple reprendre \(f_3\).
L'objet fonction peut être déclaré en Python sous la forme d'une directive lambda :
Code : Tout sélectionner
lambda x : 1/(1+16*x)**2
Le degré est le degré du polynôme d'interpolation de Lagrange qui donne aussi le nombre de points d'interpolation : pour interpoler une fonction avec \(n\) points, il faut des polynômes de Lagrange de degré \(n-1\).
Reprends cela avec précision, c'est essentiel pour que tu comprennes le TP.
Re: Polynôme
Alors est-ce que ça irait ce que j'ai écrit en dessous ?
Code : Tout sélectionner
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace (−1,1,100)
y = abs(interpolee(1/(1+16*x)**2,-1,1,degre)-1/(1+16*x)**2)
plt.plot (x,y)
-
- Messages : 10388
- Enregistré le : lun. 30 août 2010 11:15
Re: Polynôme
Le code ci-dessous fonctionne :
Code : Tout sélectionner
f = lambda x:1/(1+16*x)**2
abscisses = numpy.linspace(-1,1,1000)
liste_x = numpy.linspace(-1,1, 5)
ecart = numpy.array([abs(Interpolation_Lagrange(abscisses[i],liste_x,f(liste_x))-f(abscisses[i])) for i in range(len(abscisses))])
plt.plot(abscisses,ecart,color='red')
Code : Tout sélectionner
def ecart_absolu(f,debut,fin,degre,precision):
abscisses = numpy.linspace(debut,fin, precision)
#plt.plot(abscisses,f(abscisses),color='blue')
liste_x = numpy.linspace(debut,fin, degre+1)
ecart = numpy.array([abs(Interpolation_Lagrange(abscisses[i],liste_x,f(liste_x))-f(abscisses[i])) for i in range(len(abscisses))])
plt.plot(abscisses,ecart,color='red')
plt.show()
return max(ecart)
Code : Tout sélectionner
ecart_absolu(lambda x:1/(1+16*x)**2, -1,1,4,1000)
Ce phénomène s'appelle le phénomène de Runge : https://fr.wikipedia.org/wiki/Ph%C3%A9nom%C3%A8ne_de_Runge.