Système de deux équation à deux inconnues

Résolu
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009 - 31 janv. 2009 à 22:13
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009 - 5 févr. 2009 à 04:12
Bonjour, je suis un amateur de programmation visual basic, et j'aimerais sa avoir de l'aide pour programmer une routine pour résoudre itérativement un système de 2 équations à 2 inconnues. Le programme doit avoir 3 fonctions. La première fonction (disons Eqation_1 doit isoler le x et trouver le meilleur estimé de x dans la première équation. La deuxième fonction doit isoler le y et trouver le meilleur estimé dans la 2ème équation. La troisième fonction elle doit être la routine principale qui va appeler les 2 premières fonctions à tour de rôle un nombre n fois de suite. Le code doit être compatible aussi au visual basic d'excel et doit pouvoir être utilisé comme une fonction d'une cellule.

Merci de votre aide.
A voir également:

22 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
3 févr. 2009 à 23:01
Bonsoir,

littlegeek, je n'ai pas de code... Je l'ai dit c'est à la main...

Maintenant, on peut obtenir facilement une programmation spéficique des manipulations décrites. JE me demande même pouquoi tu n'essayes pas. Par exemple, voici un début le plus basique :

Sub equat()



'Valeur initiale
y = 1



'Boucle
Do
    retient_x = x
    retient_y = y
    x = 1 - y / 2
    y = (1 - x) / 2
Loop Until Abs(retient_x - x) < 0.0001 And Abs(retient_y - y) < 0.0001



'Affichage
MsgBox "Valeur de x=" & x & " y=" & y



End Sub


maintenant que ce propose Orohena est finalement une sophistication pour admettre n'importe quelle équation ou presque...
C'est à toi jouer, maintenant littlegeek...

Amicalement,
Us.
3
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
4 févr. 2009 à 06:52
littlegeek, je te suggère d'examiner attentivement la technique d'approximations successives proposée par us.
C'est en fait cette technique que je m'apprêtais à te proposer pour écrire ta troisième fonction, celle qui calcule le point d'intersection des droites par itération. Bon, l'exemple d'us n'effectue pas une itération bornée par n, puisque sa boucle s'arrête lorsque le point d'intersection des droites est obtenu avec une précision déterminée. Mais tu peux facilement la remplacer par une boucle For. Tu peux aussi laisser la boucle tourner tant que retient_x <> x et retient_y <> y. Cela force le programme à rechercher les coordonnées du point d'intersection avec la meilleure précision possible. On pourrait penser qu'une telle boucle dure  longtemps ; pas du tout, en fait, car comme le type Double ne comporte qu'une quinzaine de chiffres significatifs, le nombre d'itérations est du même ordre de grandeur (une quarantaine, si ma mémoire est bonne).

Bonne prog
3
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
31 janv. 2009 à 22:21
Bonjour,

drôle de manière de traiter la résolution d'un système de 2 équations à 2 inconnues !

Je crois que tu as d'abord à résoudre un problème élémentaire d'algèbre (sans code d'abord).
La mise en code VB sera ensuite très simple ....
Commence par cette approche algébrique
Si tu rencontres une difficulté à mettre ton raisonnement en code VB, montre-nous le mécanisme algébrique de ton raisonnement et dis-nous où tu coinces ...
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
1 févr. 2009 à 13:47
Bonjour littlegeek


Pourrais-tu donner éclaircir ton raisonnement par un exemple ? Donne-nous deux équations et les résultats que tu dois obtenir en exécutant chacune de tes trois fonctions.

Merci
0

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

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
1 févr. 2009 à 17:48
Bonjour,

Si je peux me permettre de d'indiquer mon modeste site : http://fordom.free.fr/ où tu pourras trouver une réponse adéquate à ton problème de résolution de système d'équation par le calcul matriciel, notamment avec RESOLMAT, dont le code est du pur VBA sous Excel : http://fordom.free.fr/matrice/RESOLMATVBA.htm utilisable "comme une fonction d'une cellule".

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
1 févr. 2009 à 17:50
... code qui fut un temps proposé sur VBF...

Amicalement,
Us.
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
1 févr. 2009 à 23:54
ok... je suis désolé du temps mis à répondre.
Il faut exactement programmer une routine pour résoudre
itérativement un système de deux équations linéaires à deux inconnues (x
et y). Par exemple prenons 2x + y 2 et x + 2y 1. Donc x = 1 et y = 0.
Et la, il faut écrire 3 fonctions en vba, dans le même module.
Les 2 premières fonctions définissent le système d'équations linéaires. Si on prend la première équation linéaire en x
et y, il faut isolez x d’une part, et de l’autre part, on obtient une
expression en y. Cette expression doit former Equation_1(y) et retourne donc la valeur -0,5y + 1quand on lui passe y;  Equation_1(y) donne théoriquement un meilleur
estimé (jusqu'à ce moment) de la valeur de x qui résoud le système
d'équations (on voudrait donc voir cette valeur converger vers 1 au cours des
itérations, dans notre exemple) Il faut faire de même pour Equation_2(x), sauf qu'il faut travailler sur la deuxième équation et isoler le y cette fois-ci.
Dans notre exemple, Equation_2(x) retourne donc la valeur -0.5y + 0.5, qui est le meilleur estimé (jusqu'à ce moment) de la valeur de y qui
résoud le système d'équations (on espère qu'il va converger vers 0 dans notre
exemple).  Ces deux fonctions seront
appelées par la troisième fonction Routine_Principale.
La
fonction Routine_Principale (y0, n) est la routine principale, celle qu'il faut
appeler depuis Excel. Elle doit appeler à tour de rôle EqLin1
et EqLin2, un nombre n fois de suite. À chaque appel de Equation_1(y), il faut utiliser comme argument la dernière valeur de y obtenue
lors du plus récent appel de EqLin2; de même à chaque appel de EqLin2(x), il faut utiliser comme argument le x obtenu lors du plus récent
appel de Equation_1. Évidemment, tout ça doit commencer quelque
part : c’est l’utilité du y0  (le premier argument de Routine_Principale(y0,
n)), qui sert pour le tout premier appel de Equation1. Routine_Principale
doit retourner à l’utilisateur les dernières valeurs de x et y
obtenues (après les n itérations) : c’est donc dire que
l’utilisateur devra appeler Routine_Principale en sélectionnant deux
cellules et en appuyant sur Ctrl-Maj-Retour pour avoir les résultats.
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
2 févr. 2009 à 00:12
Je vais y réfléchir. En attendant, je te conseille vivement de visiter le site d'us, que je trouve personnellement excellent.

Amicalement
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
2 févr. 2009 à 00:41
merci
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
2 févr. 2009 à 08:41
hé bé !
 Tu n'as jamais que 3 équations du type y = ax + b
où tu appelles a1 et b1 les paramètres a et b de la 1ère et a2 et b2 ceux de la seconde.
donc les 2 équations :
y = a1x + b1
y = a2x + b2
je ne vais pas te faire l'affront de te démontrer ici ce que j'ai appris en classe de 4ème (on soustrait =>> y = 0 ===>> on calcule x ===>> on l'applique à l'une, au hasard, des 2 équations et on en tire donc y)
Je vais directement au résultat :
x = -(b1 - b2) / (a1 - a2)
 y = a1 * x + b1

tu dsevrais (je te l'avais dit) t'intéresser à l'algèbre avant tout !
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 févr. 2009 à 12:03
hum... les façons de résoudre un système d'équation sont nombreuses. L'important pour Littlegeek est-il d'obtenir le résultat ou de savoir comment programmer la méthode itérative ?...

Amicalement,
Us.
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
2 févr. 2009 à 13:47
Bponjour, us_30,

je crois que l'important pour lui est d'abord et avant tout d'apprendre un peu d'algèbre.

Il ne veut traiter là qu'un système de deux équations à 2 inconnues (probablement pour déterminer les coordonnées du point de rencontre de deux droites) et rien d'autre que celà !

Or, il n'est pas sur un forum d'algèbre, ni d'analytique ....
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
2 févr. 2009 à 13:49
Red, ...
Tu connais ou a connu (car je pense qu'il n'est peut-être plus parmi nous) Monsieur Frasnay ? (moi oui, comme "prof")
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
2 févr. 2009 à 16:05
Jm, ce n'est pas un problème d'algèbre. je sais comment résoudre deux équations à deux inconnues. Mon problème c'est comment programmer en vb pour que ça calcule l'équation de la façon indiquée. Je ne sais pas comment coder vb pour arriver à trouver la solution...
Merci
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
2 févr. 2009 à 16:08
Comme a dit us_30, l'important pour moi et de savoir comment programmer la méthode itérative!!!
Merci les gars
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
2 févr. 2009 à 20:20
Oui, littlegeek ?
Alors explique-moi le sens de ce que tu as exprimé dans ton premier message, à savoir :
"La première fonction (disons Eqation_1 doit isoler le x et trouver le meilleur estimé de x dans la première équation"
Car je ne comprends pas ce que cela peut bien vouloir dire, ainsi exprimé !
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
2 févr. 2009 à 23:07
Je m'excuse, mais j'ai eclairci la question dans mon 2eme message. J'ai besoin de savoir comment faire ca de cette méthode, car je peux l'ai fait d'autres façons et il fonctionne. C'est pas un problème d'algèbre que j'ai. C'est la méthode pour le calcul itérativement avec les 3 fonctions.
"Les 2 premières fonctions définissent le système d'équations linéaires. Si on prend la première équation linéaire en x et y, il faut isolez x d'une part, et de l'autre part, on obtient une expression en y. Cette expression doit former Equation_1(y) et retourne donc la valeur -0,5y + 1quand on lui passe y;  Equation_1(y) donne théoriquement un meilleur estimé (jusqu'à ce moment) de la valeur de x qui
résoud le système d'équations (on voudrait donc voir cette valeur
converger vers 1 au cours des itérations, dans notre exemple) Il faut
faire de même pour Equation_2(x), sauf qu'il faut travailler sur la deuxième équation et isoler le y cette fois-ci. Dans notre exemple, Equation_2(x) retourne donc la valeur -0.5y + 0.5, qui est le meilleur estimé (jusqu'à ce moment) de la valeur de y qui résoud le système d'équations (on espère qu'il va converger vers 0 dans notre exemple).  Ces deux fonctions seront appelées par la troisième fonction Routine_Principale."
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 févr. 2009 à 23:47
Bonsoir,

