哪位高手请帮我修改下程序!!! 这是个关于求n阶矩阵的逆矩阵的程序 程序运行是没有错的,但结果是错的。不知道怎么弄了。 这个程序是我这两天弄的,过两天就要交了,所以急着用,还请各位高手大哥大姐帮忙修改一下,帮我把错误都修改了,而且要能成功运行就行!!!谢谢!!!感激不尽啊!!! 还有,程序里面要添加一个什么Error 函数,可以在程序运行过程中出现错误时显示哪部分函数操作出错,如输入时出错,显示"Input错误". 可这我不会,还请各位多费神了,帮帮忙啊!!! 以下是程序: #include <stdlib.h> #define N 2
#include <iostream> using namespace std;
float b1[N][2*N]; float a[N][N]; int e[N][N]; float c[N][N]; float x[(N-1)*(N-1)];
int n;
float JudgeMatrix(float a[N][N],int n);
void BuildE(int n); void Enlarge(float a[N][N], int e[N][N]); void ShangSanJiao(float b1[N][2*N],int n); void DuiJiaoXian(float b1[N][2*N]); void DanWei(float b1[N][2*N]); void QuChu(float b1[N][2*N]); char Error();
int Input() { int i,j; printf("请输入是几阶矩阵: "); scanf("%d",&n); /*输入矩阵阶数*/
for(i=0;i<n;i++) { printf("请按顺序输入矩阵的第 %d 行元素:\n",i); for(j=0;j<n;j++) { scanf("%f",&a[i][j]); /*输入矩阵各元素*/ } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%f ",a[i][j]); /*输出原矩阵*/ } printf("\n"); } return n; }
void BuildE(int n) {int i,j;
for(i=0;i<n;i++) { for(j=0;j<n;j++) { e[i][j]=0; } } for(i=0;i<n;i++) /*建立一个n阶的单位矩阵e*/ { e[i][i]=1; }
printf("单位矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%d ",e[i][j]); /*输出单位矩阵*/ } printf("\n"); }
}
void Enlarge(float a[N][N],int e[N][N]) { int i,j; int m2,n2,k; for(m2=0;m2<n;m2++) /*建立一个n*2n的矩阵b1,把原矩阵a赋值给前一半,把单位矩阵e赋值给
另一半*/ { for(n2=0;n2<n;n2++) b1[m2][n2]=a[m2][n2]; for(k=0,n2=n;k<n,n2<2*n;k++,n2++) b1[m2][n2]=e[m2][k]; }
printf("扩展后矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<2*n;j++) { printf("%f ",b1[i][j]); /*输出扩展后的矩阵*/ } printf("\n"); }
}
void ShangSanJiao(void) {int k,m2,n2;
for(k=0;k<n-1;k++) /*把矩阵前一半化为上三角矩阵*/ { for(m2=k+1;m2<n;m2++) x[m2]=b1[m2][k]/b1[k][k]; for(m2=k+1;m2<n;m2++) { for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[k][n2]*x[m2]; } }
printf("上三角矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化成后的矩阵输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); } printf("\n");
}
void DuiJiaoXian(void) { int m2,n2; for(m2=n-1;m2>=0;m2--) /*把矩阵前一半的对角线上元素化1*/ { for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]/b1[m2][m2]; }
printf("对角线为1的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半的对角线上化1后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }
printf("\n");
}
void DanWei(void) { int m2,n2; for(m2=n-1;m2>=0;m2--) /*把矩阵前一半化为单位矩阵*/ { for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[m2+1][n2]*b1[m2][m2+1]; }
printf("前一半为单位矩阵的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化为单位矩阵后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }
printf("\n"); }
void QuChu(void) {int i,j,m;
for(i=0;i<n;i++) /*把矩阵b1的前一半赋值给c并输出,即为原矩阵的逆矩阵*/ { for(j=0,m=n;j<n,m<2*n;j++,m++) c[i][j]=b1[i][m]; }
printf("要求的逆矩阵是:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%f ",c[i][j]); printf("\n"); }
}
float JudgeMatrix(float a[N][N],int n) { int i,j,k ; float D=1.0 ; for(k=0;k<n-1;k++) { for(i=k+1;i<n;i++) x[i]=a[i][k]/a[k][k]; for(i=k+1;i<n;i++) { for(j=0;j<n;j++) a[i][j]=a[i][j]-a[k][j]*x[i]; } } for(i=0,j=0;i<n,j<n;i++,j++) D=D*a[i][j]; return(D); }
void main() {
Input(); /*调用输入函数*/
if(JudgeMatrix(a,n)==0) /*调用JudgeMatrix函数,判断矩阵是否存在逆矩阵*/ { printf("D=0,没有逆矩阵!"); exit(1); /*不存在逆矩阵,退出程序*/ } BuildE(n); Enlarge(a,e); ShangSanJiao(); DuiJiaoXian(); DanWei(); QuChu(); } 关于其中求逆矩阵的思想是根据对原矩阵添加一个同阶的单位矩阵,然后进行初等变换方式化解,先把扩展开的n*2n矩阵的前半化为上三角矩阵,再把这个上三角的对角线化1,再化为单位矩阵. 以此得到的后面的由单位矩阵化来的非单位矩阵就是原矩阵的逆矩阵.
[此贴子已经被作者于2005-7-9 11:01:32编辑过]