1、#define N 9 /默认行列式最大输入阶数为9float Fun(int n, float aNN ); /定义行列式计算程序,n为行列式阶数,a为矩阵a/*主程序*/ int main(void) int n ; /定义阶数n int 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); In
2、put matrix a:n /输入矩阵a for( i = 0; i n; i+) for( j = 0; j j+) scanf(%f, &aij); d=Fun( n, a ); /计算a的行列式 if(fabs(d)1e-6) /判断a的行列式值是否为0 printf(The determinant is not invertible! /输出“行列式值为0,不可逆 ” elseThe determinant of a is %f,d); /非0继续运算 if(n=1) /阶数为1的情况 c00=1/d; else /阶数大于1的情况 for( i = 0;=n-1; i+) for(
3、 j = 0;= n-1; for(i1=0, i2=0; i2n-1; i1+, i2+) for(j1=0, j2=0; j2 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中并完成转置 /输出结果 for(i=0;in;i+) for(j=0;jj+) printf(%10f,cij); printf( /*求行列式*/float Fun( int n, floa
4、t aNN ) /定义求矩阵行列式的程序,采用逐步降阶求值 float bNN; /定义矩阵b int i = 0, j = 0; /定义循环变量i,j float sum = 0; /定义行列式运算结果sum int c = 0,p = 0; /定义辅助变量c,p if(n = 1) /行列式阶数为1函数直接返回a00值 return a00; for(i = 0;i i+) /针对行列式第一列展开 for(c = 0;c n-1; c+) for(j = 0;j if (c i) /判断录入数组b时行数值,如果c大于i,则在执行录入数组a时行数下移一行,否则不执行数+1的操作 p = 0;
5、 p = 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*MatEnhanc
6、ed;/增广矩阵(A|E) MatEnhanced=(double*)malloc(num*sizeof(double*);for(i=0;num;MatEnhancedi(double*)malloc(2*num*sizeof(double);*temp;tempxishu=1;/初等变换时系数,设初值为1i+)/增广矩阵赋值,前半部分for(j=0;MatEnhancedijnaturalmatij;/增广矩阵赋值,后半部分for(j=num;2*num;0;/先将后半部分全部赋值为0MatEnhancedii+num1;/再将其对角线部分赋值为1/接下来进行初等行变换if(MatEnha
7、ncedii=0)/如果前半部分的对角线上的元素为0,此时进行行变换if(inum-1)/如果是最后一行,那么说明该矩阵不可returnfalse;/对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换for(j=i;if(MatEnhancedji!0)kj;/记住该行的行号 break;/退出循环/接下来对第i行和第k行进行交换MatEnhancedk;/第k行MatEnhancedkMatEnhancedi;temp;/初等变换j+)/对其他行的所有列进行计算if(ji)/本行不参与计算0)/只有当其不为零时进行计算,否则不计算xishuMatEnhancedji/MatEnhancedii;for(k=i;kk+)/对后面的所有列进行计算MatEnhancedjk-=xishu*MatEnhancedik;/将本行所有列都除以对角线上的值,将前半部分化成单位矩阵MatEnhancedii;if(xishu/=xishu;/计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat.InvMatijMatEnhancedij+num;/内存释放free(MatEnhanced);free(temp);true;/返回
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1