Tout comme jmf0, Je suis un peu perplexe. Je ne vois pas bien ou tu veux vraiment en venir...
Si je te suis bien, parler de "système de deux équations à deux inconnues" est impropre; puisque tu mets en jeu une 3ième équation.

Résumons sur l'exemple :
1er équation : 2x + y = 2
2 équation :    x + 2y = 1
3ième équation = ?? à définir par l'utisateur, semble-t-il. Si je prend x^2+y^2=1... j'obtiens à la main quoi ?

de 1 : x = 1 - y/2
de 2 : y = (1-x)/2
et donc... ensuite ?... je résouds algébriquement en mettant x de 1, dans 2.

Si on veut le faire par itération, on choisit une valeur à y dans 1, disons y=1, soit x = 1-1/2 = 0,5
puis je remplace dans 2, soit : y=(1-0,5)/2 = 0,25puis je remplace dans 1, soit x 1-0,25/2 0,875
puis je remplace dans 2, soit y = 0,0625 etc...
...
puis x=0,99999999 et y = 0,000000001

mais quand la 3ième fonction rentre en jeu ? Quelque chose n'est pas clair sur ce point.

Amicalement,
Us.
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
3 févr. 2009 à 00:21
Bonjour

Voila la fonction EqLin, précédée d'une macro de test. Comme tu peux le voir, j'ai fusionné EqLin1 et EqLin2 : c'est le troisième paramètre qui définit quelle est l'inconnue. Peux-tu l'essayer ?


