Methode du pivot(gauss) - systeme d'equations a n inconnues

Contenu du snippet

C'est une unité qui permet de résoudre un système d'équations à x inconnues par la méthode du pivot de Gauss.
exemple d'utilisation : c:=SolveEqs(a,b)
a est un tableau de réel(les facteur des inconnues) à 2 dimensions (Type TMatrice dans l'unité)
b est un tableau de réels (résultat de la somme des facteurs*inconnues) à une dimension (Type TVecteur dans l'unité)

c sera le tableau des valeurs de x1, x2, x3...xn (les inconnues)

Pour résoudre ce système:
{x+2*y+3*z = 1
2*x+3*y+z = 1
3*x+y+2*z = 1}

a sera
1 2 3
2 3 1
3 2 1

b sera 1 1 1

La fonction aura pour résultat c : x y z

Source / Exemple :


unit untpivot;

interface
uses Dialogs,SysUtils;

Type
    TVecteur=array of Extended;
    TMatrice=array of TVecteur;
    TSysteme=record
       Facteurs:TMatrice;
       Egal:TVecteur;
    end;

function SolveEqs(Equs:TSysteme;out Reussi:Boolean):TVecteur;
implementation

function SendErr(Erreure:String):boolean;
Begin
     MessageDlg(Erreure, mtError, [mbOK], 0);
     result:=false;
end;

function permutation(var Matrice:TMatrice;Ligne:Word):Extended;
var k:Word;
    aux:TVecteur;
Begin
     k:=Ligne;
     setlength(aux,length(Matrice));
     while ((Matrice[k,k]=0) and (k<length(Matrice)-1)) do begin
           k:=k+1;
           if(Matrice[k,k]>0) then begin
             aux:=Matrice[k-1];
             Matrice[k-1]:=Matrice[k];
             Matrice[k]:=aux;
           end;
     end;
     result:=Matrice[k,k];
end;

function SolveEqs(Equs:TSysteme;out Reussi:Boolean):TVecteur;
var a:TMatrice;
    b:TVecteur;
    n,i,j,k:Word;
    p,t:extended;

Begin
     // Condition de fonctionnement
        if length(Equs.Facteurs)<>length(Equs.Facteurs[0]) then begin
           // Err: Nombre d'equations insuffisant pour la resolution
           Reussi:=SendErr('Nombre d''equations Insuffisant');
           exit;
        end;
        if length(Equs.Facteurs)<length(Equs.Egal) then begin
           // Err: Equations Incompletes
           Reussi:=SendErr('Equations Incompletes');
           exit;
        end;
     // Fin cndition de fonctionnement

     // Valeurs Initiales
     Reussi:=True;
     n:=length(equs.Facteurs);
     setlength(a,n,n);
     setlength(b,n);
     b:=equs.Egal;
     a:=equs.Facteurs;
     setlength(result,n);
     // Fin Valeurs Intitiales

     // Triangulation de la matrice
     for k:=0 to n-2 do begin
         t:=permutation(a,k);
         if t=0 then Begin
            // Err: Ce Systeme n'est pas de Cramer
           Reussi:=SendErr('Ce Systeme n''est pas un Systeme de Cramer');
           exit;
         end;
         for i:=k+1 to n-1 do begin
             p:=a[i,k]/t;
             for j:=0 to n-1 do begin
                 a[i,j]:=a[i,j]-(p*a[k,j]);
             end;
             b[i]:=b[i]-(p*b[k])
         end;
     end;
     // Fin Triangulation

     // Recherche De Resultat
     try
         for k:=n-1 downto 0 do begin
             p:=b[k];
             for i:=k+1 to n-1 do begin
                 p:=p-(result[i]*a[k,i]);
                 end;
             result[k]:=p/a[k,k];
         end;
     Except
     on EInvalidOp do SendErr('Ce Systeme n''est pas un Systeme de Cramer');
     end;
     // Fin Recherche
end;

end.

Conclusion :


Je me suis inspiré des de cette page http://serge.mehl.free.fr/anx/meth_pivot.html
Il y a encore du travail notamment pour la gestion des erreurs, la transformation d'un système d'équations écrit dans un string et aussi la gestion du cas où le nombre d'équations et supérieur au nombre d'inconnues.

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.