FORTRAN语言课程设计_第1页
FORTRAN语言课程设计_第2页
FORTRAN语言课程设计_第3页
FORTRAN语言课程设计_第4页
FORTRAN语言课程设计_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、FORTRAN语言课程设计摘要:科技的日新月异使得计算机领域不断取得新的研究成果。计算机在代替和延伸脑力劳动方面发挥越来越重要的作用,不仅在工业方面而且在日常生活和科研中也越来越离不开计算机。特别是在天体运动方面需要运用到计算机处理大量的数据。这次我选的实践课题是用Jacobi迭代和Gauss-Seidel迭代法求解线性方程组AX=B,这其中涉及的就是天体运动的轨迹问题,我利用从FORTRAN 90中学到的迭代、循环、子程序等知识设计程序,通过Fortran PowerStation 4.0进行运行、调试,不得不提的是QuickWin,它在绘制行星的运动轨迹上发挥出了相当大的贡献。通过这次的实

2、践我从中充分体会到了Fortran语言接近数学公式的自然描述,在计算机里具有很高的执行效率的最大特性。同时我也看到了Fortran语言是一种极具发展潜力的语言,在数值计算中,Fortran语言仍然不可替代。Fortran90标准引入了数组计算等非常利于矩阵运算的功能。在数组运算时,Fortran能够自动进行并行运算,这是很多编程语言不具备的。运用Fortran语言,你能够运用很多现成的函数软件包,所以非常便利。关键词:Fortran ;Jacobi迭代和Gauss-Seidel迭代;天体运动1设计思想这次的课程设计我选的是第三个课题,关于求解天体的运行轨道,原题如下:用Jacobi迭代和Gau

3、ss-Seidel迭代法求解线性方程组AX=b。一天文学家要确定一颗小行星绕太阳运行的轨道,他在轨道平面内建立以太阳为原点的直角坐标系,在五个不同的点对小行星作了五次观察,测得轨道上五个点的坐标数据(单位:万公里)如下表所示:P1P2P3P4P5X坐标5360558460628596666268894Y坐标602611179169542349230890由开普勒第一定律知,小行星轨道为一椭圆,椭圆的一般方程可表示为:a1x2+2a2xy+a3y2+2a4x+2a5y+1=0分别将五个点的数据代入椭圆一般方程中,得到线性方程组,求出待定系数a1,a2,a3,a4,a5。绘制行星绕太阳运行的轨道。

4、从题目中观察到一共需要五组数据联立成方程组才能将a1,a2,a3,a4,a5求出,自然想到运用Jacobi迭代和Gauss-Seidel迭代法求解线性方程组AX=B的题型,其中A为5*5的矩阵,X、B为数组,分别包含a1,a2,a3,a4,a5和系数。同时为了满足程序的实用性我将Gauss-Seidel迭代法设计成了子例行程序,既方便程序的设计同时也有利于最后的调试与运行。另外,为了对比精度我还设计了另一个子例行程序:高斯消元法,将其中输出的数据设定为单精度,而将Gauss-Seidel迭代法中的数据设为双精度,两相对比即可找出最符合实际的方案。基于实践的要求,对数据的输入我采用的是从文本输入

5、,再从文本输出,格式选用的为.txt格式。其实Excel中的.prn也是理想的文件输入格式,即可以在程序中直接调用又可以灵活的控制输出。除了这些在对方程系数的输入上我设计了该程序的第三个子例行程序,这样虽然表面上有点多余但是使得整个程序的灵活性和可操作性上有了很大的提高。画图方面我很自然的想到用QuickWin来作图,画图中主要用到的是描点法,将每一个符合方程的解都描绘出来,最终形成一条光滑的曲线。最终我将所有的程序都放在了同一个文件下进行操作,涉及到画图程序和赋值主程序相冲突的问题,于是便将画图设计成子例行程序Subroutine huatu(),在主程序中对其进行调用,程序得以完成。2系统

