Polynôme

Répondre


Aide syntaxe LaTeX
Les BBCodes sont activés
[img] est désactivé
[flash] est désactivé
[url] est activé
Les smileys sont désactivés

Revue du sujet
   

Si vous souhaitez joindre un ou plusieurs fichiers, complétez les indications suivantes.

Étendre la vue Revue du sujet : Polynôme

Re: Polynôme

par sos-math(21) » sam. 16 janv. 2021 10:13

Bonjour,
oui c'est possible, on te répondra si on peut.
À bientôt

Re: Polynôme

par Invité » ven. 15 janv. 2021 22:27

bonjour, possible de vous poser une dernière question rapide ?

Re: Polynôme

par sos-math(21) » mer. 13 janv. 2021 16:06

Bonjour,
avec ce code,

Code : Tout sélectionner

import numpy
import math
import matplotlib.pyplot as plt

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



f = lambda x:1/(1+16*x**2)
abscisses = numpy.linspace(-1,1,1000)
degre = 10 # degré du polynôme qui va imposer 11 points d'interpolation
debut = -1
fin = 1
precision = 1000 # cela correspond aux points que l'on va prendre pour tracer les # liste de la nouvelle subdivision avec les abscisses de Tchebychev
liste_x = numpy.array([(debut+fin)/2 + ((fin-debut)/2)*math.cos((2*k-1)*(numpy.pi)/degre+1) for k in range(1, degre+2)])
# liste des écarts entre le polynôme et la fonction interpolée, avec la nouvelle subdivision
ecart = numpy.array([abs(Interpolation_Lagrange(abscisses[i],liste_x,f(liste_x))-f(abscisses[i])) for i in range(len(abscisses))])
# tracé
plt.plot(abscisses,ecart,color='red')
plt.show()
Cela fonctionne et donne le graphique suivant :
Figure_1.png
Bonne continuation

Re: Polynôme

par Invité » mer. 13 janv. 2021 15:41

Bonjour

bonne année 2021 !

en prévision d'un DS j'ai repris ce sujet et il y a quelque chose qui me pose problème.

Ici, j'ai une erreur : https://www.cjoint.com/data/KAnoNVNQWy4_bug.png

D'où vient cette erreur ? Qu'avez-vous comme script pour qu'il n'y ait pas cette erreur ?
C'est sur la liste abscisses je pense...

Merci d'avance de la réponse !

