Inversa unei matricipătratice A, notată A la -1 este matricea care îndeplineşte condiţia: $latex A\cdot A^{-1}= A^{-1}\cdot A=I $ (unde I este matrice unitate).
O matrice este inversabilă dacă şi numai dacă determinantul asociat ei este nenul. O astfel de matrice se numeşte nesingulară.
#include "stdio.h"
#include "conio.h"
int n;
float a[10][20];
//realizează extinderea matricii la dreapta
void extindere_matr(void)
{
int i,j;
//cu o matrice pătratică
for(i=1;i <= n;i++)
for(j=n+1;j <= 2*n;j++)
if(i+n==j) a[i][j]=1;
//dacă ne găsim pe diagonala principală a extinsei
else a[i][j]=0;
}
//în cazul în care elementul a[i][i] este o caută
int cauta_pivot(int i)
{
int j;
//un element pivot pe unul din rândurile de dedesuptul liniei i
for(j=i+1 ;j <= n;j++)
if(!a[j][i]) return(j);
return(0);
}
//inversăm linia i cu linia k pentru a avea pivot nenul void schimba_linii(int i, int k)
{
int j;
float tmp;
for(j=i;j <= 2*n;j++)
//inversăm fiecare element al liniei i cu elementul corespunzător
//al liniei k
{
tmp=a[k][j];
a[k][j]=a[i][j];
a[i][j]=tmp;
}
}
void aplica_transf(int i)
{
int j,k;
float tmp;
tmp=a[i][i];
for(j=i; j <= 2*n;j++) a[i][j]/=tmp;
//împărţim linia i cu a[i][i] pentru a avea pivot egal cu 1
for(k=1;k <= n;k++)
{
if(k==i) continue;
//se zerorizează deasupra şi dedesuptul pivotului mai puţin
//linia cu pivotul
tmp=a[k][i];
for(j=i;j <= 2*n;j++) a[k][j]-=tmp*a[i][j];
}
}
void main(void)
{
int i,j,k=1;
float f;
printf("Introdu gradul matricei:");
scanf("%d",&n);
printf("Introdu elem matricei:\n");
for(i=1;i <= n;i++)
//pentru a înţelege mai uşor programul
for(j=1;j <= n;j++)
//am folosit indici pornind de la valoarea 1
{
printf("a[%d][%d]=",i,j);
scanf("%f",&f);
a[i][j]=f;
}
extindere_matr() ;
//extindem matricea la stânga cu matricea unitate
i=1;
do
{
if(!a[i][i])
//dacă elementul pivot este o căutăm un element
//pivot diferit de 0
{
k=cauta_pivot(i) ;
//funcţia cauta_pivot va returna linia cu pivotul găsit
if(k) schimba_linii(i,k);
//dacă s-a găsit pivot (adică k este diferit de 0) se vor inversa //linia i cu linia k
}
if(k) aplica_transf(i);
//dacă s-a găsit pivot aplicăm transformările asupra matricii
i++;
} while((i <= n)&&(k));
//dacă ieşim cu k=0 înseamnă că nu am găsit un pivot
if(!k)
printf("Matricea nu este inversabila!\n");
else {
printf("Elementele matricei inverse sunt:\n");
for(i=1;i<=n;i++)
//afişăm partea extinsă a matricei
{
for(j=n+1;j <= 2*n;j++) printf("%f n,a[i][j]);
putchar('\n');
}
}
getch();
}