<hr />
Public Function test()
'
' Transmet une équation et une valeur de x à la fonction EqLin et affiche la valeur de y retournée par la fonction
'
    Dim resultat As Variant
    resultat = EqLin(equation:="3x+2y=-4", valeur:=1, inconnue:="x")
    If VarType(resultat) = vbDouble Then _
        MsgBox "Valeur de x pour y=1 :" & vbCrLf & vbCrLf & "x =  " & resultat, , "Résultat final"
'
' Transmet une équation et une valeur de y à la fonction EqLin et affiche la valeur de x retournée par la fonction
'
    resultat = EqLin(equation:="1 / 5 * y = 2 * x - 9", valeur:=1, inconnue:="y")
    MsgBox "Valeur de y pour x=1 :" & vbCrLf & vbCrLf & "x =  " & resultat, , "Résultat final"

End Function

<hr />
Private Function EqLin(ByVal equation As String, ByVal valeur As Double, inconnue as String) As Variant
'
' standardisation de l'equation
    Dim equ As String
    Dim membres As Variant
    Dim m As String
    Dim n As String
    Dim b As String
    Dim o As String
    Dim donnee As String
    Dim i As Integer
    Dim erreur As Boolean
    Const PAS_A_PAS = True   ' affichage des résultats intermédiaires    donnee Iif(inconnue "x","y","x")
    equ = LCase(Replace(equation, " ", ""))




