Poster un nouveau sujet Poster une réponse
Etalonnement d'un système
Auteur Message
Métalocif



Autorisation : Membre
Nb de messages : 92
Inscrit le : Lun 10 Mai 2010, 19:24
Posté le : Dim 19 Mai 2013, 14:48   Citer 

Ahah, je suis de retour !
Une fois les partiels passés, je posterai sans doute quelques uns de mes programmes récents. En attendant...
Je cherche à créer un programme pour étalonner un système, c'est à dire écrire ce système :
a1x + b1y + c1z = d1
a2x + b2y + c2z = d2
a3x + b3y + c3z = d3
sous la forme :
a1x + b1y + c1z = d1
0 + b2'y + c2'z = d2'
0 + 0 + c3'z = d3'
en soustrayant la première ligne aux autres pour annuler x, pour en soustrayant la deuxième aux autres pour annuler y,... afin de le résoudre plus facilement.
J'ai donc pensé à mettre le système (de dimensions variables) sous la forme d'une matrice et d'utiliser la fonction *row+, qui fait exactement ce dont j'ai besoin. Curieusement, ça ne marche pas happy.gif, donc j'aurais besoin de votre aide.

Code
:ClrHome
:Input"NB D'INCONNUES?",A
:Delvar [J] Delvar I Delvar J
:{A,A+1->dim([J]
:For(J,1,A
:  For(I,1,A+1
:    ClrHome
:    Input"COEFF.?",B                 //J'ai oublié comment afficher un compteur dans un input...
:    B->[J](J,I
:  End
:End
:Disp [J]
:For(I,2,A
:  *row+(-[J](I,1)/[J](1,1),[J],I,1   //On soustrait la ligne 1 à la ligne actuelle en multipliant la ligne 1 de telle sorte que a1=-a2
:End
:Pause
:ClrHome
:Disp [J]


Je n'ai codé que la première étape de l'étalonnement. L'erreur est que la matrice ne change pas : le deuxième Disp affiche la même chose que le premier...

Merci d'avance pour votre aide,
Métalocif

----------------------
"On ne ment jamais autant qu'avant les élections, pendant la guerre et après la chasse." Clémenceau
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 19 Mai 2013, 17:44   Citer 

Voici la cause de ton bug : les fonctions de calcul ne mettent pas à jour les matrices mais juste la variable dernier résultat Rép/Ans, il faut stocker les résultats.

*row+(-[J](I,1)/[J](1,1),[J],I,1->[J]

Presqu'aucune fonction n'échappe à la règle.
J'ai en tête :
-fonctions de tris
-menu solveur
-fonctions indirectes comme la régression sur les équations de fonctions
-cibles multiples comme la conversion de matrice en listes
-la fonction Fill

==========

Je n'appelle pas ça étalonner mais échelonner.

La calculatrice sait déjà résoudre des systèmes de cette façon, malgré un excès de simplification.
ref/gauss : comme ton programme, avec des coefficients 1 sur la diagonale
rref/gauss-jordan : simplification complète
Pour la culture la méthode complète s'appelle souvent le pivot de Gauss.

Pour info, j'ai l'intention depuis longtemps de créer ce type d'algorithme pour me passer de "rref(" et améliorer la qualité des résultats de mon programme STOECHIO d'équilibrage des équations chimiques.
En effet "rref(" réduit pour avoir la diagonale de 1 et ainsi impose des nombre décimaux dans l'avant dernière colonne.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes