Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 3422
Réponses : 4
Type : discussion
Etat : réponses autorisées

Systeme d'équation

youkef le 03/02/2012 à 16:10
Code

:EffEcr
:Lbl 00
:Menu("SYSTEME D'EQUATION","2 INCONNUES",01,"3 INCONNUES",02,"EQUATION 2 DEGRE",03,"QUITTER",04)
:Lbl 04
:Stop
:EffEcr
:End
:Lbl 01
:Output(1,1,"SYSTEME EQUATION")
:Output(2,5,"{AX+BY=C")
:Output(3,5,"{DX+EY=F")
:Disp "","","",""
:Input "A=",A
:Input "B=",B
:Input "C=",C
:Input "D=",D
:Input "E=",E
:Input "F=",F
:(A*F-D*C)/(A*E-B*D)->Y
:(C*E-F*B)/(A*E-B*D)->X
:EffEcr
:Output(1,1,"SOLUTION:")
:Output(3,1,"X=")
:Output(5,1,"Y=")
:Output(5,3,Y)
:Output(3,3,X)
:Pause
:EffEcr
:Goto 00
:Lbl 02
:Output(1,1,"SYSTÈME D'EQUATION")
:Output(2,3,"{AX+BY+CZ=J")
:Output(3,3,"{DX+EY+FZ=K")
:Output(4,3,"{GX+HY+IZ=L")
:Disp "","","","",""
:Input "A=",A
:Input "B=",B
:Input "C=",C
:Input "D=",D
:Input "E=",E
:Input "F=",F
:Input "G=",G
:Input "H=",H
:Input "I=",I
:Input "J=",J
:Input "K=",K
:Input "L=",L
:EffEcr
:Output(1,1,"SOLUTION:")
:A*E*I+B*F*G+C*D*H-G*E*C-H*F*A-I*D*B->D
:J*E*I+B*F*L+C*K*H-L*E*C-H*F*J-I*K*B->θ
:θ/D->X
:A*K*I+J*F*G+C*D*L-G*K*C-L*F*A-I*D*J->W
:W/D->Y
:A*E*L+B*K*G+J*D*H-G*E*J-H*K*A-L*D*B->V
:V/D->Z
:Output(3,1,"X=")
:Output(4,1,"Y=")
:Output(5,1,"Z=")
:Output(3,3,X)
:Output(4,3,Y)
:Output(5,3,Z)
:Pause
:EffEcr
:Goto 00
:Lbl 03
:EffEcr
:Output(1,4,"AX²+BX+C")
::Input "A=",A
:Input "B=",B
:Input "C=",C
:EffEcr
:Output(1,4,"AX²+BX+C")
:B*B-4*A*C->D
:Output(3,1,"DISCRI.:")
:Output(3,9,D)
:If D>0
:Then
:(-B-D^1/2)/2*A->x
:(-B+D^1/2)/2*A->Y
:Output(5,1,"X'=")
:Output(7,1,"X''=")
:Output(5,4,X)
:Output(7,5,Y)
:Else
:If D=0
:Then
:-B/2*A->X
:Output(3,1,"X=Y=")
:Output(3,5,X)
:Else
:If D<0
:Then
:Output(5,1,"PAS DE SOLUTION")
:End
:End
:End
:Pause
:EffEcr
:Goto 00



Persalteas le 03/02/2012 à 18:15
ça me parait intéressant, mais c'est simplifiable.

- Input "A=",A peut s'écrire Prompt A.
- Mets des Lbl à un seul chiffre
- Autant mettre le Lbl 4 a la fin, ça économise un "stop"
- AU début, mets le EffEcr après le Lbl 0, comme ça, pas besoin d'en rajouter un a chaque Goto 0


Code

:Lbl 0
:EffEcr
:Menu("SYSTEME D'EQUATION","2 INCONNUES",1,"3 INCONNUES",2,"EQUATION 2 DEGRE",3,"QUITTER",4)
:Lbl 1
:Disp "SYSTEME EQUATION"
:Output(2,5,"{AX+BY=C")
:Output(3,5,"{DX+EY=F")
:Disp "","","",""
:Pause
:Prompt A,B,C,D,E,F
:(A*F-D*C)/(A*E-B*D)->Y
:(C*E-F*B)/(A*E-B*D)->X
:EffEcr
:Output(1,1,"SOLUTION:")
:Output(3,1,"X=")
:Output(5,1,"Y=")
:Output(5,3,Y)
:Output(3,3,X)
:Pause
:Goto 0
:Lbl 2
:Output(1,1,"SYSTÈME D'EQUATION")
:Output(2,3,"{AX+BY+CZ=J")
:Output(3,3,"{DX+EY+FZ=K")
:Output(4,3,"{GX+HY+IZ=L")
:Disp "","","","",""
:Prompt A,B,C,D,E,F,G,H,I,J,K,L
:EffEcr
:Disp "SOLUTION:"
:A*E*I+B*F*G+C*D*H-G*E*C-H*F*A-I*D*B->D
:J*E*I+B*F*L+C*K*H-L*E*C-H*F*J-I*K*B->@
:@/D->X
:A*K*I+J*F*G+C*D*L-G*K*C-L*F*A-I*D*J->W
:W/D->Y
:A*E*L+B*K*G+J*D*H-G*E*J-H*K*A-L*D*B->V
:V/D->Z
:Output(3,1,"X=")
:Output(4,1,"Y=")
:Output(5,1,"Z=")
:Output(3,3,X)
:Output(4,3,Y)
:Output(5,3,Z)
:Pause
:Goto 0
:Lbl 3
:EffEcr
:Output(1,4,"AX²+BX+C")
:Prompt A,B,C
:EffEcr
:Output(1,4,"AX²+BX+C")
:B*B-4*A*C->D
:Output(3,1,"DISCRI.:")
:Output(3,9,D)
:If D>0
:Then
:(-B-D^1/2)/2*A->x
:(-B+D^1/2)/2*A->Y
:Output(5,1,"X'=")
:Output(7,1,"X''=")
:Output(5,4,X)
:Output(7,5,Y)
:Else
:If D=0
:Then
:-B/2*A->X
:Output(3,1,"X=Y=")
:Output(3,5,X)
:Else
:If D<0
:Then
:Output(5,1,"PAS DE SOLUTION")
:End
:End
:End
:Pause
:EffEcr
:Goto 0
:Lbl 4


Voilà déjà un code un peu plus léger, et il y a encore moyen de beaucoup somplifier:

- au lieu de faire:
Code

:calcul -> variable
:Output(Y,X,"variable="
:Output(Y,X,variable

tu peux faire:

:Output(Y,X,"variable="
:Output(Y,X,calcul


Il y aurait encore possibilité de réduire par des méthodes d'optimisation, si tu connais:

If D=0 remplacé par If non(D par exemple, supprimer les parenthèses et guillemets de fin de ligne...

Mais c'est un bon programme.
linkakro le 03/02/2012 à 21:34
Sympatique bigmouth.gif Globalement bien réalisé.
Tient, le temps que je revienne au net persalteas est passé. Donc certains conseils déjà traîtés.

quelques conseils techniques :

Remplacer les longues séries de Input par "Prompt A,B,C,D,..."

"A*E*I" remplacé par "AEI"

Ces lignes doivent être corrigées :
Code
(-B-D^1/2)/2*A->x
(-B+D^1/2)/2*A->Y

 // défaut : il manque des parenthèses au dénominateur
 // .5 vaut 1/2 mais est moins lourd (je crois même qu'il y a un bug si on ne met pas de parenthèses, mais par la suite ça se corrige sans s'en préoccuper)

(-B-D^.5)/(2A->X
(-B+D^.5)/(2A->Y

 // une racine carrée me semble mieux qu'une puissance 1/2

(-B-rac(D))/(2A->X
(-B+rac(D))/(2A->Y


développement possible pour les systèmes :

Dans un second temps on peut utiliser les matrices, cela donnerais des résultats pour tous les systèmes quels que soient leurs dimensions par certaines méthodes.
L'une des méthodes simplifie le système et la solution est alors souvent facile à trouver. (edit: gauss-jordan)
Mais ce que je proposerai ici sera réservé aux situations à solutions uniques comme dans le programme initial. (inversion de matrice)

Code
Menu("","2 INCONNUES-EQUA",1,"3 INCONNUES-EQUA",2
Lbl 1
Prompt A,B,C,D,E,F
[[A,B][D,E->[A]  // [A] saisi grâce au menu matrice
[[C][F->[B] // idem pour B mais pas C
Disp [A]^-1*[B]  // idem // ^-1 saisi OBLIGATOIREMENT avec la touche [x^-1]
 // donne X et Y.
Stop
Lbl 2
Prompt A,B,C,D,E,F,G,H,I,J,K,L
[[A,B,C][D,E,F][G,H,I->[A]
[[J][K][L->[B]
Disp [A]^-1*[B]  // donne X,Y,Z
Sangohan38 le 03/02/2012 à 23:16
Par rapport au système résolu par les matrices, cela me fait penser à ce sujet.
Sinon y'a aussi la méthode de Gauss-Jordan.

Sangohan38
sandro le 04/02/2012 à 10:34
Sinon encore un autre : résolution de x equations à x inconues

Sandro