Interpolation de Lagrange

cs_raph123 Messages postés 5 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 20 janvier 2009 - 18 janv. 2009 à 14:35
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 14 févr. 2009 à 21:58
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

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
19 janv. 2009 à 00:10
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)
0
cs_raph123 Messages postés 5 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 20 janvier 2009
19 janv. 2009 à 12:31
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.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
19 janv. 2009 à 17:25
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)
0
cs_raph123 Messages postés 5 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 20 janvier 2009
20 janv. 2009 à 16:41
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
21 janv. 2009 à 13:23
Cool
Y-a pas de quoi ...
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
14 févr. 2009 à 21:58
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
0
Rejoignez-nous