C语言求矩阵的逆矩阵

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言求矩阵的逆矩阵班级:自动化1604小组成员:潘孝枫金豆2017年4月作业要求:1.用C语言编程;2.查阅相关资料,至少了解三种以上的求矩阵的逆的方法;3.俩人一组,提交大作业报告,含源代码。方法一:用伴随矩阵求矩阵的逆矩阵(潘孝枫)最主要的问题就是求解矩阵的逆矩阵,而且是一个动态矩阵1.求解矩阵的伴随矩阵,套用求行列式的函数解决问题的关键是如何运用一个循环递归将求行列式的函数反复嵌套输入矩阵功能模块求矩阵的行列式求伴随矩阵求矩阵的逆函数的分块1.求矩阵的行列式的函数2.求余子式的函数3.求逆的函数#includestdio.h#includemath.h#defineN9//默认行列式最大输入阶数为9floatFun(intn,floata[N][N]);//定义行列式计算程序,n为行列式阶数,a为矩阵a/*主程序*/intmain(void){intn;//定义阶数ninti,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);//输入矩阵afor(i=0;in;i++){for(j=0;jn;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;i2n-1;i1++,i2++){for(j1=0,j2=0;j2n-1;j1++,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;in;i++){for(j=0;jn;j++){printf(%10f,c[i][j]);}printf(\n);}}}/*求行列式*/floatFun(intn,floata[N][N])//定义求矩阵行列式的程序,采用逐步降阶求值{floatb[N][N];//定义矩阵binti=0,j=0;//定义循环变量i,jfloatsum=0;//定义行列式运算结果sumintc=0,p=0;//定义辅助变量c,pif(n==1)//行列式阶数为1函数直接返回a[0][0]值{returna[0][0];}for(i=0;in;i++)//针对行列式第一列展开{for(c=0;cn-1;c++){for(j=0;jn-1;j++){if(ci)//判断录入数组b时行数值,如果c大于i,则在执行录入数组a时行数下移一行,否则不执行数+1的操作{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求解结果,逆矩阵boolMatrix_Inv(double**naturalmat,intnum,double**InvMat){inti,j,k;double**MatEnhanced;//增广矩阵(A|E)MatEnhanced=(double**)malloc(num*sizeof(double*));for(i=0;inum;i++)MatEnhanced[i]=(double*)malloc(2*num*sizeof(double));double*temp;temp=(double*)malloc(2*num*sizeof(double));doublexishu=1;//初等变换时系数,设初值为1for(i=0;inum;i++)//增广矩阵赋值,前半部分{for(j=0;jnum;j++)MatEnhanced[i][j]=naturalmat[i][j];}for(i=0;inum;i++)//增广矩阵赋值,后半部分{for(j=num;j2*num;j++)MatEnhanced[i][j]=0;//先将后半部分全部赋值为0MatEnhanced[i][i+num]=1;//再将其对角线部分赋值为1}//接下来进行初等行变换for(i=0;inum;i++){if(MatEnhanced[i][i]==0)//如果前半部分的对角线上的元素为0,此时进行行变换{if(i==num-1)//如果是最后一行,那么说明该矩阵不可returnfalse;//对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换for(j=i;jnum;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;jnum;j++)//对其他行的所有列进行计算{if(j!=i)//本行不参与计算{if(MatEnhanced[j][i]!=0)//只有当其不为零时进行计算,否则不计算{xishu=MatEnhanced[j][i]/MatEnhanced[i][i];for(k=i;k2*num;k++)//对后面的所有列进行计算MatEnhanced[j][k]-=xishu*MatEnhanced[i][k];}}}}//将本行所有列都除以对角线上的值,将前半部分化成单位矩阵xishu=MatEnhanced[i][i];for(j=i;j2*num;j++)if(xishu!=0)MatEnhanced[i][j]/=xishu;}//计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat.for(i=0;inum;i++){for(j=0;jnum;j++)InvMat[i][j]=MatEnhanced[i][j+num];}//内存释放free(MatEnhanced);free(temp);returntrue;//返回}

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功