n阶方阵求逆.docx
- 文档编号:2833792
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:13
- 大小:187.48KB
n阶方阵求逆.docx
《n阶方阵求逆.docx》由会员分享,可在线阅读,更多相关《n阶方阵求逆.docx(13页珍藏版)》请在冰豆网上搜索。
n阶方阵求逆
《C语言程序设计》
题目n阶方阵求逆
指导教师:
姓名:
学号:
班级:
专业:
计算机科学与技术
地点:
时间:
7月1日至7月5日
一、内容
主要实现:
本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵。
实现过程:
输入一个矩阵采用高斯约旦法求出逆矩阵并且验证逆矩阵与原矩阵的乘积为单位矩阵。
功能:
1.输入一个n(n<256)阶方阵A,方程系数矩阵与向量均从文本文件读入;
2.输入A的逆矩阵至文本文件;
3.将得到的逆矩阵与矩阵A相乘,验证其结果是否为单位矩阵。
二、上机环境
操作系统:
WindowsXP
开发工具:
VisualC++6.0
3、函数调用关系图
四、各函数功能说明
1.Voidmain()主函数
2.intinv(intn)采用高斯约旦法求方阵的逆
4.Voidchengji();矩阵的乘积
5.voidswap(doublea,doubleb)交换两个元素
五、算法描述或流程图
1.算法描述:
a.高斯-约旦法求解逆矩阵的算法描述如下:
首先,对于k从0到n-1作如下几步:
(1)从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。
这一步称为全选主元。
(2)m(k,k)=1/m(k,k)
(3)m(k,j)=m(k,j)*m(k,k),j=0,1,...,n-1;j!
=k
(4)m(i,j)=m(i,j)-m(i,k)*m(k,j),i,j=0,1,...,n-1;i,j!
=k
(5)m(i,k)=-m(i,k)*m(k,k),i=0,1,...,n-1;i!
=k
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:
在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。
2.流程图:
6、程序运行效果图
1.求2阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
2.求3阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
3.求4阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
4.方阵阵为奇异矩阵是没有逆矩阵的情况
7、总结
在学习过程中所遇到的困难、及原因分析.
(1)原因分析:
①上课也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手。
所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果没有深刻地理解语言的语句的执行过程(或流程),是不会编写程序解决这些实际问题的。
②用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识。
例如,如果不知道长方形的面积公式,即使C语言学的来。
③C语言程序设计是一门实践性很强的课程,“纸上谈兵”式的光学不练是学不好C语言的。
例如,大家都看过精彩自行车杂技表演,假如,我们从来没有骑过自行车,光听教练讲解相关的知识、规则、技巧,不要说上台表演、就是上路恐怕都不行。
(2)实践调试能力
原因分析:
调试程序是一种实践性很强的事。
即使再优秀的程序员编写程序时也会犯错误的,可能是最低级的语法错误,但他能快速发现错误并改正错误,而我们C语言初学者在面对错误提示时,是不知道发生了什么错误,如何改正,这就是差别。
我个人认为可以试着按如下方法去做:
第一步、验证性练习
在这一步要求按照教材上的程序实例进行原样输入,运行不出错。
第二步、照葫芦画瓢
在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发了什么变化,分析结果变化的原因,加深所学知识点的理解。
事实上这和第一步是同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。
记忆和理解是相辅相成的,相互促进。
还可以将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。
这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。
注意:
每次只改错一个地方,目的是显示发生该错误的真正原因,避免一次改动多个地方,弄清发生错误的真正原因。
其次,上机调试程序时可以带一个笔记本,记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验,避免再编程时犯同样的错误。
第三步、自己试做类似问题
在这一步要求不看教材,即使程序不能运行,看自己能否将其改正过来,使其能正确运行。
目的是对前两步的记忆、理解进一步强化。
对比前两步,设计一些相同的问题,试着自己编程,然后调试,再逐渐扩大,增加程序行,添加一些辅助功能等等。
(3)综合能力
可以先做小程序,然后综合各个小程序,试着做一个稍大的程序,提高自己的综合运用能力。
比如进行课程设计实训就是一种不错的选择,会对实际运用能力有较大提高,并且还会对所学知识进行加深、巩固理解。
在实践的同时多思考问题,多看别人优秀的解题思路与方法,多看别人优秀的代码,尝试自己去实现或者模仿着去实现,让别人对你的代码多提意见,探究别人的思维过程,增强自己的思维能力,拓展视野,经常看看自己以前写的东西,有空拿出来改良改良。
八、参考文献
[1]邱建华.C语言程序设计技术.东软电子出版社,2009
[2]谭浩强.C程序设计(第三版).清华大学出版社,2005
[3]同济大学数学系.线性代数(第五版).高等教育出版社,2007
九、程序清单
#include
#include
#include
doublea[256][256];
doubleb[256][256];
doublec[256][256];
intmain()
{
intinv(intn);
voidchengji(intn);
intn;
inti,j,ok;
while
(1)
{
printf("请输入方阵的大小:
");
scanf("%d",&n);
for(i=0;i { for(j=0;j { scanf("%lf",&a[i][j]); b[i][j]=a[i][j]; } } printf("原方阵: \n"); for(i=0;i { for(j=0;j { printf("%g",b[i][j]); } puts(""); } puts(""); ok=inv(n);//调用矩阵求逆 if(ok! =0)//如果返回值不是0 {printf("原方阵的逆: \n"); for(i=0;i { for(j=0;j printf("%g",a[i][j]); puts(""); } puts(""); chengji(n); } else { printf("此方阵不可逆\n\n\n"); } } return0; } ///////////////////////////////////////////////////// voidchengji(intn)//矩阵求逆; { printf("原方阵与逆方阵的积: \n"); intk=0; intl=0; inti,j; for(i=0;i for(j=0;j c[i][j]=0; for(i=0;i { for(j=0;j { doublesum=0; for(intk=0;k { sum+=a[i][k]*b[k][j]; } c[i][j]=sum; } } for(i=0;i { for(j=0;j { printf("%g",c[i][j]); } puts(""); } puts(""); } /////////////////////////////////// intinv(intn) { voidswap(doublea,doubleb); int*is,*js,i,j,k; doubletemp,fmax; is=(int*)malloc(n*sizeof(int)); js=(int*)malloc(n*sizeof(int)); for(k=0;k { fmax=0.0; for(i=k;i { for(j=k;j { temp=fabs(a[i][j]);//找最大值 if(temp>fmax) { fmax=temp; is[k]=i;js[k]=j; } } } if((fmax+1.0)==1.0) { free(is);free(js); return0; } if((i=is[k])! =k) { for(j=0;j { swap(a[k][j],a[i][j]);//第k行和第i列交换 } } if((j=js[k])! =k) { for(i=0;i { swap(a[i][k],a[i][j]);//第k列和第j列交换 } } a[k][k]=1.0/a[k][k];//求倒 for(j=0;j { if(j! =k) { a[k][j]*=a[k][k];//第k行的每一个元素都除以主对角线上的元素 } } for(i=0;i { if(i! =k) { for(j=0;j { if(j! =k) { a[i][j]=a[i][j]-a[i][k]*a[k][j]; } } } } for(i=0;i { if(i! =k) { a[i][k]*=-a[k][k]; } } } for(k=n-1;k>=0;k--) { if((j=js[k])! =k) { for(i=0;i { swap(a[j][i],a[k][i]);//第j行与第k行交换 } } if((i=is[k])! =k) { for(j=0;j { swap(a[j][i],a[j][k]);//第i列与第k列交换 } } } free(is); free(js)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方阵