中南大学
本科生课程设计(实践)任务书、设计报告 (计算机程序设计基础—FORTRAN)
题 目 FORTRAN.90程序设计报学生姓名 指导教师 学 院 专业班级 学生学号
刘卫国 土木建筑学院
计算机基础教学实验中心 2010年 7 月 6 日
FORTRAN.90程序设计任务
线性方程组求解问题
一物理系统可用下列线性方程组来表示:
?m1cos??msin??1?0??0?m10m20?sin?cos??sin??cos?0001??a1??0???a??mg???2???1? ??N1??0????????N2??m2g?从文件中读入m1、m2和θ的值,求a1、a2、N1 和N2的值。其中g取9.8,输入θ时以角度为单位。
要求:
(1)分别用两种方法(例如高斯消去法、矩阵求逆法、三角分解法、追赶法等),定义求解线性方程组Ax=b的子程序,要求该子程序能求解任意线性方程组。
(2)在主程序中分别调用上面定义的两个子程序,并对求解结果进行对比分析。
(3)绘制以上两个方法所求得的方程解的数据分布图。 这次实践主要的目的是为了更好的掌握FORTRAN.90这门知识和熟练其中的一些做法而设计的,而这道题的任务主要是用两种不同的方法来写写求线性方程的解子程序,然后利用文件的插入数据,再在QUICKWIN里画出数据的分布。
首先我看到这个题目时就想到了逆矩阵求逆法来接方程,因为我只学会了逆矩阵求逆,然后又找到了高斯消去法,和三角分解法,比较起来,我最终了用了矩阵求逆法和直接三角分解法,因为直接三角分解法是建立在高斯消去法的基础上,后面的迭代和高斯的基本一样。这就是我选择逆矩阵和直接三角分解法的原因。
程序设计的基本思路
通过徐士良Fortran《常用算法程序集(第二版)》我了解了高斯消去法,通过《数值计算》我知道了三角分解法,通过网上百度我又知道了矩阵求逆的方法,通过比较我选择了直接三角分解法和矩阵求逆法来解线性方程的解,因为直接三角分解法后面要利用高斯消去法。我的基本思路是先写两个子程序,然后在写主程序,用文件的形式输入数据,通过调试比较两个子程序的解,最后用QUICKWIN画图,通过看课本,我决定了画圆。其中三角分解法的基本原理是:把A矩阵利用公式分解为一个上三角矩阵L和一个下三角矩阵
U,然后在利用高斯消去法的原理解L(U*X)=B和U*X=Y的求出X,即是所要求的线性方程的解。矩阵求逆的思路是利用公式B=A*//A/,其中A*为A的伴随矩阵/A/为A的行列式,B为A的逆矩阵,然后再用矩阵相乘的方法求这个线性方程的解。接着就是写主程序等等。
系统功能分析及功能结构图
这个程序的主要功能就是求解任意线性方程的解,其中利用了三角分解法和矩阵求逆法来设计子程序,利用了文件来输入数据,最后还用了QUICKWIN程序画图,其主要流程图如下所示:
程序设计过程中所遇到的问题
FORTRAN.90是我大学里学了比较难的一门,所以在做的过
程中我遇到了很多问题,有时一些简单的问题也常常犯,比如 WARNING for4227:argument y (number 2) in reference to procedure s1 from procedure main incorrect: has the wrong data type,根据这个信息找到可能的错误,例如形参和实参的类型不一致。时输入时输入错误,例如error lnk2001:unresolved external symbol_z@4 fatal error lnk1120:1 unresolved externals。通常遇到这样的错误我都会直接在程序中查找,后来
RUN TO
CURSOR 选项,或者直接按F9,在光标所在的地方找错误。件过程中我遇到一个很麻烦的问题,我直接在自己的U盘里设置了文件,工作空间也都在U盘里,可是在子程序和主程序都没错误的情况下,就是写不出答案,错误信息大概是数据溢出,最后老师帮我解决了,原来这样的文件及程序需放在project文件中,变为标准程序。开始之前,我一直想要把那个画图的子程序写成一个子程序,最后我还是没搞懂,后来我把输出函数值和输出的图形变成两个单独的程序来完成的,画图过程中还遇到一个棘手的问题,就是如何输出两组数据的图形,最后我用了一个很笨的办法,就是把程序里的X(4)改为了X1(4)和X2(4),在把圆心的X值定为不同的值,这样输出的时候就不会冲突了,也可以全部输出来了。在写子程序过程中我也遇到了一个奇怪的现象,就是B(4)的值总是不同,通过几次查找才发现原来在程序运行过程中已经把B的值改变了。
总结
FORTRAN.90是我进大学以来学习的第一门语言,也是第一