2016-12-07 9 views
0

私の行列の逆数は常に0を示し、私はなぜ理解していません。進んでいただきありがとうございます。 4つの機能: -main:ユーザーが行列を入力し、結果(行列、行列式、LU因子分解および逆行列)が表示されます。マトリックス:逆常に常に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

注: 'float'値の詳細については、' printf( "%e"、some_float); 'を使用してください。 – chux

+1

サンプルの入力、出力、期待される出力を投稿すると役立ちます。 – chux

+0

時間を節約し、コンパイラの警告を有効にしてください: 'printf(" \ n \ nL Matrix A est =%f "、n);' - > '...%d"、n); ' – chux

答えて

2

あり、あなたのコードを持ついくつかの問題がありますが、主なエラーはあなたがここで

cofactor(A,k); 

に間違ったパラメータを渡すことで、kはそれがあった後、それが持っていた値を持つループ変数であります三角分解を行うコードで使用されます。 (。あなたは、行列の一つのエントリのみが印刷されているため、この値は、1であることがわかります)

あなたは行列の順番、n使用する必要があります。一般的には

cofactor(A, n); 

を、あなたが使用する必要がありますより一貫した命名法。 mainでは、行列の順番はdeterminantに、それはあなたが浮動小数点変数fを使用してtransposeに、あなたは浮動小数点変数rを使うcofactorで、kだ、nです。混乱に加えて、nは行列式を表す浮動小数点数です。整数のnを順番に使用することをお勧めします。ローカル整数i,jおよびkはループ変数として使用してください。– C99ではループのスコープに対してのみ定義することができます。 for (int i = 0; ...) –とそれ以上は浮動小数点数に意味のある名前です。行列式はdetが良いです。

さらに提案:

  • は行列を毎回印刷するには、明示的なループを書かないでください。行列を印刷する関数を記述し、代わりにベクトルを出力して呼び出す関数を記述します。
  • 印刷とは別の計算。たとえば、インバースを印刷するコードは、(悪名を付けられた?)transposeの一部であってはなりません。代わりに、はmainから渡された行列を埋め、mainはその行列を出力します。
  • 理想的には、三角分解と方程式の解は関数でなければなりません。うまく整理されたコードの喜びを体験してください。 :)