問13 次の Fortran プログラムの説明及びプログラムを 読んで,設問 1,2 に答えよ。
〔プログラムの説明〕
区間[a,b]における関数 f (x) の定積分 T を,ロンバーグ積分法に よって数値的に求めるプログラムである。
h b-a s(x0,x1) = ---- {f (x0) + f (x1)}, h = ---- 2 k
と近似する。これを区間[a,b]にわたり,すべて足し合わせた
Tn,0 = s(x0,x1) + s(x1,x2) + … + s(xk−2,xk−1) + s(xk−1,xk) が,区間を 2n 等分したときの積分値の第 0 近似である。 n = 0,1,2,… として繰り返し計算して収束解を求める。
Tn,m = (4m Tn+1, m−1 − Tn, m−1) / (4m − 1), (1≦m≦n) 例えば,n = 0,1,2 の 3 通りについて,台形近似の積分値 T0,0,T1,0,T2,0を得た場合, 漸化式に従い T0,0 と T1,0 から T0,1 が, T1,0 と T2,0 から T1,1 が得られる。 更に,得られた T0,1 と T1,1を用いて, T0,2を得ることができる (図1参照)。
〔プログラム〕
(行番号) 01 program Romberg 02 integer, parameter :: NMAX=4, DOUBLE=kind(1.0d0) 03 real (kind=DOUBLE), parameter :: EPS=1.0d-10 04 real (kind=DOUBLE) :: a,b,h,f,fab,p,x,sum,del 05 real (kind=DOUBLE), dimension(0:NMAX,0:NMAX) :: t 06 integer :: i,k,n,m 07 ! 08 a=0.0 09 b=1.0 10 del=1.0 11 h=b-a 12 fab=(f(a)+f(b))/2 13 t(0,0)=h*fab 14 write(*,'(i5,f20.15)') 0,t(0,0) 15 ! 16 n=0 17 k=1 18 do while (del >= EPS) 19 n=n+1 20 k=k*2 21 h=h*0.5 22 if(n > NMAX) then 23 write(*,*) ' no convergence' 24 stop 25 endif 26 x=a+h 27 sum=fab 28 do i=1,k-1 29 sum=sum+f(x) 30 x=x+h 31 enddo 32 t(n,0)=sum*h 33 do m=1,n 34 p=4.0**m 35 t(n-m,m)=(p*t(n-m+1,m-1)-t(n-m,m-1))/(p-1.0) 36 enddo 37 write(*,'(i5,f20.15)') n,t(0,n) 38 del=abs(t(0,n)-t(0,n-1)) 39 enddo 40 write(*,100) t(0,n),del 41 100 format(' integral:',f20.15,' error:',f20.15) 42 end program Romberg 43 ! 44 function f(x) 45 real (kind=kind(1.0d0)) :: f 46 real (kind=kind(1.0d0)), intent(in) :: x 47 f=1.0d0/(1.0d0+x*x) 48 end function f
解答群
ア T0,1 = (4 T1,0 − T0,0) / 3
イ T1,1 = (4 T2,0 − T1,0) / 3
ウ T0,1 = (16 T1,0 − T0,0) / 15
エ T1,1 = (16 T2,0 − T1,0) / 15
このプログラムを実行したところ,図 2 のように“no convergence”と いうメッセージを出力して終了した。このとき,関数副プログラム f (x) は 回呼び出された。
プログラムでは台形近似の分点数が増えたとき, すべての分点について関数値を計算している。 しかし,そのうちの半分は既に計算済みなので,それを利用するようにしたい。 そのためには 27〜32 行目をプログラム に変更する。これによって出力結果は変わらず,関数 f (x) は 回呼び出される。
a,c に対する解答群
ア 11 イ 13 ウ 15 エ 17
オ 26 カ 28 キ 30 ク 32
b に対する解答群 ア 27 sum=0.0 28 do i=1,k-1,2 29 sum=sum+f(x) 30 x=x+h 31 enddo 32 t(n,0)=t(n-1,0)/2+sum*h イ 27 sum=fab 28 do i=1,k-1,2 29 sum=sum+f(x) 30 x=x+h 31 enddo 32 t(n,0)=t(n-1,0)/2+sum*h ウ 27 sum=0.0 28 do i=1,k-1,2 29 sum=sum+f(x) 30 x=x+2*h 31 enddo 32 t(n,0)=t(n-1,0)/2+sum*h エ 27 sum=fab 28 do i=1,k-1,2 29 sum=sum+f(x) 30 x=x+2*h 31 enddo 32 t(n,0)=t(n-1,0)/2+sum*h