PROGRAM Pan_Reiff;
USES Crt;
TYPE Matrice=ARRAY[1..10,1..10] OF REAL;
VAR MatA,MatB,MatC:Matrice;
N:BYTE;
OK:BOOLEAN;
PROCEDURE Intro(VAR N:BYTE;VAR Mat:Matrice);
VAR i,j:BYTE;
BEGIN
CLRSCR;
TEXTCOLOR(YELLOW);
WRITE('Nombre de lignes:');READLN(N);
FOR i:=1 TO N DO
FOR j:=1 TO N DO
BEGIN
{GOTOXY(3,4);CLREOL;
WRITE('Introduisez A(',i,',',j,'): ');
READLN(Mat[i,j]);}
Mat[i,j]:=RANDOM(100);{Pour tester}
END;
END;
PROCEDURE Attente;
VAR St:STRING;
BEGIN
TEXTCOLOR(LIGHTRED);
St:='Une touche pour continuer.';
GOTOXY(40-LENGTH(St) DIV 2,25);WRITE(St);READKEY;
END;
PROCEDURE Affiche(S:STRING;N:BYTE;Mat:Matrice);
VAR i,j:BYTE;
BEGIN
CLRSCR;
TEXTCOLOR(LIGHTGREEN);
WRITELN(S);
FOR i:=1 TO N DO
BEGIN
FOR j:=1 TO N DO
WRITE(Mat[i,j]:9:4);
WRITELN;
END;
END;
PROCEDURE Somme(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
MatC[i,j]:=MatA[i,j]+MatB[i,j];
END;
PROCEDURE Difference(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
MatC[i,j]:=MatA[i,j]-MatB[i,j];
END;
PROCEDURE Produit(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j,k:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
BEGIN
MatC[i,j]:=0;
FOR k:=1 TO N DO
MatC[i,j]:=MatC[i,j]+MatA[i,k]*MatB[k,j];
END;
END;
PROCEDURE Inverse(N:BYTE;A:Matrice;VAR X:Matrice;VAR OK:BOOLEAN);
VAR Id,E,B:Matrice;
Old,New:REAL;
Cpt:BYTE;
FUNCTION Norme_Ligne(N:BYTE;B:Matrice):REAL;
VAR Tmp,Tmp2:REAL;
i,j:BYTE;
BEGIN
Tmp:=0;
FOR i:=1 TO N DO
BEGIN
Tmp2:=0;
FOR j:=1 TO N DO
Tmp2:=Tmp2+ABS(B[i,j]);
IF Tmp2>Tmp THEN Tmp:=Tmp2;
END;
Norme_Ligne:=Tmp
END;
FUNCTION Norme_Colonne(N:BYTE;B:Matrice):REAL;
VAR Tmp,Tmp2:REAL;
i,j:BYTE;
BEGIN
Tmp:=0;
FOR i:=1 TO N DO
BEGIN
Tmp2:=0;
FOR j:=1 TO N DO
Tmp2:=Tmp2+ABS(B[j,i]);
IF Tmp2>Tmp THEN Tmp:=Tmp2;
END;
Norme_Colonne:=Tmp
END;
PROCEDURE Init(N:BYTE;A:Matrice;VAR B:Matrice;VAR OK:BOOLEAN);
VAR i,j:BYTE;
T:REAL;
BEGIN
FILLCHAR(Id,SizeOf(Id),0);
T:=Norme_Ligne(N,A)*Norme_Colonne(N,A);
IF ABS(T)>1E-10 THEN BEGIN
OK:=TRUE;
FOR i:=1 TO N DO
BEGIN
Id[i,i]:=1;
B[i,i]:=A[i,i]/T;
FOR j:=i+1 TO N DO
BEGIN
B[i,j]:=A[j,i]/T;
B[j,i]:=A[i,j]/T;
END;
END;
END
ELSE OK:=FALSE;
END;
PROCEDURE Calcule_E;
VAR C:Matrice;
BEGIN
Produit(N,B,A,C);
Difference(N,Id,C,E);
END;
PROCEDURE Calcule_B;
VAR C,D:Matrice;
BEGIN
Somme(N,Id,E,D);
Produit(N,D,B,C);
B:=C
END;
BEGIN
Init(N,A,B,OK);
IF NOT OK THEN WRITELN('Matrice nulle!')
ELSE BEGIN
Calcule_E;
Old:=Norme_Ligne(N,E);
New:=Old;
Cpt:=0;
WHILE NOT ((New<1E-6) OR ((New>Old) AND (Cpt>5))) DO
BEGIN
Old:=New;
Calcule_B;
Calcule_E;
New:=Norme_Ligne(N,E);
INC(Cpt);
END;
OK:=TRUE;
IF New<1E-6 THEN X:=B
ELSE OK:=FALSE
END;
END;
BEGIN
Intro(N,MatA);
Affiche('A=',N,MatA);
Attente;
Inverse(N,MatA,MatB,OK);
IF OK THEN BEGIN
Affiche('Inverse de A=',N,MatB);
Attente;
Produit(N,MatA,MatB,MatC);
Affiche('Produit des matrices inverses=',N,MatC);
Attente;
END
ELSE BEGIN
CLRSCR;
WRITELN('Pas d''inverse!');
END;
END.