Système de deux équation à deux inconnues [Résolu]

cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 31 janv. 2009 à 22:13 - Dernière réponse : cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

22 réponses

Meilleure réponse
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 3 févr. 2009 à 23:01
3
Merci
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.

Merci us_30 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de us_30
Meilleure réponse
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 4 févr. 2009 à 06:52
3
Merci
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

Merci cs_Orohena 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_Orohena
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 31 janv. 2009 à 22:21
0
Merci
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 ...
Commenter la réponse de jmf0
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 1 févr. 2009 à 13:47
0
Merci
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
Commenter la réponse de cs_Orohena
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 1 févr. 2009 à 17:48
0
Merci
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.
Commenter la réponse de us_30
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 1 févr. 2009 à 17:50
0
Merci
... code qui fut un temps proposé sur VBF...

Amicalement,
Us.
Commenter la réponse de us_30
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 1 févr. 2009 à 23:54
0
Merci
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.
Commenter la réponse de cs_littlegeek
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 2 févr. 2009 à 00:12
0
Merci
Je vais y réfléchir. En attendant, je te conseille vivement de visiter le site d'us, que je trouve personnellement excellent.

Amicalement
Commenter la réponse de cs_Orohena
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 2 févr. 2009 à 00:41
0
Merci
merci
Commenter la réponse de cs_littlegeek
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 2 févr. 2009 à 08:41
0
Merci
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 !
Commenter la réponse de jmf0
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 2 févr. 2009 à 12:03
0
Merci
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.
Commenter la réponse de us_30
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 2 févr. 2009 à 13:47
0
Merci
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 ....
Commenter la réponse de jmf0
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 2 févr. 2009 à 13:49
0
Merci
Red, ...
Tu connais ou a connu (car je pense qu'il n'est peut-être plus parmi nous) Monsieur Frasnay ? (moi oui, comme "prof")
Commenter la réponse de jmf0
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 2 févr. 2009 à 16:05
0
Merci
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
Commenter la réponse de cs_littlegeek
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 2 févr. 2009 à 16:08
0
Merci
Comme a dit us_30, l'important pour moi et de savoir comment programmer la méthode itérative!!!
Merci les gars
Commenter la réponse de cs_littlegeek
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 2 févr. 2009 à 20:20
0
Merci
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é !
Commenter la réponse de jmf0
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 2 févr. 2009 à 23:07
0
Merci
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."
Commenter la réponse de cs_littlegeek
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 2 févr. 2009 à 23:47
0
Merci
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.
Commenter la réponse de us_30
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 3 févr. 2009 à 00:21
0
Merci
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
Commenter la réponse de cs_Orohena
cs_littlegeek 8 Messages postés samedi 31 janvier 2009Date d'inscription 5 février 2009 Dernière intervention - 3 févr. 2009 à 00:24
0
Merci
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
Commenter la réponse de cs_littlegeek

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.