《C语言求矩阵的逆矩阵》由会员分享,可在线阅读,更多相关《C语言求矩阵的逆矩阵(12页珍藏版)》请在人人文库网上搜索。
1、C语言求矩阵的逆矩阵班级: 自动化1604小组成员: 潘孝枫 金豆2017年4月作业要求:1. 用C语言编程;2. 查阅相关资料,至少了解三种以上的求矩阵的逆的方法;3. 俩人一组,提交大作业报告,含源代码。方法一:用伴随矩阵求矩阵的逆矩阵(潘孝枫)求矩阵的逆求伴随矩阵求矩阵的行列式功能模块输入矩阵最主要的问题就是求解矩阵的逆矩阵,而且是一个动态矩阵1. 求解矩阵的伴随矩阵,套用求行列式的函数 解决问题的关键是如何运用一个循环递归将求行列式的函数反复嵌套函数的分块 1. 求矩阵的行列式的函数2. 求余子式的函数3. 求逆的函数#include #include #define N 9/默认行列。
2、式最大输入阶数为9float Fun(int n, float aNN );/定义行列式计算程序,n为行列式阶数,a为矩阵a/*主程序*/ int main(void)int n ; /定义阶数nint i, j, i1, j1,i2 ,j2 ; /定义循环变量float aNN , bNN , cNN; /定义数组,a为原始录入数组,b为中间变量数组,用于提取与计算余子式,c为输出结果数组float d; /定义a的行列式值printf(Input the order of matrix a:); /输入a的阶数scanf(%d,&n);printf(Input matrix a:n);/输。
3、入矩阵afor( i = 0; i n; i+) for( j = 0; j n; j+)scanf(%f, &aij);d=Fun( n, a ); /计算a的行列式if(fabs(d)1e-6) /判断a的行列式值是否为0printf(The determinant is not invertible!);/输出“行列式值为0,不可逆 ” elseprintf(The determinant of a is %f,d); /非0继续运算if(n=1)/阶数为1的情况c00=1/d;else /阶数大于1的情况for( i = 0; i =n-1; i+)for( j = 0; j = n-。
4、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+;bi2j2=ai1j1;/提取aij所对应的余子式到矩阵b中cji=pow( -1 , i + j ) * Fun( n - 1 , b)/d;/计算aij对应的代数余子式,存入矩阵c中并完成转置printf(n);/输出结果for(i=0;in;i+)for(j=0;jn;j+)printf(%10f,cij);printf(n);/*求行列式*/float Fun( int n, float aN。
5、N )/定义求矩阵行列式的程序,采用逐步降阶求值float bNN;/定义矩阵b int i = 0, j = 0;/定义循环变量i,jfloat sum = 0;/定义行列式运算结果sumint c = 0,p = 0;/定义辅助变量c,pif(n = 1)/行列式阶数为1函数直接返回a00值return a00;for(i = 0;i n; i+)/针对行列式第一列展开 for(c = 0;c n-1; c+)for(j = 0;j n-1;j+)if (c i)/判断录入数组b时行数值,如果c大于i,则在执行录入数组a时行数下移一行,否则不执行数+1的操作 p = 0; else p =。
6、 1;bcj = ac+pj+1;/取出aij第一列每个元素对应的余子式存入数组b中sum += ai0 * Fun(n - 1, b ) * pow(- 1 , i );/求出a第一列每个元素代数余子式之和,其中嵌套Fun进行逐步降阶完成高阶行列式计算 return sum; 方法二:用行初等变换来求矩阵的逆/应用矩阵初等变换的方法求逆矩阵/参数说明:/naturalmat原矩阵/num矩阵的阶数/InvMat求解结果,逆矩阵boolMatrix_Inv(double*naturalmat,intnum,double*InvMat)inti,j,k;double*MatEnhanced;/增。
7、广矩阵(A|E)MatEnhanced=(double*)malloc(num*sizeof(double*);for(i=0;inum;i+)MatEnhancedi=(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+)MatEnhancedij=naturalmatij;for(i=0;inum;i+)/增广矩阵赋值,后。
8、半部分for(j=num;j2*num;j+)MatEnhancedij=0;/先将后半部分全部赋值为0MatEnhancedii+num=1;/再将其对角线部分赋值为1/接下来进行初等行变换for(i=0;inum;i+)if(MatEnhancedii=0)/如果前半部分的对角线上的元素为0,此时进行行变换if(i=num-1)/如果是最后一行,那么说明该矩阵不可returnfalse;/对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换for(j=i;jnum;j+)if(MatEnhancedji!=0)k=j;/记住该行的行号break;/退出循环/接下来对第i。
9、行和第k行进行交换temp=MatEnhancedk;/第k行MatEnhancedk=MatEnhancedi;MatEnhancedi=temp;/初等变换for(j=0;jnum;j+)/对其他行的所有列进行计算if(j!=i)/本行不参与计算if(MatEnhancedji!=0)/只有当其不为零时进行计算,否则不计算xishu=MatEnhancedji/MatEnhancedii;for(k=i;k2*num;k+)/对后面的所有列进行计算MatEnhancedjk-=xishu*MatEnhancedik;/将本行所有列都除以对角线上的值,将前半部分化成单位矩阵xishu=MatEnhancedii;for(j=i;j2*num;j+)if(xishu!=0)MatEnhancedij/=xishu;/计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat.for(i=0;inum;i+)for(j=0;jnum;j+)InvMatij=MatEnhancedij+num;/内存释放free(MatEnhanced);free(temp);returntrue;/返回。