Résolution d'un système de 3 équations à 3 inconnues

Description

Il vous faut 12 TextBox ici nommé Text(0) à Text(11) et un CommandButton ici nommé Command1.

Utilisation du soft illustrée par un exemple :

L'équation de départ est :

x - y + z = 1 (1)
x + y - z = 2 (2)
x + y + z = 3 (3)

Les variables sont donc les valeurs de x, y et z et le résultat (r) des équations.

Pour la première équation on a donc 4 variables :

x = 1 ; y = -1 ; z = 1 et r = 1

A = x ; B = y ; C = z et D = r

Text(0).Text = A ; Text(1).Text = B ; Text(2).Text = C ; Text(3).Text = D

Pour la deuxième équation on a aussi 4 variables :

x = 1 ; y = 1 ; z = -1 et r = 2

E = x ; F = y ; G = z et H = r

Text(4).Text = E ; Text(5).Text = F ; Text(6).Text = G ; Text(7).Text = H

Pour la troisième équation on a aussi 4 variables :

x = 1 ; y = 1 ; z = 1 et r = 3

I = x ; J = y ; K = z et L = r

Text(8).Text = I ; Text(9).Text = J ; Text(10).Text = K ; Text(11).Text = L

La formule générale pour trouver z :

Ax + By + Cz = D (1)
Ex + Fy + Gz = H (2)
Ix + Jy + Kz = L (3)

Si on part du principe que :

x = (D - By - Cz) / A

alors on peut enlever x de l'équation :

A / E => Ax + (FA / E)y + (GA / E)z = HA / E (4)
A / I => Ax + (JA / I)y + (KA / I)z = LA / I (5)

(1) - (4) => (B - (FA / E))y + (C - (GA / E)z = D - (HA / E) (6)
(1) - (5) => (B - (JA / I))y + (C - (KA / I)z = D - (LA / I) (7)

(6) <=> (BE - FA)y + (CE - GA)z = (DE - HA)
(7) <=> (BI - JA)y + (CI - KA)z = (DI - LA)

et on se retrouve avec un système de 2 équations à 2 inconnus :

y = ((DE - HA) - (CE - GA)z) / (BE - FA)

z = (((BI - JA) (DE - HA)) - ((DI - LA) (BE - FA))) / ((-(CI - KA) (BE - FA)) + ((CE - GA) (BI - JA)))

Je pense que le code n'est pas trop compliqué mais si il vous faut un renseignement ou autre je suis là.

Source / Exemple :


Option Explicit     'J'indique que toutes les variables doivent être définies.
'##### Ici je définis toutes les variables #####
Dim a As Double, b As Double, c As Double, d As Double, e As Double, f As Double, g As Double, h As Double, i As Double, j As Double, k As Double, l As Double
Dim ii As Integer
Dim r As Double, x As Double, y As Double, z As Double
'##### Fin de la définition des variables #####

Private Sub Command1_Click()
'##### Ici j'ai créé un boucle qui vérifie si il y a bien quelque chose dans chaque TextBox #####
For ii = 0 To 11
If Text(ii).Text = "" Then      'Si le TextBox nommé Text(ii).Text est vide alors il affiche un message d'erreur
                                'Dans Text(ii).Text le ii correspond à la valeur de ii qui vaut donc 0 puis 1 puis 2 puis ... jusqu'a 11
MsgBox "Vous devez remplir tous les champs", vbInformation, "Erreur"        'Définition du message d'erreur
Text(ii).SetFocus        'Sélection du TextBox vide
Exit Sub        'Fin de l'action car il y a un TextBox vide
End If      'Fin de la condition
Next ii      'Relance la boucle tant que ii n'égale pas 11
'##### Fin de la boucle #####
'
'##### On donne aux variables les valeurs entrées dans les TextBox #####
a = Text(0).Text
b = Text(1).Text
c = Text(2).Text
d = Text(3).Text
e = Text(4).Text
f = Text(5).Text
g = Text(6).Text
h = Text(7).Text
i = Text(8).Text
j = Text(9).Text
k = Text(10).Text
l = Text(11).Text
'##### Toutes les variables que l'utilisateur devait configurer se sont vu attribuer une valeur #####
r = ((-((c * i) - (k * a))) * ((b * e) - (f * a))) + (((c * e) - (g * a)) * ((b * i) - (j * a)))        'On calcule le déterminant qui servira à trouver la valeur de z
If r = 0 Then       'Si le déterminant est égale à 0 le calcul est impossible car on ne sait pas diviser un nombre par 0 alors on affiche un message d'impossibilité
MsgBox "Impossible", vbInformation, "Erreur"        'Définition du message
Exit Sub    'Fin de l'action car r = 0
Else        'Sinon on continue
z = ((((b * i) - (j * a)) * ((d * e) - (h * a))) - (((d * i) - (l * a)) * ((b * e) - (f * a)))) / r     'On calcule la valeur de z
End If      'Fin de la condition
r = ((b * e) - (f * a))     'On calcule le déterminant qui servira à trouver la valeur de y
If r = 0 Then       'Si le déterminant est égale à 0 le calcul est impossible car on ne sait pas diviser un nombre par 0 alors on affiche un message d'impossibilité
MsgBox "Impossible", vbInformation, "Erreur"        'Définition du message
Exit Sub    'Fin de l'action car r = 0
Else        'Sinon on continue
y = (((d * e) - (h * a)) - (((c * e) - (g * a)) * z)) / r       'On calcule la valeur de y
End If
If a = 0 Then       'Si a = 0 on se retouve dans le même cas qu'avec r et on affiche aussi un message d'erreur
MsgBox "Impossible", vbInformation, "Erreur"        'Définition du message
Exit Sub    'Fin de l'action car a = 0
Else        'Sinon on continue
x = (d / a) - ((b / a) * y) - ((c / a) * z)     'On calcule la valeur de x
x = Format(x, "#0.000")     'On arrondit x au millième
y = Format(y, "#0.000")     'On arrondit y au millième
z = Format(z, "#0.000")     'On arrondit z au millième
End If      'Fin de la condition
MsgBox "x = " & x & Chr(13) & "y = " & y & Chr(13) & "z = " & z, vbInformation, "Résultat :"       'On affiche un message avec les résultats de x, y et de z
'##### Ici j'ai encore créé une boucle qui vide le contenu de chaque TextBox #####
For ii = 0 To 11
Text(ii).Text = ""       'Réinisialisation du TextBox qui correspond à la valeur de ii
Next ii
'##### Fin de la boucle #####
Text(0).SetFocus        'Sélectionne Text(0).Text pour une éventuelle nouvelle entrée
End Sub

'##### Ici j'interdis l'utilisation de toutes les touches sauf de celles qui sont utiles #####
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscii = "8" Then Exit Sub     'La touche "Supprimer"
If KeyAscii = "44" Then Exit Sub    'La touche ","
If KeyAscii = "45" Then Exit Sub    'La touche "-"
'##### Ici seuls les chiffres sont pris en compte #####
If KeyAscii < "48" Then KeyAscii = 0
If KeyAscii > "57" Then KeyAscii = 0
'##### Donc si la touche pressée ne correspond pas à 0,1,2,...,7,8,9 elle n'est pas prise en compte #####
End Sub

Conclusion :


Voila un autre petit soft tout simple qui vous facilitera les devoirs lol.

Cette foi aussi je vous demande de bien vouloir me signaler tout manque, oubli ou autre pour que je puisse y remédier.

Merci d'avance,
Nicolas H.

Ce programme a été réaliser avec la participation de Djamal A.

Codes Sources

A voir également

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.