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.
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.