C语言求矩阵的逆矩阵.docx
- 文档编号:16906124
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:10
- 大小:61.81KB
C语言求矩阵的逆矩阵.docx
《C语言求矩阵的逆矩阵.docx》由会员分享,可在线阅读,更多相关《C语言求矩阵的逆矩阵.docx(10页珍藏版)》请在冰点文库上搜索。
C语言求矩阵的逆矩阵
C语言求矩阵的逆矩阵
班级:
自动化1604
小组成员:
潘孝枫金豆
2017年4月
作业要求:
1.用C语言编程;
2.查阅相关资料,至少了解三种以上的求矩阵的逆的方法;
3.俩人一组,提交大作业报告,含源代码。
方法一:
用伴随矩阵求矩阵的逆矩阵(潘孝枫)
最主要的问题就是求解矩阵的逆矩阵,而且是一个动态矩阵
1.求解矩阵的伴随矩阵,套用求行列式的函数
解决问题的关键是如何运用一个循环递归将求行列式的函数反复嵌
套
函数的分块
1.求矩阵的行列式的函数
2.求余子式的函数
3.求逆的函数
#include
#include
#defineN9//默认行列式最大输入阶数为9
floatFun(intn,floata[N][N]);//定义行列式计算程序,n为行列式阶数,a为矩阵a
/*主程序*/
intmain(void)
{
intn;//定义阶数n
inti,j,i1,j1,i2,j2;//定义循环变量
floata[N][N],b[N][N],c[N][N];//定义数组,a为原始录入数组,b为中间变量数组,用于提取与计算余子式,c为输出结果数组
floatd;//定义a的行列式值
printf("Inputtheorderofmatrixa:
");//输入a的阶数
scanf("%d",&n);
printf("Inputmatrixa:
\n");//输入矩阵a
for(i=0;i { for(j=0;j { scanf("%f",&a[i][j]); } } d=Fun(n,a);//计算a的行列式 if(fabs(d)<1e-6)//判断a的行列式值是否为0 { printf("Thedeterminantisnotinvertible! ");//输出“行列式值为0,不可逆” } else { printf("Thedeterminantofais%f",d);//非0继续运算 if(n==1)//阶数为1的情况 { c[0][0]=1/d; } else//阶数大于1的情况 { for(i=0;i<=n-1;i++) { for(j=0;j<=n-1;j++) { for(i1=0,i2=0;i2 { for(j1=0,j2=0;j2 { if(i1==i) { i1++; } if(j1==j) { j1++; } b[i2][j2]=a[i1][j1];//提取a[i][j]所对应的余子式到矩阵b中 } } c[j][i]=pow(-1,i+j)*Fun(n-1,b)/d;//计算a[i][j]对应的代数余子式,存入矩阵c中并完成转置 } } } printf("\n");//输出结果 for(i=0;i { for(j=0;j { printf("%10f",c[i][j]); } printf("\n"); } } } /*求行列式*/ floatFun(intn,floata[N][N])//定义求矩阵行列式的程序,采用逐步降阶求值 { floatb[N][N];//定义矩阵b inti=0,j=0;//定义循环变量i,j floatsum=0;//定义行列式运算结果sum intc=0,p=0;//定义辅助变量c,p if(n==1)//行列式阶数为1函数直接返回a[0][0]值 { returna[0][0]; } for(i=0;i { for(c=0;c { for(j=0;j { if(c { p=0; } else { p=1; } b[c][j]=a[c+p][j+1];//取出a[i][j]第一列每个元素对应的余子式存入数组b中 } } sum+=a[i][0]*Fun(n-1,b)*pow(-1,i);//求出a第一列每个元素代数余子式之和,其中嵌套Fun进行逐步降阶完成高阶行列式计算 } returnsum; } 方法二: 用行初等变换来求矩阵的逆 //应用矩阵初等变换的方法求逆矩阵 //参数说明: // naturalmat 原矩阵 // num 矩阵的阶数 // InvMat 求解结果,逆矩阵 bool Matrix_Inv(double **naturalmat,int num,double **InvMat) { int i,j,k; double **MatEnhanced;//增广矩阵(A|E) MatEnhanced = (double**)malloc(num*sizeof(double*)); for(i=0;i MatEnhanced[i] = (double*)malloc(2*num*sizeof(double)); double *temp; temp = (double*)malloc(2*num*sizeof(double)); double xishu=1;//初等变换时系数,设初值为1 for(i=0;i { for(j=0;j MatEnhanced[i][j] = naturalmat[i][j]; } for(i=0;i { for(j=num;j<2*num;j++) MatEnhanced[i][j] = 0;//先将后半部分全部赋值为0 MatEnhanced[i][i+num] = 1;//再将其对角线部分赋值为1 } //接下来进行初等行变换 for(i=0;i { if(MatEnhanced[i][i] == 0)//如果前半部分的对角线上的元素为0,此时进行行变换 { if(i == num-1)//如果是最后一行,那么说明该矩阵不可 return false; //对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换 for(j=i;j { if(MatEnhanced[j][i] ! = 0) { k = j;//记住该行的行号 break;//退出循环 } } //接下来对第i行和第k行进行交换 temp = MatEnhanced[k];//第k行 MatEnhanced[k] = MatEnhanced[i]; MatEnhanced[i] = temp; //初等变换 for(j=0;j { if(j ! = i)//本行不参与计算 { if(MatEnhanced[j][i] ! = 0)//只有当其不为零时进行计算,否则不计算 { xishu = MatEnhanced[j][i]/MatEnhanced[i][i]; for(k=i;k<2*num;k++)//对后面的所有列进行计算 MatEnhanced[j][k] -= xishu*MatEnhanced[i][k]; } } } } //将本行所有列都除以对角线上的值,将前半部分化成单位矩阵 xishu = MatEnhanced[i][i]; for(j=i;j<2*num;j++) if(xishu ! = 0) MatEnhanced[i][j] /= xishu; } //计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat. for(i=0;i { for(j=0;j InvMat[i][j] = MatEnhanced[i][j+num]; } //内存释放 free(MatEnhanced); free(temp); return true;//返回 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 矩阵
![提示](https://static.bingdoc.com/images/bang_tan.gif)