6、设计与实现由线性方程组绘制小行星绕太阳运行轨道的问题输入求解输出椭圆的一般方程五点数据计算响应拟合文件储存数据绘制图形高斯消元法Gauss-Seidel迭代整个系统是围绕行星运行的轨道而设计,系统的框架图如下:贯穿程序始终的是Gauss-Seidel迭代法和高斯消元法,其中高斯消元法的基本运算原则是利用任何方程式乘上常数都不会改变其解答的原理,将原方程组乘以适当的常数后,作相互加减处理,使系数矩阵的对角线全部变成1,且使其左下角元素全变成0,再由最后一个方程式由下往上代入,即可求出方程的解。而Gauss-Seidel迭代法与高斯消元法相似,只是Gauss-Seidel迭代法每迭代一次只需计算一

7、次矩阵与向量的乘法。其运算公式如下:Gauss-Seidel迭代法:x(0)=(x1(0), x2(0), x3(0),xn(0)Txi(k+1)=( bi- j=1i-1aijxj(k+1)- j=i+1naijxj(k) aii (i=1,2, ,n;k=0,1, ) 运用Gauss-Seidel迭代法的算法源程序编码如下:dimension a(n,n),b(n),x(n)real a,b,x,t,s,p,qdo i=1,n if(abs(a(i,i)+1.0)=1.0)then l=0write(*,100)return endifenddol=100do i=1,nx(i)=0.0e

8、nddodop=0.0l=l-1do i=1,n t=x(i) s=0.0 do j=1,n if(j/=i)s=s+a(i,j)*x(j) enddo x(i)=(b(i)-s)/a(i,i) q=abs(x(i)-t)/(1+abs(x(i) if(qp)p=qenddoif(peps).or.(l=0)exitenddoif(l=0)write(*,100)return100 format(1x,fail)End运用Gauss-Seidel迭代法的程序框图如下:输入a(5,5),b(5)输出x(5)算出sum1与sum2的值i=1,2, nk=0,1, ,5送初值x(0)=(0,0,0)

9、k5要注意的是在这两种方法中也要记录迭代过程的迭代次数,特别地,在运用Gauss-Seidel迭代法时一定要将k的值慢慢加大,防止出现死循环。总的算法设计好之后还要注意画图程序的设计,利用QuickWin来画图不仅要确定好坐标轴的位置,同时要注意x、y轴坐标的刻度,在描点是也要控制好精度以便于确定点的疏密程度。具体的画图源程序编码如下:use msflibtype(qwinfo) winfotype(wxycoord) wxyinteger(2) statuscharacter*5 creal(8) x,ywinfo.type=qwin$maxstatus=setwsizeqq(qwin$fr

10、amewindow,winfo) status=setwsizeqq(0,winfo)status=setwindow(.true.,-100,-5000,10000,5000)status=setbkcolorrgb(#000000)call clearscreen($gclearscreen)status=setcolorrgb(#00ffff)call moveto_w(-100d0,0d0,wxy)status=lineto_w(10000d0,0d0)call moveto_w(0d0,-5000d0,wxy)status=lineto_w(0d0,5000d0)status=ini

11、tializefonts()status=setfont(h20w5i)do i=-100,10000,300 x=i call moveto_w(x,0d0,wxy) write(c,(i5)int(x) call outgtext(c)enddodo x=-100,10000 do y=-5000,5000if(int(-.59*X*X+.41*X*Y*2-.45*Y*Y*10+2*2.4*X*1000-1.42*1000*Y*2-1000)/20000)=0)then status=setpixel_w(x,y) endif enddoenddoread(*,*)end3设计总结课程设计

12、的任务圆满的完成了,虽然时间只有短短的两周而且程序也不见得那么的难,但它在一开始着实让我们伤透了脑筋。通过这次痛苦并快乐的实践过程,我终于对Fortran 90有了更为深刻的体会,它是计算机程序设计的重要理论技术基础,虽然我们属于土木建筑专业,但Fortran的学习却占据着十分重要的地位。同时我也明白了要学好这门课程,仅学习书本上的知识是远远不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。对于这次自己亲手编的程序总的来说还是很满意的,这极大的鼓舞了我,使我很有成就感。才开始的时候我真的不知从何下手,但是经过不断的查阅书籍,

13、与老师、同学交流我终于可以编程令自己满意的程序。纵观整个程序,我觉得它最大的优点在于其精确性和实用性,我不止一次的控制了数据输出的精度,不紧如此为了突出精度上的不同给结果带来的巨大误差我还特意设置了两个程序进行对比。虽然高斯消元法和Gauss-Seidel迭代法在原理上有很多地方想似,但在精度的控制上足以见出其优劣。就本程序而言用Gauss-Seidel迭代法是行不通的,因为精度的问题使得其计算结果有很大的出入,反观高斯消元法对精度的控制相当成功,所以计算结果很是精确。其次就是所说的实用性,看了我的程序的人无不说该程序不仅仅只适用于这一道题,对于这一系列的问题都可以调用该程序进行调解。这就要归

14、功于子程序和子例行程序了。在设计的过程中,我有意将有关算法的程序设计为子例行程序,这样一方面便于最后的调试、运行,同时更是为了程序的实用性。当数据变换之后只需在主程序调用自例行程序时修改调用的数据即可,而不必再一次设计程序简化了工作人员的工作。除了以上说到的两个优点之外,该程序还有一个很大的优点:可以保存运算结果。针对要求对结果进行保存的人来说这个程序应该是适用的,因为本程序的数据无论是输入还是输出都是采用文本的方式进行,运行的结果直接输出到创立程序的文件夹中。这样就不必一个一个记录数据了。但是这个程序也存在着很多的不足,例如:精度的提高换来的是运行速度的减慢,在分析数据的过程中要花掉很大一部

15、分的时间,这比起其他精度第一点的程序是最大的弱点。其次,由于数据是通过文本文件的形式输入的,所以事先应在程序的文件夹下建立与之同名的文本文件,这是很繁琐的一个过程。每次新建一个Fortran 90的文件就得重新输入数据,这也在无形之中减慢了运行的速度,这是程序的第二个缺点。该程序的第三个缺点在于过多的引用了前人的程序,例如高斯消元法和Gauss-Seidel迭代法这两个重量级的算法都是在引用的基础上加以改进而非原创,这多少有些逊色,还有利用QuickWin作图的程序也是从书上东拼西凑弄起来的,有些地方还没真正掌握,这些都是应该改进的地方。针对以上的优缺点我觉得我的程序还可以进一步的优化,例如怎

16、样在既保证高精度的条件下又有很快的运行速度,同时还不至于由于数据输入引发的繁琐。基于这些我觉得我可以从一下几个方面进行优化:首先我可以进行代码调整,代码调整是一种局部的思维方,基本上不触及算法层级。它面向的是代码,而不是问题。其中的语句调整、汇编重写、指令调整、换一种语言实现、换一个编译器、循环展开、参数传递优化等都属于这一层。其次可以选择新的视角,新的视角强调的重点是针对问题的算法,即选择和构造适合于问题的算法。很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时“新的视角”提示我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法,就

17、像该程序中高斯消元法和Gauss-Seidel迭代法的源程序代码,我们就可以尝试着用不同的方法进行运算。另外将问题抽象为另一种等价的数学模型或假想机器模型,比如构造出某种表驱动状态机。这一方面其实是第二中思想的延伸,只是产生的效果更加明显,但它有其本身的特点(任何算法和优化活动都可以看作是他的投影),这一级一般可以产生无与伦比的快速程序,不过要达到这一水平需要大量修炼,并且思考时必须放弃很多已有的概念或者这些概念不再重要,比如:变量、指针、空间、函数、对象等,剩下的只应该是那个表驱动状态机。 我想把这种境界描述为:空寂中,一些输入驱动着一个带有状态的机器按设定好的最短路线运转着。除此之外have nothing,即把解决一个问题的算法看作一个机器,它有一些可变的状态、有一些记忆、有一些按状态运行的规则,然后一些输入驱动这个机器运转。这就是第三中思想要求的思考优化问题的切入点,也就是寻找一部机器,使它运行经过的路径最短(可能是速度也可能是空间等等)总之,这次课程设计真的使我成长了很多,在独立解决问题、与同学、老师交流等方面都有了很大的提高。这对于我以后走向社会,处理更多更有难度的问题打下了一个很好的基础。可以说正是一次又一次的实践

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论