2016-12-07 172 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应该打印该矩阵。
  • 理想情况下,三角分解和解方程也应该是函数。体验组织良好的代码的乐趣。 :)