当前位置:文档之家› fortran常用算法的程序设计举例

fortran常用算法的程序设计举例



4
2. 梯形法
$ 10
第i个小梯形面积 :
100 f (a ih ) f (a (i 1)h) $ si h 2 200
1 read(*,*) a,b,n 求 : sin xdx 0 x=a h=(b-a)/n s=0.0 do 10 i=1,n si=(sin(x+(i-1)*h)+ sin(x+i*h))*h/2.0 s=s+si continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x, 'b=',f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
ca 其中h a 2 h { f (a) f (b) 4[ f (a h) f (a 3h)] 2 f (a 2h)} 3
b
f ( x)dx s1 s2
7
如果将(a,b)分成四个小区间:
h a f ( x)dx 3 { f (a) f (b) 4[ f (a h) f (a 3h) f (a 5h) f (a 7h)] 2[ f (a 2h) f (a 4h) f (a 6h)} ba 其中h 2 4
17
五、计算机模拟
计算机模拟(Computer Simulation),又称 “仿真”:用计算机模仿实物系统进行测试,从 测试的结果获得期望的资料。
根据模拟对象的不同特点,可分为: 确定性模拟(Deterministic Mode); 随机性模拟(Stochastic Mode) 。
18
小球以10m/s沿 45 °斜抛,落地反 弹方向同前,速度 减小 10% ,求前三 次周期轨迹。
其他几种 程序变形
$ 10
. . . x2=a . . . do 10 i=1,n x1=x2 x2=x2+h si=(sin(x1)+ sin(x2))*h/2.0 s=s+si continue . . . 10
. . . f1=sin(a) . . . do 10 i=1,n f2=sin(a+i*h) si=(f1+f2)*h/2.0 s=s+si f1=f2 continue . . .
10
x3 2 x 2 2 x 2 0
x ( x3 2 x 2 2) 2
10
因有收敛问题,要 设最大循环次数。 100 200 $
有的g(x)是收敛的,而有的g(x)是不收敛的。 同一个g(x),对某些x0是收敛的,对有的x0则是不 收敛的。 如果g(x)具有一阶导数连续,且对于所有的x, 若|g’(x)|≤q<1(q为一个定数),那么x=g(x)对于任 意的x0均收敛,且q愈小,收敛速度愈快。如果不 满足对所有的x存在|g’(x)|≤q<1 ,则可能对有的x0 收敛,对有的x0不收敛。 因此要恰当的选择g(x)形式和初值x0。
3
1. 矩形法
10
第i个小矩形面积: si h f (a (i 1)h)
100 $ 200
1 read(*,*) a,b,n x 求 : e dx x=a 0 h=(b-a)/n f0=exp(x) s=0.0 do 10 i=1,n si=f0*h s=s+si x=x+h f0=exp(x) continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x,'b=', f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
11
2. 牛顿迭代法
求f ( x) x3 2 x 2 4 x 1=0在x 0附近的一个实根 f ( x) 3x 2 4 x 4
10
f ( x1 )
f ( x1 ) x1 x2 f ( xn ) f ( xn )
xn 1 xn
100 $
read(*,*) x n=1 x1=x f=x1**3-2.0*x1**2+4.0*x1+1.0 f1=3.0*x1**2-4.0*x1+4.0 x=x1-f/f1 write(*,100) n,x1,x n=n+1 if(abs(x-x1).gt.1e-6) goto 10 format(1x,'n=',i3,3x,'x1=',f15.7, 3x,'x=',f15.7) end

5
10
. . . f0=sin(a) h=(b-a)/n s=f0 do 10 i=1,n f=sin(a+i*h) s=s+2.0*f continue s=(s-sin(b))*h/2.0 . . .

b
ห้องสมุดไป่ตู้
a
f ( x)dx
h f0 2( f1 f 2 f n ) f n ) 2
15
三、求函数极值
求 : f ( x) x 2 4x 5的极小值
Fibonacci搜索算法,或0.618法,或黄金值搜索法。
16
10
real low,high,x1,x2 read(*,*) low,high write(*,200) x1=low+0.618*(high-low) x2=high-0.618*(high-low) if(high-low.gt.1e-4) then f1=x1*x1-4.0*x1+5.0 f2=x2*x2-4.0*x2+5.0 write(*,202) x1,f1,x2,f2 if(f1.gt.f2) then high=x1 x1=x2 x2=high-0.618*(high-low) else low=x2 x2=x1 x1=low+0.618*(high-low) end if goto 10 end if
12
3. 二分法
5
10
用二分法求 f ( x) x 3 6 x 1 0 在x 2附近的一个实根
$
100
read(*,*) x1,x2 f1=x1**3-6.0*x1-1.0 f2=x2**3-6.0*x2-1.0 if(sign(f1,f2).eq.f1) goto 5 x=(x1+x2)/2.0 f=x**3-6.0*x-1.0 if(sign(f,f1).eq.f) then x1=x f1=f else x2=x f2=f end if if((abs(x1-x2).gt.1e-5).and. abs(f).gt.1e-6) goto 10 if(abs(f).gt.1e-6) x=(x1+x2)/2.0 write(*,100) x format(1x,'x=',f15.7) end
b
如果将(a,b)分成n个小区间:
h f ( x ) dx { f (a) f (b) 4[ f (a h) f (a 3h) f (a (2n 1)h)] a 3 2[ f (a 2h) f (a 4h) f (a (2n 2)h)}
13
4. 弦截法(割线法)
5
20
$
x2 x1 x x2 f ( x2 ) f ( x2 ) f ( x1 )
x3 2 x 2 7 x 4 0
100
read(*,*) x1,x2 f1=x1**3-2.0*x1**2+7.0*x1+4.0 f2=x2**3-2.0*x2**2+7.0*x2+4.0 if(sign(f1,f2).eq.f1) goto 5 f=1.0 if((abs(x1-x2).gt.1e-5).and. abs(f).gt.1e-6) then x=x2-(x2-x1)/(f2-f1)*f2 f=x**3-2.0*x**2+7.0*x+4.0 if(sign(f,f1).eq.f) then x1=x f1=f else x2=x f2=f end if goto 20 end if if(abs(f).gt.1e-6) x=(x1+x2)/2.0 write(*,100) x format(1x,'x=',f15.7) end 14
19
5 $
logical flag parameter (g=9.8) read(*,*) v0,d t=0.0 x0=0.0 v=v0*cos(3.1415926/4.0) do 10 i=1,3 dt=d flag=.true. x=v*t+x0 y=v*t-0.5*g*t**2 if(flag) then if(y.ge.0.0) then if(dt.ge.d) write(*,100) t,x,y t=t+dt x=v*t+x0 y=v*t-0.5*g*t**2 else
以上方法都是近似求根,得到不是准确值而是近 似值。但只要给定的误差足够小,就可以认为它们之 间足够近似。 事实上,只有少数的方程才能用解析的方法求出 准确的根值。 计算机可以解任何有实根的一元方程,它采用的 基本方法就是迭代,经过多次迭代,使近似根逐渐趋 近于真实根。迭代可以用循环实现,正好充分发挥计 算机快速运算的特点。
6
3. Sinpson法 取a,b中点c—((a+b)/2,0),通过 f(a),f(b),f(c)三点可作唯一一条抛物 线f1(x)。
根据抛物线定积分求值公式,有:
h a f1 ( x)dx 3 [ f (a) 4 f (c) f (b)] ba 其中h 2
相关主题