C语言求矩阵的逆矩阵.docx

上传人:b****8 文档编号:9685669 上传时间:2023-02-05 格式:DOCX 页数:9 大小:60.92KB
下载 相关 举报
C语言求矩阵的逆矩阵.docx_第1页
第1页 / 共9页
C语言求矩阵的逆矩阵.docx_第2页
第2页 / 共9页
C语言求矩阵的逆矩阵.docx_第3页
第3页 / 共9页
C语言求矩阵的逆矩阵.docx_第4页
第4页 / 共9页
C语言求矩阵的逆矩阵.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

C语言求矩阵的逆矩阵.docx

《C语言求矩阵的逆矩阵.docx》由会员分享,可在线阅读,更多相关《C语言求矩阵的逆矩阵.docx(9页珍藏版)》请在冰豆网上搜索。

C语言求矩阵的逆矩阵.docx

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;//返回

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1