FORTRAN课程设计zwd-精选文档

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、求一元方程的根1、采用函数子程序定义一元方程;2、程序选择以下三种方法求该方程的根;METHOD=1牛顿迭代法METHOD=2二分法METHOD=3弦截法3、对于不同的近似算法分别编写子程序,精度要求10-6。一.用二分法、弦解法和牛顿迭代法求x2-6x-7=0的根。1、二分法的基本思路:(1)现任取两个值x1和x2,使得f(x1)*f(x2)0,也就是f(x1)和f(x2)必须异号。这才能保证在[x1,x2]区间有解,即存在一个x使得f(x)=0。(2)令x=(x1+x2)/2,如果f(x)=0,就找到了这个解,计算完成。由于f(x)是一个实型数据,所以在判断f(x)是否等于0时,是通过判断|f(x)|是否小于一个很小的数ε,如果是就认为f(x)=0。(3)若f(x)不等于0,判断如果f(x1)和f(x)异号,就说明解在[x1,x]区间,就以x1,x为新的取值重复步骤(2),这时用x代替否则x2,否则反之,直到找到满足条件的解为止。程序编写如下:realx1,x2,xrealbisect,funcdoprint*,输入x1,x2的值read*,x1,x2if(func(x1)*func(x2)0.0)exitprint*,不正确的输入enddox=bisect(x1,x2)print10,x=,x10format(a,f15.7)endrealfunctionbisect(x1,x2)realx1,x2,x,f1,f2,fxx=(x1+x2)/2.0fx=func(x)dowhile(abs(fx)1e-6)f1=func(x1)if(f1*fx0)thenx2=xelsex1=xendifx=(x1+x2)/2.0fx=func(x)enddobisect=xendfunctionfunc(x)realxfunc=x**2-6*x-7end二分法运行结果2、弦解法的基本思路:(1)现任取两个值x1和x2,使得f(x1)*f(x2)0。(2)做一条通过(x1,f(x1))和(x2,f(x2))两点的直线,这条直线与x轴的交点为x。可用以下公式求出X=x2-(x2-x1)*f(x2)/(f(x1)-f(x2)),代入函数求得f(x),判断|f(x)|是否小于一个很小的数ε,如果是就认为f(x)=0。(3)否则,判断如果f(x1)和f(x)异号,就说明解在[x1,x]区间,就以x1,x为新的取值重复步骤(2),否则反之,然后以同样的办法再进一步缩小范围,直到|f(x)|ε。程序编写如下:realx1,x2,xrealsecant,funcdoprint*,'输入x1,x2的值'read*,x1,x2if(func(x1)*func(x2)0)exitprint*,'不正确的取值'enddox=secant(x1,x2)print10,'x=',x10format(a,f15.7)endrealfunctionsecant(x1,x2)implicitnonerealx1,x2,x,f1,f2,fxrealfuncx=x2-(x2-x1)/(func(x2)-func(x1))*func(x2)fx=func(x)dowhile(abs(fx)1e-6)f1=func(x1)if(f1*fx0)thenx2=xelsex1=xendifx=x2-(x2-x1)/(func(x2)-func(x1))*func(x2)fx=func(x)enddosecant=xendrealfunctionfunc(x)realxfunc=x**2-6*x-7end弦解法运行结果3、牛顿迭代法基本思路:(1)现任取一个值x1(2)做一条通过(x1,f(x1))的切线,即以f'(x1)为斜率作直线,直线与x轴的交点为x2,因为f'(x1)=f(x1)/(x1-x2)x2=x1-f(x1)/f'(x1)判断|f(x2)|ε是否成立,如果是就找到了这个解,计算完成。(3)否则,重复步骤(2),以f'(x1)为斜率做一条通过(x2,f(x2))的切线,直线与x轴的交点为x3,······,直到|f(xn)|ε,即xn为所得解。程序编写如下:realxintegermprint*,'输入初值'read*,xcallnewton(x)endsubroutinenewton(x)implicitnonerealx,x1realfunc,dfuncintegeri,mi=1x1=x-func(x)/dfunc(x)dowhile(abs(x-x1)1e-6)print10,i,x1x=x1i=i+1x1=x-func(x)/dfunc(x)enddoprint20,'x=',x110format('i=',i4,6x,'x=',f15.7)20format(a,f15.7)endrealfunctionfunc(x)realxfunc=x**2-6*x-7endrealfunctiondfunc(x)realxdfunc=2*x-6end牛顿迭代法运行结果二、求定积分1、采用函数子程序定义函数f(X);2、程序选择以下三种方法求定积分:矩形法、梯形法、辛普生法3、对于不同的算法分别编写子程序,选择调用,比较不同方法求解的精度。(一)用矩形法、梯形法和辛普生法分别求∫01(1+sinx)dx区间数为n=10,100,1000,5000时的值。1、矩形法基本思路:用小矩形面积代替小曲边梯形,矩形面积的求解公式为底×高。将[a,b]区间分为n个区间,令h=(b-a)/n。第1个矩形面积:底=h,高=f(a),也可以用f(a+h)为高,S1=h·f(a)第i个矩形面积:底=h,高=f(a+(i-1)·h),也可以用f(a+i·h)为高,Si=h·f(a+(i-1)·h)程序编写如下:reala,b,sintegernrealyrectangleprint*,'输入a,b和n的值'read*,a,b,ns=rectangle(a,b,n)print10,a,b,nprint20,s10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)20format('s=',f15.8)endrealfunctionrectangle(a,b,n)implicitnonerealx,a,b,h,sintegeri,nrealfuncx=ah=(b-a)/ns=0doi=1,ns=s+func(x)*hx=x+henddorectangle=sendrealfunctionfunc(x)realxfunc=1+sin(x)endn=10时矩形法运行结果n=100时矩形法运行结果n=1000时矩形法运行结果n=5000时矩形法运行结果2、梯形法基本思路同上reala,b,sintegernrealtrapeziaprint*,'输入a,b和n的值'read*,a,b,ns=trapezia(a,b,n)print10,a,b,nprint20,s10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)20format('s=',f15.8)endrealfunctiontrapezia(a,b,n)implicitnonerealx,a,b,h,sintegeri,nrealfuncx=ah=(b-a)/ns=0doi=1,ns=s+(func(x+(i-1)*h)+func(x+i*h))*h/2.0enddotrapezia=sendrealfunctionfunc(x)realxfunc=1+sin(x)endn=10时梯形法运行结果n=100时梯形法运行结果n=1000时梯形法运行结果n=5000时梯形法运行结果2、辛普生法:程序编写如下:reala,b,sintegernrealsinpsonprint*,'输入a,b和n的值'read*,a,b,ns=sinpson(a,b,n)print10,a,b,nprint20,s10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)20format('s=',f15.8)endrealfunctionsinpson(a,b,n)implicitnonereala,b,h,f2,f4,xintegeri,nrealfunch=(b-a)/(2.0*n)x=a+hf2=0f4=func(x)doi=1,n-1x=x+hf2=f2+func(x)x=x+hf4=f4+func(x)enddosinpson=(func(a)+func(b)+4.0*f4+2.0*f2)*h/3.0endrealfunctionfunc(x)realxfunc=1+sin(x)endn=10时辛普生法运行结果n=100时辛普生法运行结果n=1000时辛普生法运行结果n=5000时辛普生法运行结果一、利用Gauss-Jordan法求联立方程组:{x+4y+7z=122x+5y+8z=153x+6y+8z=17程序编写如下:real,allocatable::a(:,:),b(:),c(:)print*,'输入未知数个数n'read*,nallocate(a(n,n))allocate(b(n))allocate(c(n))print*,'输入系数矩阵a'callinput(a,n)print*,'输入等值矩阵b'read*,bprint*,'联立方程组'calloutput(a,b,n)callGauss_jordan(a,b,c,n)print*,求解doi=1,nprint10,i,c(i)enddo10format('x',i1,'=',f8.4)deallocate(a)deallocate(b)deallocate(c)endsubroutineinput(a,n)reala(n,n)doi=1,nread*,(a(i,j),j=1,n)enddoendsubroutineGauss_jordan(a,b,c,n)dimensiona(n,n),b(n),c(n)callup(a,b,n)calllow(a,b,n)forall(i=1:n)c(i)=b(i)/a(i,i)endforallendsubroutineoutput(a,b,n)reala(n,n),b(n)doi=1,nprint10,a(1,1),idoj=2,nif(a(i,j)0)thenprint20,a(i,j),jelseprint30,abs(a(i,j)),jendifenddoprint40,b(i)enddo10format(f5.2,'x',i1\)20format('+',f5.2,'x',i1\)30format('-',f5.2,'x',i1\)40format('=',f8.4)endsubroutineup(a,b,n)reala(n,n),b(n)doi=1,n-1doj=i+1,np=a(j,i)/a(i,i)a(j,i:n)=a(j,i:n)-a(i,i:n)*pb(j)=b(j)-b(i)*penddoenddoendsubroutinelow(a,b,n)reala(n,n),b(n)doi=n,2,-1doj=i-1,1,-1p=a(j,i)/a(i,i)a(j,1:i)=a(j,1:i)-a(i,1:i)*pb(j)=b(j)-b(i)*penddoenddoend方程组运行结果三、编写程序完成链表的建立、插入、查找和删除等操作。用链表完成学生情况的管理,已知学生信息包括姓名、学号和一门课成绩。建立包括n个学生节点的链表(n由键盘输入),完成按学号的排序、插入、查找和删除等操作。操作由菜单选择。modulelinktypenodeintegernumcharacter(10)namerealscoretype(node),pointer::nextendtypecontainssubroutinecre

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功