Interpolation de Lagrange

Signaler
Messages postés
5
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
20 janvier 2009
-
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
-
Bonjour, je dois écrire un programme qui trace le graphique d'un polynôme de Lagrange passant par des points désignés par la souris: voici le code que j'ai écrit, mais rien ne se passe, le graphe ne se dessine pas. Auriez-vous de l'aide à me proposer? Merci d'avance

Dim PX(100) As Integer
Dim PY(100) As Integer
Dim n As Integer

Function L(k, x)
Let aux = 1
For i = 1 To n
    If i <> k Then
        Let aux = aux * (x - PX(i)) / (PX(k) - PX(i))
    End If
Next i
L = aux
End Function

Private Sub Command1_Click()

For a = PX(0) To PX(n)
    For k = 1 To n
        Let b = b + L(k, a) * PY(k)
    Next k
    Picture1.PSet (a, b)
Next a

End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
If n = 0 Then
    PX(0) = x
    PY(0) = Y
    Picture1.Circle (PX(0), PY(0)), 2
    n = n + 1
Else
    If x > PX(n - 1) Then
        PX(n) = x
        PY(n) = Y
        Picture1.Circle (PX(n), PY(n)), 2
        n = n + 1
    End If
End If
End Sub

6 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Je ne l'ai pas essayé, mais il semble que tu ne traces de cercle que lorsque la nouvelle position horizontale est à droite de la précédente avec If x > PX(n-1) : c'est volontaire ?
Est-ce que la commande 
   Picture1.Circle (100, 100), 2
fonctionne correctement (mets la dans un bouton pour tester) ?

Il faut regarder dans l'aide : Est ce que les coordonnées x/y fournies par le _MouseDown ont les mêmes bases que celles du Circle :
_MouseDown te fournit peut-être des coodonnées par rapport à la forme qui l'héberge, alors que si tu dessines à l'intérieur d'une PictureBox, les coordonnées sont peut-être par rapport aux bords de la PictureBox.
Suffirait de retrancher PictureBox.Left et Top à x et y.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
20 janvier 2009

Salut, tout d'abord merci pour ton message.

Je trace en effet les cercles  volontairement, car ce sont des points de repaires, pour que je puisse mieux les distinguer des autres en fait.

la commande picture1.circle(100,100),2 marche correctement, ce qui ne fonctionne pas est qu'une fois que j'ai entré les points en cliquant avec la souris(ces points doivent être d'abscisse croissante), ensuite je clique sur le bouton 1 ce qui devrait relier ces points par interpolation de Lagrange, mais rien ne se passe.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Oui, ça, tu l'as déjà dit.
As-tu regarder cette histoire de coordonnées relative (à la forme et à la picture) ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
20 janvier 2009

Salut, le problème ne venait apparemment pas des coordonnées, mais j'avais fait une erreur dans les boucles, voila le code correct:

Dim PX(100) As Integer
Dim PY(100) As Integer
Dim n As Integer

Function L(k, x)
Let aux = 1
For i = 0 To n
    If i <> k Then
        Let aux = aux * (x - PX(i)) / (PX(k) - PX(i))
    End If
Next i
L = aux
End Function

Private Sub Command1_Click()

For x = PX(0) To PX(n - 1) Step 0.1
    Let Y = 0
    For k = 0 To n
        Let Y = Y + L(k, x) * PY(k)
    Next k
   Picture1.PSet (x, Y)
Next x

End Sub

Private Sub Command2_Click()
Picture1.Cls
Let n = 0
Let Text1.Text = " "
Let Label3.Caption = " "
End Sub

Private Sub Command3_Click()
Let X1 = Text1.Text
For k = 0 To n
    Let Y = Y + L(k, X1) * PY(k)
Next k
Let Label3.Caption = Round(Y, 3)
Picture1.Circle (X1, Y), 2

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
If n = 0 Then
    PX(0) = x
    PY(0) = Y
    Picture1.Circle (PX(0), PY(0)), 2
    n = n + 1
Else
    If x > PX(n - 1) Then
        PX(n) = x
        PY(n) = Y
        Picture1.Circle (PX(n), PY(n)), 2
        n = n + 1
    End If
End If
End Sub
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Cool
Y-a pas de quoi ...
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour

Raphael, je souhaiterais, si tu veux bien, me baser sur ton code pour me familiariser avec l'interpolation polynomiale.

Pour cela, j'ai construit par algorithme une matrice de points appartenant à une sinusoïde, et simulant un échantillon PCM. Je voudrais reconstruire cette sinusoïde par interpolation lagrangienne, comme illustré par un article de Wikipedia.

Après un survol rapide de ton code, je bute sur la procédure Command3_click dont je ne comprends pas la finalité. Quel est ce paramètre que tu affiches dans le Label3, et ce point que tu matérialises par un cercle ? Le reste de ton code me semble limpide.


Merci infiniment