




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
东南大学C语言课程设计报告课程名称: 计算机综合课程设计 学 院: 土木工程学院 设计题目: n阶方阵求逆矩阵 级 别: B 学生姓名: 汤佳敏 学 号: 05111305 同组学生: 学 号: 指导教师: 卢瑞华 2012年 9月 6日目录一、题目与要求2二、项目分析2三、模块分析4四、程序分析6五、结果11 六、总结15附:参考文献一、题目与要求(1)题目: n阶方阵求逆(B级)功能要求:a) 输入一个n(n=i;j-) aij/=aii;/单位化矩阵 for (j=0;jerr) for (k=n*2-1;k=i;k-) ajk-=aik*aji/aii;/消元 这两部分均采用循环结构来操作,具体的运算一目了然,而for语句的使用增加了程序的可读性和简便性。同时,判断矩阵是否可逆也是程序十分重要的一部分,在设计编写程序的前期,我遗漏掉了判断矩阵逆矩阵的功能模块,所以当在文本中输入一些矩阵后,程序无法正常的运行,进过思考和调试后我加上了如下的部分,通过布尔型变量的定义和使用,我们可以比较方便的判断矩阵是否可逆: bool got=false;/定义布尔型变量 for (j=i;jerr) got=true; for (k=0;kn*2;k+) l=ajk; ajk=aik; aik=l; break;/找到第一个不为零的数则跳出列循环 if (!got) printf(singular matrix.n); return 0; /如果某一行全为零则无逆矩阵还有便是矩阵相乘的部分,这一部分我们可以参考m*n阶矩阵与n*p阶矩阵相乘的程序,利用循环结构来实现: printf(A * A-1=n); for (i=0;in;i+) for (j=0;jn;j+) l=0; for (k=0;kn;k+) l+=aik+2*n*akj+n; printf(%.2lf ,l+err); /判断逆矩阵与原矩阵的乘积是否为单位矩阵上图是设计的程序的算法流程图。通过对程序的编写、调试与运行,最终验证了程序的准确性。四、程序分析如下是程序的源代码:/采用高斯消元法#include #include #define maxn 1000#define err 1e-8/宏定义保证计算中准确性double amaxnmaxn*3;/maxn是代码最大元素的下标double abs(double a)/返回传递给它的参数的绝对值函数 if (a0) return a; else return -a;/定义绝对值函数int main() printf(Now read the matrix from m.txt.n); int n,i,j,k; double l; FILE * f1 =fopen(m.txt,r); fscanf(f1,%d,&n);/从文本文件读入方程系数矩阵 memset(a,0,sizeof(a);/数组a初始化 for (i=0;in;i+) for (j=0;jn;j+) fscanf(f1,%lf,&aij);/从文本读入矩阵 aij+2*n=aij;/在n*2n阶矩阵后再加上原矩阵形成n*3n阶矩阵 fclose(f1); printf(Done reading.n); for (i=0;in;i+) aii+n=1;/建立单位矩阵,即将单位矩阵变成伴随矩阵 for (i=0;in;i+) bool got=false;/定义布尔型变量 for (j=i;jerr) got=true; for (k=0;k=i;j-) aij/=aii;/单位化矩阵 for (j=0;jerr) for (k=n*2-1;k=i;k-) ajk-=aik*aji/aii;/消元 /打印每步化简及计算过程 printf(Step %i:n,i); for (j=0;jn;j+) for (k=0;kn*2;k+) printf(%.2lf ,ajk); printf(n); printf(nn); printf(Done nijvzhengwei:nn);for (i=0;in;i+) for (j=0;jn;j+) printf(%.2lf ,aij+n);printf(n);/在程序中输出逆矩阵 printf(n); printf(nijvzhengyijinshuruzhiwenbenwenjian“ans.txt”.nn);/逆矩阵已经输入至文本文件ans.txt f1=fopen(ans.txt,w); fprintf(f1,%in,n); for (i=0;in;i+) for (j=0;jn;j+) fprintf(f1,%.2lf ,aij+n); fprintf(f1,n); fclose(f1); /输出逆矩阵 printf(A * A-1=n); for (i=0;in;i+) for (j=0;jn;j+) l=0; for (k=0;kn;k+) l+=aik+2*n*akj+n; printf(%.2lf ,l+err); /判断逆矩阵与原矩阵的乘积是否为单位矩阵 printf(n); printf(n); return 0;此程序整体是采用数组和循环来完成的,在了解了高斯消元法的具体算法后,我们可以很快的编出上述程序。在运算的过程中,我们要判断一些数据是否为零,这时候我们采用宏定义#define err 1e-8方式,通过将零与e-8进行比较,可以保证我们计算的准确性。考虑到我们更加直观的看到单位化和消元的过程,我通过打印每步的步骤来使程序明了,当然这样输出界面也就不太简洁了。此程序中判断矩阵是否可逆是很重要的一部分,这决定了后续步骤逆矩阵与原矩阵是否需要被运行。当然该程序仍存在一些不足之处,希望老师能够提出一些改进的建议。五、结果在程序的调试过程中,出现了许多问题,一是一些语法的错误和人为的失误。如在编写程序的过程中丢失了一些分号,双引号等等。还有就是起初,我只会进行文本文件不按格式的读入。文本文件中的数据读入后,无论其格式如何只显示在运行时只显示一行数字。翻阅了一些资料后,我将读取文本数据的模块部分调整为如下: FILE * f1 =fopen(m.txt,r); fscanf(f1,%d,&n);/从文本文件读入方程系数矩阵 memset(a,0,sizeof(a);/数组a初始化 for (i=0;in;i+) for (j=0;jn;j+) fscanf(f1,%lf,&aij);/从文本读入矩阵即是对方程的系数和矩阵按格式分别进行读入。下面是此程序所存在的几种可能情形的截图: 不存在逆矩阵:不存在逆矩阵的情形有很多种,可能是初始矩阵的某行全为零,也有可能是初始矩阵经过变化之后其某行全部变为零。此时,无答案输出至文本文件。 存在逆矩阵的情形,这里选取了一6阶方阵,如图所示为一6阶方阵,在VC中运行运行后,我们可以得到如下的结果 如图所示我们可以清楚的看到,程序在将从文本输入的矩阵变成增广矩阵之后,分别对每一行元素进行单位化和消元,得出最后的结果后,将所得矩阵输入至文本文件“ans.txt”,最终将所得的逆矩阵与原矩阵相乘检验其是否为逆矩阵。同样的对于更高阶的方阵此程序仍旧适用。六、总结从上学期接触C语言来,在学习这门课程上我便一直存在很大问题,在学习上总是感觉力不从心。曾经一度想到过放弃,但是仍旧坚持了下来。这个短学期的课程设计可以说让我再次认识了C语言。这是我第一次有机会用C语言来解决实际的数学问题,这一改C语言在我脑海里枯燥和乏味的形象,原来C语言的魅力竟可以如此之大!由于在工程建设中经常遇到一些矩阵的计算问题,所以在选题时我便选取了求方阵逆矩阵这一问题。当我开始着手做这道题目时,我愕然了,完全不知道从何处下手。对于模拟题,从前并未接触很多,何况是和矩阵有关的题目。所以在找到正确的解题方法前,内心一直感到惴惴不安。幸运的是,在上机的时候老师给予了我帮助和指导,才让我弄清楚了题目的要求,于是我开始着手查找各种资料,翻阅和线性代数求解逆矩阵有关的书籍,在综合考虑到各种算法的简便性问题后,最终开始了程序的设计和调试之旅。这次课程设计让我收获颇多,一是在程序设计和调试的能力上。通过这次程序设计,我复习和巩固了c语言的基础知识、加深对c语言编程的理解;同时在编程的过程中,我程序的开发、调试、测试能力也得到了提高,对C语言也建立起了比较浓厚的兴趣。当然在程序编写的过程中,我也遇到了不少问题。首先是最简算法的寻找问题。我们都知道,求方阵逆矩阵的方法有很多,如用初等行变换(初等列变换)或者利用伴随矩阵除以矩阵的行列式求得。而如何选取最简方法并将其改成计算机语言是一件十分繁琐的事。考虑到求解n阶方阵的行列式和n阶方阵的伴随矩阵的计算量比较大,所以如果采用这种方法求解方阵逆矩阵,系统的运算效率会大大减弱。所以综合考虑程序的简便性以及可实施性,我最选择利用初等行变换即高斯消元法求方阵的逆矩阵。其次是关于文件的输入输出问题,刚开始,我一直对文件的输入输出很迷惑。起初试了几个格式,都只能够从文本中无格式的读入数据,于是我在图书馆翻阅了一些C程序集,经过几次调试终于得出了结果。俗话说:“有志者,事竟成,破釜沉舟,百万秦关终属楚。苦心人,天不负,卧薪尝胆,三千越甲可吞吴。”终于在我的不懈努力下,终于能够按格式输入数据。总结下来这次课程设计的感悟可以概括为以下几点:一是在我们设计程序时,我们首先要自己弄清楚如何在现实中解决这个问题,即成为电脑的大脑,思考解决问题的方法。掌握解决问题的工具,我们方能高效的解决问题。二是程序的具体语言并不是十分重要,一个程序的核心是算法与清晰的思路,在解题的过程中我们可以借助流程图来帮助我们对题目进行整体的理解和掌握。同时我们要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方。三是程序设计不是一件一蹴而就的事,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精装房泥工分包合同执行标准及环保评估
- 仓储租赁合同与物业消防规定不一致应对措施
- 商业综合体物业租赁委托管理收费标准协议书
- 中医药现代化背景下美国市场的拓展与挑战分析报告
- 2025年植树问题期末真题及答案
- Revision 3教学设计-2023-2024学年小学英语五年级上册牛津上海版(深圳用)
- 2025年七只小羊考试题目及答案
- 专业导论的考试题及答案
- 旅职专业面试题及答案
- 英语专业面试试题及答案
- 火灾报警控制器CAN联网课件
- DB32-T 4638-2024 智能泵站技术导则
- 《蜻蜓介绍》课件
- 工程造价咨询服务方案(技术方案)
- 日本建筑企业管理制度
- 小学教师师德师风考核表
- 离婚网上申请书
- 保温楼面挤塑聚苯板XPS施工方案xps挤塑聚苯板保温施工方案
- 12D10 防雷与接地工程
- SJT10675-2002电子和电器工业用二氧化硅微粉
- 中医绝技临床实战特效绝活
评论
0/150
提交评论