Calcul Matriceal – Inversarea unei matrici

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(); }

Leave a Reply