您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 兰州交通大学fortran课程设计
目录1求一元方程的根和求定积分.................................................................11.1求一元方程的根.........................................................................1二分法.............................................................................................11.1.1弦截法................................................................................31.1.2牛顿迭代法........................................................................51.2求定积分.....................................................................................71.2.1矩形法................................................................................71.2.2梯形法................................................................................91.2.3辛普生法:......................................................................112求解线性方程组................................................................................133编写程序完成链表的建立、插入、查找和删除等操作................17Fortran课程设计11求一元方程的根和求定积分1.1求一元方程的根作业要求1、采用函数子程序定义一元方程;2、程序选择以下三种方法求该方程的根;METHOD=1牛顿迭代法METHOD=2二分法1METHOD=3弦截法3、对于不同的近似算法分别编写子程序,精度要求10-6。本题用二分法、弦解法和牛顿迭代法求x3-2x2+7x+4=0的根来编写程序求解。二分法二分法基本思路:现任取两个值x1和x2,使得f(x1)*f(x2)0,也就是f(x1)和f(x2)必须异号。这才能保证在[x1,x2]区间有解,即存在一个x使得f(x)=0。令x=(x1+x2)/2,如果f(x)=0,就找到了这个解,计算完成。由于f(x)是一个实型数据,所以在判断f(x)是否等于0时,是通过判断|f(x)|是否小于一个很小的数ε,如果是就认为f(x)=0。若f(x)不等于0,判断如果f(x1)和f(x)异号,就说明解在[x1,x]区间,就以x1,x为新的取值重复步骤(2),这时用x代替否则x2,否则反之,直到找到满足条件的解为止。程序编写如下:programlt12_1realx1,x2,xrealbisect,func!对要调用的子程序作说明do!输入x1和x2直到f(x1)和f(x2)异号为止print*,'输入x1,x2的值:'read*,x1,x2Fortran课程设计2if(func(x1)*func(x2)0.0)exitprint*,'不正确的输入!'enddox=bisect(x1,x2)!调用二分法求解函数print10,'x=',x!输出计算结果10format(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**3-2*x**2+7*x+4endFortran课程设计3运行结果:1.1.1弦截法弦截法的基本思路:现任取两个值x1和x2,使得f(x1)*f(x2)0。(1)做一条通过(x1,f(x1))和(x2,f(x2))两点的直线,这条直线与x轴的交点为x。可用以下公式求出X=x2-(x2-x1)*f(x2)/(f(x1)-f(x2)),(2)代入函数求得f(x),判断|f(x)|是否小于一个很小的数ε,如果是就认为f(x)=0。(3)否则,判断如果f(x1)和f(x)异号,就说明解在[x1,x]区间,就以x1,x为新的取值重复步骤(2),否则反之,然后以同样的办法再进一步缩小范围,直到|f(x)|ε。程序编写如下:realx1,x2,xrealsecant,func!对要调用的子程序作说明do!输入x1和x2直到f(x1)和f(x2)异号为止print*,'输入x1,x2的值'read*,x1,x2if(func(x1)*func(x2)0)exitprint*,'不正确的取值'enddox=secant(x1,x2)!调用弦截法求解函数print10,'x=',x!输出计算结果10format(a,f15.7)Fortran课程设计4Endrealfunctionsecant(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**3-2*x**2+7*x+4end运行结果:Fortran课程设计51.1.2牛顿迭代法牛顿迭代法基本思路(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,dfunc!对要调用的子程序作说明Fortran课程设计6integeri,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=',x1!输出计算结果10format('i=',i4,6x,'x=',f15.7)20format(a,f15.7)Endrealfunctionfunc(x)!迭代函数realxfunc=x**3-2*x**2+7*x+4endrealfunctiondfunc(x)realxdfunc=3*x**2-4*x+7end运行结果:Fortran课程设计71.2求定积分作业要求:1、采用函数子程序定义函数f(X);2、程序选择以下三种方法求定积分:矩形法、梯形法、辛普生法3、对于不同的算法分别编写子程序,选择调用,比较不同方法求解的精度。本题我们用10)sin1(dxx来讨论矩形法、梯形法、辛普生法求定积分的方法。1.2.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)EndFortran课程设计8realfunctionrectangle(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)end运行结果:n=10时的输出结果Fortran课程设计9n=100时的输出结果n=1000时的输出结果1.2.2梯形法梯形法基本思路同上,用小梯形面积代替小曲边梯形第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,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)implicitnoneFortran课程设计10realx,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)end运行结果:Fortran课程设计11n=10时的输出结果n=100时的输出结果n=1000时的输出结果1.2.3辛普生法:程序编写如下: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)implicitnoneFortran课程设计12reala,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
本文标题:兰州交通大学fortran课程设计
链接地址:https://www.777doc.com/doc-6889314 .html