第一部分:引言
《C语言程序设计》课程设计是计算机专业非常重要的实践性环节之一,是学生学完《C语言程序设计》课程后一次全面的综合练习。课程设计目的是巩固学生对C语言基本原理和基础理论的理解,在学生掌握编程的基本方法之后,进一步提高学生综合运用所学知识的能力,使其在理论学习和基础实验的基础上,熟悉C程序开发的全过程并开发规模较大的程序,掌握应用计算机解决实际问题的基本方法,为学习软件专业课程创建较扎实的理论基础和实践基础。
本报告主要实现了一个求方阵逆矩阵以及证明逆矩阵和原矩阵的乘积为单位矩阵的程序。本程序采用了高斯列消元法。高斯列消元法是求逆矩阵的一种常用算法,在使用计算机来求解时,计算机需要开辟另一个内存存放变化时候的右矩阵。采用本算法可以把一个非奇异矩阵A变成单位矩阵E,也就相当于在A的左边乘上了A-1,于是对矩阵(A|E)左乘A-1则变为(A-1A|A-1E)=(E|A-1),则x=A-1为所要求的逆矩阵。
第二部分:系统功能
采用本系统,可以实现快速高效的矩阵求逆
输入一个n(n<256)阶方阵A;
输出A的原矩阵,逆矩阵以及将得到的逆矩阵与原来的矩阵相乘,验证其结果是单位矩阵。
将得到的逆矩阵与矩阵A相乘,验证其结果是否为单位矩阵。
第三部分:程序总体设计
一、函数层次结构和程序总体框架
二、函数原型清单及功能
1.int main() 主函数
2.bool FindMax(int t); 找到绝对值最大的元素,进行行交换
3.void XiaoQu(int t); 消去,使得主元所在列内,使主元外的其他元素化为0
4.void HuiDai(int t); 将函数回代,将矩阵对角线上方的元素消零
5.void swap(double a,double b); 交换两个变量的值
- int getA(double M[MAX][MAX],int n); 计算矩阵的行列式
第四部分:功能模块函数设计和调试
一、主要模块的算法描述:
矩阵的基本运算有3种,且皆不会改变方程式最后的答案:
1.某两列互换。
2.某一列乘以一个不为零的数。
3.某一列乘以一个数再加到另一列。
高斯列主元消元法的描述如下:
1.消元
1)在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换。
2)在(A,b)第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换。
3)在(A,b)第三列中(从第三列开始)找到绝对值最大的元素,将其所在行与第三行交换。
重复按以上规律执行操作。
2.回代求解
通过执行操作1,在每一个循环中,先在每一列中找到绝对值最大的数,将其作为主元,并将主元通过行变换(无需列变换)移到矩阵的对角线上,然后将主元所在行内所有的元素除以主元,使得主元化为1,然后观察主元所在列上的其他元素,将它们所在行减去主元所在行乘以一定的倍数,使得在主元所在列内,除主元外的其他元素化为0,这样就使得主元所在列化为了单位矩阵的形式。
二、流程图
第五部分:程序清单
程序源代码:
程序运行效果图:
1.求2阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
2.求3阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
3.求4阶方阵的逆矩阵和验证该逆矩阵与原矩阵的乘积是否为单位矩阵
4.方阵为奇异矩阵即方阵不可逆的情况
第六部分:课程设计总结
通过此次课程设计,我感觉自己对C语言这门课程有了更深的理解。在设计过程中虽然遇到了许多问题,但是经过一次有一次的思考,一遍又一遍的检查,以及反反复复地查找资料,我总算是基本上完成了这次课程设计,同时这也暴露了之前我在这方面的知识欠缺和经验不足。首先,这道题目毫无疑问需要坚实的线代基础,而平心而论,我对这门课程并没有掌握得十分透彻,这也就造成了我在编程之前思考如何求逆时占用了很多的时间,以至于效率低下。但是,这也算是一种收获,它再次告诫我,要想学好编程,学好软件专业一定要有扎实的数学基础。
谈到我的程序,我个人认为还有一些不足之处,如程序过于冗长且不够优化,特别是在我提交的运行结果中可以看到有一些0的前面出现了负号,这个问题困扰了我很久,但是到最后我还是没有找出解决的办法,这可以说是很遗憾的一件事情。
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,但它同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,课程设让我感触很深。我深刻体会到这门课程不是轻而易举就是可以学好的,它不仅需要细心严谨的态度,还需要充分发挥我们的数学思想和逻辑思维,让理论和实践充分地结合在一起,这样才能达到事半功倍的效果。细节决定成败这句话用在程序设计中最恰当不过了,课程不仅理论性强,实际操作性更强,一个小小的错误就可以使你的整个程序无法运行,甚至有时候绞尽脑汁也无法找出错误的所在,只好老老实实地从头再来。
在这学期的实验操作中,我逐渐培养了独立思考、动手操作的能力,并且在各种其它能力上也有了相应的提高。在实验课上,我学会了很多学习的方法,这也恰是日后最实用的。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。最后我认为,学习这门课程最重要的是要有一个良好的心态,没有一个好的心态是很难学好这门课程的。我们学习的不仅是科学的方法,还包括用什么样的态度去对待这门课程,并且让理论性和实践性在自身得到充分的发挥,希望通过这次的实践操作可以让我更好地学习编程能力。
第七部分:参考资料
[1] 钱能.C++程序设计教程详解 – 过程化编程.清华大学出版社,2014
[2] 同济大学数学系.线性代数(第六版).高等教育出版社,2014
[3] 百度文库.n阶方阵求逆