2016-12-07 153 views
0

矩陣的反數顯示始終爲0,我不明白爲什麼。感謝您的提前。 4作用: -main:用戶輸入矩陣,並顯示結果(矩陣,行列式,LU因式分解和反轉)。矩陣:反常常爲空

#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

注:要查看更多'float'值,請使用'printf(「%e」,some_float);'。 – chux

+1

發佈樣本輸入,輸出和預期輸出將有所幫助。 – chux

+0

節省時間,打開編譯器警告:'printf(「\ n \ nLe determinant de la matrice A est =%f」,n);' - >'...%d「,n);' – chux

回答

2

有你的代碼的幾個問題,但主要錯誤是你傳遞一個錯誤的參數,以

cofactor(A,k); 

這裏,k是具有它有它以後的價值循環變量用於進行三角分解的代碼中。 (你可以看到,這個值是1,因爲只打印一個矩陣的條目)。

你應該用矩陣的順序,n

cofactor(A, n); 

在一般情況下,你應該使用更一致的命名法。在main,矩陣的順序是n,在determinantk,在cofactor使用浮點變量ftranspose,您使用浮點變量r。爲了增加混淆,n在這裏是一個浮點數,代表行列式。我建議您使用整數n作爲循環變量,,jk作爲循環變量使用,C99允許您僅爲循環的範圍定義它們。 for (int i = 0; ...) –和更多或更少有意義的浮點數名稱; det爲行列式是好的。

進一步建議:

  • 不要寫顯式循環打印矩陣每一次;寫一個函數來打印一個矩陣和一個函數來打印一個矢量,然後調用它們。
  • 根據打印單獨計算。例如,打印反面的代碼不應該是(名字不正確?)transpose的一部分。相反,transpose應填入從main傳入的矩陣,然後main應該打印該矩陣。
  • 理想情況下,三角分解和解方程也應該是函數。體驗組織良好的代碼的樂趣。 :)