编程求解逆矩阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本程序是运用矩阵的初等变换的知识来求解矩阵的逆矩阵的。
1.理论基础:
若存在矩阵P使得矩阵A有
PA = E
那么 P = A’。
所以如果我们将(A,E)化成了(E,P),那么,P就是我们要求的A’。
2.由上面的分析可知,我们思路可分为以下3步:
(1)申请一个新的矩阵,它是(A,E)
(2) 将A先对角化
(3)再将A单位化E,这是A后面的部分就是A’了。
3.编程实现
#include
#include
float A1[10],A2[10][2*10],B[10][10];//原矩阵、加上单位矩阵后的矩阵、所求的逆矩阵
void ShangSanJiao(int n)//化成上三角
{
int k,i,j,l=0,temp;
if(A2[0][0] == 0)
{
while(A2[l][0]==0&&l l++; } if(l!=0)//如果[0][0]处的数为0,则交换 { for(i=0;i<2*n;i++) { temp = A2[l][i]; A2[l][i] = A2[0][i]; A2[0][i] = temp; } } for(k=0;k { for(i=k+1;i A1[i] = A2[i][k]/A2[k][k]; for(l=k+1;l { for(j=0;j<2*n;j++) A2[l][j] = A2[l][j] - A2[k][j]*A1[l]; } } } void DuiJiaoXian(int n)//将对角线上的数化1,这样方便将原矩阵化成单位矩阵 { int i,j; for(i=n-1;i>=0;i--) { A1[i]=A2[i][i]; } for(i=n-1;i>=0;i--) { for(j=0;j<2*n;j++) A2[i][j] = A2[i][j]/A1[i]; } } void DanWei(int n)//将原矩阵化成单位矩阵 { int i,j,l; float temp; for(i=n-1;i>0;i--) { for(j=i-1;j>=0;j--) { temp = A2[j][i]; for(l=0;l<2*n;l++) A2[j][l] = A2[j][l] - A2[i][l]*temp; } } } int main() { int n;//矩阵的阶数 scanf("%d",&n); if(n>10) { printf("矩阵不再表示的范围内!"); exit(-1); } int i,j; for(i=0;i { for(j=0;j { scanf("%f",&A2[i][j]); } for(j=n;j<2*n;j++) A2[i][j]=0; } for(i=0,j=n;i A2[i][j] = 1; /* for(i=0;i { for(j=0;j<2*n;j++) { printf("%f ",A2[i][j]); } printf("\n"); } printf("\n");*///显示输入的矩阵 ShangSanJiao(n);//化成上三角 /* for(i=0;i { for(j=0;j<2*n;j++) { printf("%f ",A2[i][j]); } printf("\n"); } printf("\n");*///显示上三角的矩阵 DuiJiaoXian(n);//对角化1 /* for(i=0;i { for(j=0;j<2*n;j++) { printf("%f ",A2[i][j]); } printf("\n"); } printf("\n");*///显示对角线化1后的矩阵DanWei(n);//将原矩阵单位化 /* for(i=0;i { for(j=0;j<2*n;j++) { printf("%f ",A2[i][j]); } printf("\n"); } printf("\n"); */ //将所求矩阵移到B中 for(i=0;i for(j=n;j<2*n;j++) { B[i][j-n] =A2[i][j]; } //显示所求的逆矩阵 for(i=0;i { for(j=0;j { printf("%f ",B[i][j]); } printf("\n"); } return 0; }