Macierz odwrotna sposób pisemny bez dołączania macierzy jednostkowej

Przestrzenie wektorowe, bazy, liniowa niezależność, macierze.... Formy kwadratowe, twierdzenia o klasyfikacji...
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6908
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

Macierz odwrotna sposób pisemny bez dołączania macierzy jednostkowej

Post autor: Mariusz M »

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>

void inverse(double **A,unsigned int n, unsigned int *error)
{
unsigned int i,j,l,k;
double   maxA,d,e;
unsigned int *M;
M=(unsigned int*)malloc((n+1)*sizeof(unsigned int));
  (*error)=0;
  for(i=1;i<=n;i++)
  {
    // Czesciowy wybor elementu glownego wg wzoru (1.49)
    maxA=0.0;
    for(j=i;j<=n;j++)
    {
      d=A[j][i];
      if(fabs(maxA)<fabs(d))
      {
        maxA=d; 
        k=j;
      }
    }
    if(maxA==0.0) 
    {
      (*error)=1;
      free(M);
      return;
    }
    /* Zapisywanie wskaznikow wierszy wystepowania elementu
      ekstremalnego w i-tej iteracji w postaci wektora M[i] */
    M[i]=k;
    A[k][i]=1.0;
    for(j=1;j<=n;j++) 
    {
      // Przestawienie i-tego wiersza z k-tym 
      d=(double)(A[k][j]/maxA);  
      A[k][j]=A[i][j]; 
       A[i][j]=d;
    }
    // Generacja ciagu macierzy (1.42) wg wzoru rekurencyjnego (1.41) 
    for(j=1;j<=n;j++)
      if(j!=i) 
      {
        d=A[j][i];
        A[j][i]=0.0;
        for(l=1;l<=n;l++)
        {
          e=d*A[i][l];
          A[j][l]-=e;
        }
        }
  }
  // Przestawianie kolumn macierzy zgodnie z wektorem wskaznikow M[i] (1.46) 
  for(i=n;i>=1;i--)
  {
    k=M[i];
    if(k!=i) 
      for(j=1;j<=n;j++) 
      {
        d=A[j][i];
        A[j][i]=A[j][k];
        A[j][k]=d;
        }
  }  
  free(M);   
}





int main(int argc, char **argv)
{
    FILE *in;
    FILE *out;
    unsigned int i,j,n;
    unsigned int  error;
    double **A;
    
    if ((in = fopen(argv[1], "rt"))
       == NULL)
   {
      fprintf(stderr, "Cannot open input file.\n");
      return 1;
   }

   if ((out = fopen(argv[2], "wt"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
   }
   
   while(!feof(in))
   {
      fscanf(in,"%d",&n);
      A=(double**)malloc((n+1)*sizeof(double*));
      for(i=0;i<=n;i++)
        A[i]=(double*)malloc((n+1)*sizeof(double));
      for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             fscanf(in,"%lf",&A[i][j]);
      inverse(A,n,&error);
      if(error==0)
      {
         for(i=1;i<=n;i++)
         {
             for(j=1;j<=n;j++)
                 fprintf(out,"%.12lf ",A[i][j]);
             fprintf(out,"\n");
         }
      }
      else
         fprintf(out,"Macierz osobliwa \n");
      for(i=0;i<=n;i++)
          free(A[i]);
      free(A);
   }
   fclose(in);
   fclose(out);
   
}

Jak na podstawie tego kodu opracować pisemny sposób odwracania macierzy
Kod ten jest o tyle ciekawy że nie trzeba dołączać macierzy jednostkowej
a wystarczy tylko pamiętać jeden wektor
ODPOWIEDZ