(en dessous la réponse que vous m'aviez envoyée)
sos-math(21) a écrit :
sam. 12 déc. 2020 18:33
Bonjour,
on reprend :
tu as besoin d'une liste liste_x qui correspond aux points de la subdivision : pour un polynôme d'interpolation de degré \(n\), cette liste contient \(n+1\) points
tu as besoin d'une liste d'images liste_y qui sont les images des points : les polynômes et la fonction de départ coïncident en ces points.
Ensuite pour tracer les courbes, avec matplotlib, tu as besoin d'une liste d'abscisses et de l'image de cette liste par la fonction mais aussi de l'image de cette liste par le polynôme afin de pouvoir tracer les courbes comme des lignes brisées.

Tu vas donc déclarer pour mieux comprendre en suivant le cheminement de sos-math(25) :

Code : Tout sélectionner

degre = 10 # degré du polynôme qui va imposer 11 points d'interpolation
debut = -1
fin = -1
precision = 1000 # cela correspond aux points que l'on va prendre pour tracer les courbes
Il te reste ensuite à déclarer tes listes :

Code : Tout sélectionner

# liste de la nouvelle subdivision avec les abscisses de Tchebychev
liste_x = numpy.array([(debut+fin)/2 + ((fin-debut)/2)*math.cos((2*k-1)*(np.pi)/degre+1) for k in range(1, degre+2)]) 
# liste des écarts entre le polynôme et la fonction interpolée, avec la nouvelle subdivision
ecart = numpy.array([abs(Interpolation_Lagrange(abscisses[i],liste_x,f(liste_x))-f(abscisses[i])) for i in range(len(abscisses))])
# tracé
plt.plot(abscisses,ecart,color='red')
plt.show()
ce qui doit donner avec \(f(x)=\dfrac{1}{1+16x^2}\)
lagrange_exemple_8.PNG
On voit que les écarts maximaux sont de l'ordre de 0,7.
Si on augmente le degré du polynôme, contrairement à la situation précédente avec la subdivision régulière, l'écart va diminuer : avec un degré 100, l'écart maximal est d'environ 0,04.
Bonne continuation

Bonne continuation

Re: Polynôme

par sos-math(21) » jeu. 24 déc. 2020 08:05

Bonjour,
un exemple d'approximation avec une fonction d'approximation de scipy (avec une spline qui est une fonction définie par morceaux par des polynômes, on interpole par des polynômes mais en partageant l'intervalle en sous-intervalles et en faisant correspondre les morceaux de polynômes d'interpolation) :
lagrange_exemple_13.PNG
C'est tout de même beaucoup mieux.
Bonne continuation

Re: Polynôme

par sos-math(21) » mer. 23 déc. 2020 20:30

Bonjour,
tu as ta fonction interpolation_Lagrange qui te permet de calculer l'image de 800 par chacune des interpolées de Lagrange :

Code : Tout sélectionner

>>> Interpolation_Lagrange(800, bleu_x,bleu_y), Interpolation_Lagrange(800,rouge_x,rouge_y)
(322.00863678929767, 375.3337950782858)
Tu notes une différence d'altitude assez importante.
Je te laisse cherche dans la documentation de scipy : il y a sûrement des fonctions d'interpolation qui approchent mieux que Lagrange la réunion des deux listes.
Bonne continuation

Re: Polynôme

par Invité » mer. 23 déc. 2020 16:35

Oui, merci beaucoup, c'est très bien explique ! Cette fois j'ai compris.

Pour la dernière question faut-il encore utiliser un programme informatique ? Car je suis bloquée, je ne sais pas s'il faut utiliser l'informatique ou la main pour répondre...

Merci !

Re: Polynôme

par sos-math(21) » mer. 23 déc. 2020 11:15

Bonjour,
c'est la définition même des polynômes de Lagrange : pour interpoler sur \(n\) points, il faut un polynôme de degré \(n-1\).
Donc plus tu vas rajouter de points, plus ton polynôme sera de degré élevé, plus il sera "compliqué" et tu risques d'avoir des surprises sur l'allure de ton polynôme qui passera bien aux points demandés mais qui risque de faire des "sauts" entre deux points, c'est ce que j'entendais par régularité.
Dans ta situation de profil, topographique, cela risque de faire des bosses ou des creux surprenants :
lagrange_exemple_12.PNG
Comprends-tu le problème ?

Re: Polynôme

par Invité » mer. 23 déc. 2020 10:52

Bonjour,

Merci je vais regarder ça dès que j'ai un PC à ma disposition.

Il y a quand-même quelque chose que je comprends pas : pourquoi le fait de rajouter des points augmente le degré du polynôme ?

Pourriez-vous m'expliquer svp ?

Et qu'est-ce qu'un polynôme régulier / non régulier ?

Re: Polynôme

par sos-math(21) » mer. 23 déc. 2020 07:41

Bonjour,
c'est peut-être une fausse bonne idée... le fait de rajouter des points augmente le degré du polynôme et celui-ci peut devenir "moins régulier" : tout dépend de la répartition des points.
Essaie de tracer ta courbe en réunissant les listes bleu_x et rouge_x ainsi que bleu_y et rouge_y :

Code : Tout sélectionner

bleu_x = [0,500,600,1000,1250,1750,2000]
bleu_y = [100,285,300,350,385,225,100]
rouge_x = [50,75,400,650,1200,1900]
rouge_y = [100,110,250,340,380,140]
union_x = sorted(bleu_x + rouge_x)
union_y = sorted(bleu_y + rouge_y)
abscisses = numpy.linspace(0,2000,1000)
images =  numpy.array([Interpolation_Lagrange(abscisses[i],union_x,union_y) for i in range(len(abscisses))]) # images des points de la subdivision par le polynôme d'interpolation de lagrange
plt.scatter(union_x,union_y, color="green")
plt.plot(abscisses,images, color = "red")
plt.show()
Tu verras ce que cela donne....

Re: Polynôme

par Invité » mar. 22 déc. 2020 22:03

OK, c'est bon j'ai réussi merci !

Pour la question suivante, je dirais que c'est une bonne idée car ça permettrait d'avoir plus de données et d'avoir une représentation plus fidèle à la réalité ? Etes-vous d'accord avec moi ?

Re: Polynôme

par sos-math(21) » mar. 22 déc. 2020 21:50

Il faut aussi modifier la ligne d’au-dessus car la fonction polynôme de Lagrange doit s’appliquer à rouge_x et rouge_y.

Re: Polynôme

par Invité » mar. 22 déc. 2020 21:47

merci beaucoup, j'obtiens bien votre premier graphique avec votre code.

Par contre, pour obtenir le deuxième, voici comment j'ai modifié votre code (j'ai modifié uniquement la troisième ligne en partant de la fin) :

Code : Tout sélectionner

from scipy.interpolate import lagrange
import sympy
x, y, z, t = sympy.symbols('x y z t')
import numpy
import math
import matplotlib.pyplot as plt

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
bleu_x = [0,500,600,1000,1250,1750,2000]
bleu_y = [100,285,300,350,385,225,100]
rouge_x = [50,75,400,650,1200,1900]
rouge_y = [100,110,250,340,380,140]
abscisses = numpy.linspace(0,2000,1000)
images =  numpy.array([Interpolation_Lagrange(abscisses[i],bleu_x,bleu_y) for i in range(len(abscisses))]) # images des points de la subdivision par le polynôme d'interpolation de lagrange
plt.scatter(rouge_x,rouge_y, color="green")
plt.plot(abscisses,images, color = "red")
plt.show()
Mais ça ne m'affiche pas votre deuxième graphique : savez-vous pourquoi ?

Re: Polynôme

par sos-math(21) » mar. 22 déc. 2020 19:59

Il faut que tu reprenne la fonction d'interpolation que nous avons construite auparavant et tu vas l'appliquer à la liste de l'équipe bleue, et ensuite, tu vas calculer les images d'une subdivision par cette fonction :

Code : Tout sélectionner

from scipy.interpolate import lagrange
import sympy
x, y, z, t = sympy.symbols('x y z t')
import numpy
import math
import matplotlib.pyplot as plt

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
bleu_x = [0,500,600,1000,1250,1750,2000]
bleu_y = [100,285,300,350,385,225,100]
rouge_x = [50,75,400,650,1200,1900]
rouge_y = [100,110,250,340,380,140]
abscisses = numpy.linspace(0,2000,1000)
images =  numpy.array([Interpolation_Lagrange(abscisses[i],bleu_x,bleu_y) for i in range(len(abscisses))]) # images des points de la subdivision par le polynôme d'interpolation de lagrange
plt.scatter(bleu_x,bleu_y, color="green")
plt.plot(abscisses,images, color = "red")
plt.show()

Bonne continuation

Re: Polynôme

par Invité » mar. 22 déc. 2020 19:43

D'accord, c'est effectivement ce qu'on devrait obtenir, ça ressemble bien à un profil topographique.

Mais quelles lignes de code avez-vous rentré pour obtenir tout ça ?

Moi je n'ai toujours pas réussi

Haut