' verification sommaire de l'equation
' =========================



' les caracteres acceptés sont 1234567890+-/xy*=
' les caracteres "xy=" doivent apparaitre une fois et une seule
' le signe "=" ne peut pas être le premier ou le dernier caractère 

   erreur = False 
   For i = 1 To Len(equ)
        If InStr(1, "1234567890+-/xy*=", Mid(equ, i, 1)) = 0 Then erreur = True
    Next
    If UBound(Split(equ, "=")) <> 1 Then erreur = True
    i = InStr(1, equ, "=")    If i 1 Or i Len(equ) Then erreur = True
    If UBound(Split(equ, "x")) <> 1 Then erreur = True
    If UBound(Split(equ, "y")) <> 1 Then erreur = True
    If erreur Then
        MsgBox "L'équation est incorrecte"
        EqLin = False
        Exit Function
    End If
   
' 1e etape : transformation de l'equation en une equation de forme f(x,y)=0
' ====================================================

' cette etape normalise l'equation en regroupant ses elements dans le membre de gauche

    membres = Split(equ, "=")
    m = membres(1)    If InStr(1, "+-", Left(m, 1)) 0 Then m "+" & m
    i = 1
    Do Until i > Len(m)
        If Mid(m, i, 1) = "+" Then
            Mid(m, i, 1) = "-"
        ElseIf Mid(m, i, 1) = "-" Then
            Mid(m, i, 1) = "+"
        End If
        i = i + 1
    Loop
    i = 1
    m = membres(0) & m
    If PAS_A_PAS Then MsgBox "Résultat : " & m & "=0", , _
        "1e etape : Transformation de l'equation en une equation de forme f(x,y)=0"
   
' 2e etape : transformation de l'equation en une equation de forme x=f(y) ou y=f(x)
' ==========================================================

' cette etape isole x dans le membre de gauche

    Do Until i > Len(m)
        If Mid(m, i, 1) = donnee And i > 1 Then _            If InStr("+-*", Mid(m, i - 1, 1)) 0 Then m Left(m, i - 1) & "*" & Mid(m, i)
        i = i + 1
    Loop    If InStr(1, "+-", Left(m, 1)) 0 Then m "+" & m
    i = 1
    For i = 1 To Len(m)
        If InStr("+-", Mid(m, i, 1)) <> 0 Or i = Len(m) Then            If i Len(m) Then b b & Right(m, 1)
            If b <> "" Then
                If InStr(1, b, inconnue) = 0 Then
                    n = n & b
                Else                    o o & IIf(Left(b, 1) "+", "-", "+") & Mid(b, 2)
                End If
            End If
            b = Mid(m, i, 1)
        Else
            b = b & Mid(m, i, 1)
        End If
    Next
    o = Replace(o, "*", "")
    o = Replace(o, inconnue, "")    If o "-" Or o "+" Then o = o & "1"
    If o <> "" Then n = "(" & n & ")/(" & o & ")"
    If PAS_A_PAS Then MsgBox "Resultat : " & inconnue & "=" & n, , _
        "2e etape : Transformation de l'equation en une equation de forme x=f(y) ou y=f(x)"

' 3e etape : evaluation de f(y) ou f(x)
' =========================

' cette etape calcule x pour la valeur de y passee en parametre

    EqLin = CDbl(Evaluate(Replace(n, donnee, Str(valeur))))
End Function

<hr />

Amicalement
0
cs_littlegeek Messages postés 8 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 février 2009
3 févr. 2009 à 00:24
Merci beaucoup guys, dis moi us, est-ce que tu pourrais m'envoyer ton codage pour arriver a ta réponse s'il te plaît??? Merci beaucoup orohena, je vais regarder ca maintenant!!! je vous tiens au courant :D
0
Rejoignez-nous