发布时间 : 星期三 文章矩阵LU分解求逆详细分析与C语言实现更新完毕开始阅读867c93caf8b069dc5022aaea998fcc22bcd14313
(3)求A的逆矩阵
由式(10)可计算得到矩阵A的逆,如下:A?1?u?l??0.25?0.166667?0.125?4.5????00.3333300???000.5?2??1?2?????0004???3??1.916667??8.833334?3.666675.5?4.5????0.666670.3333300???5.333333?2.666673?2????7.6666673.33333?54??由程序计算出的结果如下:
01?20.8333300?00?10???1.251??9
2、C语言程序设计及测试 2.1 算法c程序实现
#include
float L[N][N],U[N][N],out[N][N], out1[N][N];
float r[N][N],u[N][N]; memset( a , 0 , sizeof(a)); memset( L , 0 , sizeof(L)); memset( U , 0 , sizeof(U)); memset( r , 0 , sizeof(r)); memset( u , 0 , sizeof(u)); int n=N; int k,i,j; int flag=1; float s,t;
////////////////////input a matrix//// printf(\ for(i=0;i scanf(\//////////////////figure the input matrix////////////////////////// printf(\输入矩阵:\\n\for(i=0;i for(j=0;j a[0][j]=a[0][j]; //计算U矩阵的第一行 for(i=1;i a[i][0]=a[i][0]/a[0][0]; //计算L矩阵的第1列 for(k=1;k for(j=k;j for (i=0;i 10 s=s+a[k][i]*a[i][j]; //累加 a[k][j]=a[k][j]-s; //计算U矩阵的其他元素 } for(i=k+1;i for(j=0;j t=t+a[i][j]*a[j][k]; //累加 a[i][k]=(a[i][k]-t)/a[k][k]; //计算L矩阵的其他元素 } } for(i=0;i { L[i][j]=a[i][j]; U[i][j]=0;}//如果i>j,说明行大于列,计算矩阵的下三角部分,得出L的值,U的//为0 else { U[i][j]=a[i][j]; if(i==j) L[i][j]=1; //否则如果i if(U[1][1]*U[2][2]*U[3][3]*U[4][4]==0){ flag=0; printf(\逆矩阵不存在\ if(flag==1){ /////////////////////求L和U矩阵的逆 for (i=0;i for (k=i-1;k>=0;k--) {s=0; for (j=k+1;j<=i;j++) s=s+U[k][j]*u[j][i]; u[k][i]=-s/U[k][k];//迭代计算,按列倒序依次得到每一个值, } } for (i=0;i for (k=i+1;k r[k][i]=r[k][i]-L[k][j]*r[j][i]; //迭代计算,按列顺序依次得到每一个值 } } /////////////////绘制矩阵LU分解后的L和U矩阵/////////////////////// printf(\分解后L矩阵:\ for(i=0;i printf(\ } printf(\分解后U矩阵:\ for(i=0;i printf(\ } printf(\ ////////绘制L和U矩阵的逆矩阵 printf(\矩阵的逆矩阵:\ for(i=0;i printf(\ } printf(\矩阵的逆矩阵:\ for(i=0;i printf(\ } printf(\ //验证将L和U相乘,得到原矩阵 printf(\矩阵和U矩阵乘积\\n\ for(i=0;i 11 } for(i=0;i for(j=0;j {out[i][j]+=L[i][k]*U[k][j];} } } for(i=0;i for(j=0;j printf(\ } //////////将r和u相乘,得到逆矩阵 printf(\原矩阵的逆矩阵:\\n\ for(i=0;i 2.2 数据测试 (1)非满秩矩阵 1>、整数矩阵