Polynôme

Retrouver tous les sujets résolus.
Mathilde

Polynôme

Message par Mathilde » mer. 9 déc. 2020 11:45

Bonjour

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 !
SoS-Math(33)
Messages : 3480
Enregistré le : ven. 25 nov. 2016 14:24

Re: Polynôme

Message par SoS-Math(33) » mer. 9 déc. 2020 14:01

Bonjour Mathilde,
tu peux poser ta question, un modérateur la regardera et te répondra.
SoS-math
Invité

Re: Polynôme

Message par Invité » mer. 9 déc. 2020 16:20

bonjour,

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 !
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » jeu. 10 déc. 2020 22:35

Bonjour,
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
Si tu veux ensuite avoir une écriture symbolique comme une fonction, tu appelles la bibliothèque sympy :

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)
Ce qui donne dans cet exemple :
lagrange_exemple.PNG
lagrange_exemple.PNG (6.59 Kio) Vu 3449 fois
En espérant répondre à la question.
Bonne continuation
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 11:24

Oui, merci beaucoup, c'est super bien expliqué !

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)
Après je ne sais pas quoi écrire...

Merci de l'aide bonne journée !
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » ven. 11 déc. 2020 11:56

Bonjour,
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)
Il faut ensuite calculer les images de chacun de ces points

Code : Tout sélectionner

liste_y = f(liste_x)
Et calculer polynôme de Lagrange associé et on met tout cela dans une fonction :

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))
L'appel pour ton exemple, avec le degré 3 entre -1 et 1 se fait :

Code : Tout sélectionner

interpolee(lambda x:1/(1+16*x)**2,-1,1,3)
donne :
lagrange_exemple_2.PNG
lagrange_exemple_2.PNG (7.98 Kio) Vu 3442 fois
Ce qui est conforme avec l'appel de la fonction toute faite dans scipy :

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)
l'appel suivant :

Code : Tout sélectionner

interpolees_2(lambda x:1/(1+16*x)**2,-1,1,3)
donnera :
lagrange_exemple_2.PNG
lagrange_exemple_2.PNG (7.98 Kio) Vu 3442 fois
Bonne continuation
Fichiers joints
lagrange_exemple_3.PNG
lagrange_exemple_3.PNG (5.27 Kio) Vu 3442 fois
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 12:09

Merci beaucoup, j'ai compris tout ce que vous avez expliqué. C'est intéressant !

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... :(
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » ven. 11 déc. 2020 15:02

Bonjour,
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()
l'appel

Code : Tout sélectionner

courbe(lambda x:1/(2+x**2), 0.5,15,4,1000)
donne
lagrange_exemple_4.PNG
Bons tracés
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 15:12

Ah oui, sur mon Pyzo aussi ça fonctionne !

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...
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » ven. 11 déc. 2020 15:28

Oui, il faut tracer cette différence, en prenant les points du tableau abscisses comme référence.
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.
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 16:37

OK, alors voici ce que je propose :

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)
Mais à la ligne y je dois mettre quoi pour "f", "debut", "fin", et "degre" ?
Je pense que ce que j'ai écrit est faux mais je vois pas quoi mettre d'autre...

Merci !
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » ven. 11 déc. 2020 18:35

Une fonction Python ne produira un résultat que si tu lui passes des arguments.
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
Ton début et ta fin sont les bornes de ton intervalle soit \(-1\) et \(1\).
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.
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 18:47

D'accord merci je comprends mieux.

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)
Par contre pour le degré on choisirait quoi ici ? Je comprends pas trop ça...
sos-math(21)
Messages : 10334
Enregistré le : lun. 30 août 2010 11:15

Re: Polynôme

Message par sos-math(21) » ven. 11 déc. 2020 19:00

Il te manque le degré : il faut le préciser.
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')
On peut encore faire mieux et l'encapsuler dans une fonction qui renvoie en plus l'écart maximal entre les polynomes de Lagrange et la fonction sur l'ensemble des points de la liste abscisses :

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)
On a alors en appelant :

Code : Tout sélectionner

ecart_absolu(lambda x:1/(1+16*x)**2, -1,1,4,1000)
lagrange_exemple_6.PNG
qui montre un écart maximal de 12320, ce qui est n'est pas normal pour un polynôme qui est censé approcher la fonction.
Ce phénomène s'appelle le phénomène de Runge : https://fr.wikipedia.org/wiki/Ph%C3%A9nom%C3%A8ne_de_Runge.
Invité

Re: Polynôme

Message par Invité » ven. 11 déc. 2020 19:07

D'accord merci ! Et vous avez une idée des raisons pour lesquels ce phénomène de Runge se produit ?
Répondre