2016-12-07 4 views
0

Die Umkehrung meiner Matrix zeigt immer 0 und ich verstehe nicht warum. Danke für den Fortschritt. 4 Funktionen: -main: Benutzer gibt die Matrix ein, und die Ergebnisse (Matrix, Determinante, LU-Faktorisierung und Inverse) werden angezeigt.Matrix: Inverse immer Null

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

float determinant(float[20][20],float); 
void cofactor(float[20][20],float); 
void transpose(float[20][20],float[20][20],float); 

void main() 
{ 
    float A[20][20]= {0},L[20][20]= {0}, U[20][20]; 
    float B[20]= {0}, X[20]= {0},Y[20]= {0}; 
    int i,j,k,n; 
    printf("Enter the order of square matrix: "); 
    scanf("%d",&n); 
    printf("\nEntrer les elements de la matrice A:\n"); 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
      printf("Entrer l'element A[%d][%d] : ", i,j); 
      scanf("%f",&A[i][j]); 
     } 
    } 
    printf("\nEntrer les termes de la matrice B\n"); 
    for(i=0; i<n; i++) 
    { 
     printf("B[%d]",i); 
     scanf("%f",&B[i]); 
    } 
    for(j=0; j<n; j++) 
    { 
     for(i=0; i<n; i++) 
     { 
      if(i<=j) 
      { 
       U[i][j]=A[i][j]; 
       for(k=0; k<i-1; k++) 
        U[i][j]-=L[i][k]*U[k][j]; 
       if(i==j) 
        L[i][j]=1; 
       else 
        L[i][j]=0; 
      } 
      else 
      { 
       L[i][j]=A[i][j]; 
       for(k=0; k<=j-1; k++) 
        L[i][j]-=L[i][k]*U[k][j]; 
       L[i][j]/=U[j][j]; 
       U[i][j]=0; 
      } 
     } 
    } 
    printf("[L]: \n"); 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
      printf("%9.3f",L[i][j]); 
     printf("\n"); 
    } 
    printf("\n\n[U]: \n"); 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
      printf("%9.3f",U[i][j]); 
     printf("\n"); 
    } 
    //Y pour calculer X 
    for(i=0; i<n; i++) 
    { 
     Y[i]=B[i]; 
     for(j=0; j<i; j++) 
     { 
      Y[i]-=L[i][j]*Y[j]; 
     } 
    } 
    for(i=0; i<n; i++) 
    { 
     printf("%9.3f",Y[i]); 
    } 
    for(i=n-1; i>=0; i--) 
    { 
     X[i]= Y[i]; 
     for(j=i+1; j<n; j++) 
     { 
      X[i]-=U[i][j]*X[j]; 
     } 
     X[i]/=U[i][i]; 
    } 
    printf("\n\n[X]: \n"); 
    for(i=0; i<n; i++) 
    { 
     printf("%9.3f",X[i]); 
    } 
    printf("\n\nLe determinant de la matrice A est = %f",n); 
    if (n==0) 
    printf("\nCette matrice n'a pas d'inverse!\n"); 
    else { 
    cofactor(A,k); 
    } 

getch(); 
} 

float determinant(float a[20][20],float k) 
{ 
    float s=1,det=0,b[20][20]; 
    int i,j,m,n,c; 
    if (k==1) 
    { 
    return (a[0][0]); 
    } 
    else 
    { 
    det=0; 
    for (c=0;c<k;c++) 
     { 
     m=0; 
     n=0; 
     for (i=0;i<k;i++) 
      { 
      for (j=0;j<k;j++) 
       { 
       b[i][j]=0; 
       if (i != 0 && j != c) 
       { 
        b[m][n]=a[i][j]; 
        if (n<(k-2)) 
        n++; 
        else 
        { 
        n=0; 
        m++; 
        } 
        } 
       } 
      } 
      det=det + s * (a[0][c] * determinant(b,k-1)); 
      s=-1 * s; 
      } 
    } 

    return (det); 
} 

void cofactor(float num[20][20],float f) //fonction which will calculate the cofactof of matrix 
{ 
float b[20][20],fac[20][20]; 
int p,q,m,n,i,j; 
for (q=0;q<f;q++) 
{ 
    for (p=0;p<f;p++) 
    { 
    m=0; 
    n=0; 
    for (i=0;i<f;i++) 
    { 
     for (j=0;j<f;j++) 
     { 
      if (i != q && j != p) 
      { 
      b[m][n]=num[i][j]; 
      if (n<(f-2)) 
      n++; 
      else 
      { 
       n=0; 
       m++; 
       } 
      } 
     } 
     } 
     fac[q][p]=pow(-1,q + p) * determinant(b,f-1); 
    } 
    } 
    transpose(num,fac,f); 
} 
/*Finding transpose of matrix*/ 
void transpose(float num[20][20],float fac[20][20],float r) 
{ 
    int i,j; 
    float b[20][20],inverse[20][20],n; 

    for (i=0;i<r;i++) 
    { 
    for (j=0;j<r;j++) 
     { 
     b[i][j]=fac[j][i]; 
     } 
    } 
    n=determinant(num,r); 
    for (i=0;i<r;i++) 
    { 
    for (j=0;j<r;j++) 
     { 
     inverse[i][j]=b[i][j]/n; 
     } 
    } 
    printf("\n\n\nThe inverse of matrix is : \n"); 

    for (i=0;i<r;i++) 
    { 
    for (j=0;j<r;j++) 
     { 
     printf("\t%f",inverse[i][j]); //show inverse of the matrix 
     } 
    printf("\n"); 
    } 
} 
+0

Hinweis: Um mehr vom 'float'-Wert zu sehen, verwenden Sie' printf ("% e", some_float); '. – chux

+1

Posting Beispiel Eingabe, Ausgabe und erwartete Ausgabe würde helfen. – chux

+0

Sparen Sie Zeit, schalten Sie Compiler-Warnungen ein: 'printf (" \ n \ nDie Determinante der Matrix Aest =% f ", n);' -> '...% d", n); ' – chux

Antwort

2

Es gibt einige Probleme mit Ihrem Code, aber der Hauptfehler ist, dass Sie einen falschen Parameter

cofactor(A,k); 

Hier passieren, ist k eine Schleife Variable, die den Wert hatte, nachdem es war wird in dem Code verwendet, der die Dreieckszerlegung ausführt. (Sie können sehen, dass dieser Wert 1 ist, weil nur ein Eintrag der Matrix gedruckt wird.)

Sie die Reihenfolge der Matrizen verwenden sollten, n:

cofactor(A, n); 

Im Allgemeinen sollten Sie ein verwenden konsistentere Nomenklatur. In main ist die Reihenfolge der Matrizen n, in determinant es k, in cofactor verwenden Sie die Gleitkommavariable f und in transpose verwenden Sie die Gleitkommavariable r. Um die Verwirrung zu erhöhen, ist n hier ein Float, der die Determinante darstellt. Ich schlage vor, Sie verwenden die ganze Zahl n für die Reihenfolge, lokale Ganzzahlen i, j und k als Loop-Variablen – C99 ermöglicht es Ihnen, sie nur für den Umfang der Schleife, z. for (int i = 0; ...) – und mehr oder weniger aussagekräftige Namen für die Gleitkommazahlen; det für die Determinante ist gut.

Weitere Vorschläge:

  • keine expliziten Schleifen schreiben Matrizen jedes Mal zu drucken; Schreibe eine Funktion, um eine Matrix zu drucken, und eine Funktion, um stattdessen einen Vektor zu drucken und sie aufzurufen.
  • Separate Berechnung vom Druck. Zum Beispiel sollte der Code zum Drucken der Umkehrung nicht Teil sein (der schlecht benannte?) transpose. Stattdessen sollte transpose eine Matrix ausfüllen, die von main übergeben wurde, und main sollte dann diese Matrix drucken.
  • Idealerweise sollte auch die Dreieckszerlegung und das Lösen der Gleichung funktionieren. Erleben Sie die Freuden eines gut organisierten Codes. :)