平成8年度 秋期 第二種 午後 問13 [更新日]1996.11.19 問13 次のFortranプログラムの説明及びプログラムを読んで,設問に答えよ。 〔プログラムの説明〕 実数値を与え,その実数値を二つの整数の比で近似するアルゴリズムがある。 (1) 任意の実数rを二つの整数の比で近似する手順を,r=3.141592を例に説明する。 31 とおけば、 1/r1 = 0.141592 となり r1 ≒ 7.062546 が求まる。同様にして、7<r1<8であるから r1 = 7 + 1/r2 とおけば、 1/r2 = 0.062546 となり r2 ≒ 05.988233 が求まる.この操作を続けることによって整数の数列3,7,15,1,.... 得られる。 3,7,15,1を用いて,実数rの近似値を計算すると r3 ≒ 1 r2 ≒ 15+1/1=16 r1 ≒ 7+1/16=113/16 r ≒ 3+16/113=355/113≒3.141593 が求まる。rの値を整数355と113の比として近似したとき, 真値と近似値の差の絶対値として定義した近似誤差は |r-355/113|≒0.000001 になる。 (2) このプログラムでは、整数n(n=2,3,…,10)の平方根を組込み関数で求め、 その値を近似する二つの整数値及びその近似値を計算して,印字する。このとき 近似誤差が0.00001未満になるまで(1)で説明した操作を繰り返す。 (3)実行結果は図のとおりである。 n 近似値 近似誤差 繰返し回数 ↓ ↓ ↓ ↓ +----------------------+-+----------------+ | 2 577/408=1.4142157| |ERR=0.0000021 8| | 3 362/209=1.7320574| |ERR=0.0000066 10| | 4 2/ 1=2.0000000| |ERR=0.0000000 1| | 5 682/305=2.2360656| |ERR=0.0000024 5| | 6 485/198=2.4494949| |ERR=0.0000052 6| | 7 717/271=2.6457565| |ERR=0.0000051 10| | 8 577/204=2.8284314| |ERR=0.0000042 8| | 9 3/ 1=3.0000000| |ERR=0.0000000 1| | 10 721/228=3.1622807| |ERR=0.0000030 4| +----------------------+-+----------------+ 領域1 領域2 図 実行結果 〔プログラム〕 (行番号) 1 DOUBLE PRECISION R,XA,XB,ER 2 INTEGER,DIMENSION(20)::MM,MA,MB 3 PARAMETER (ER=0.00001D0) 4 100 FORMAT(2I6,'/',I4,'=',F9.7,3X,'ERR=',F9.7,I4) 5 DO N=2,10 6 R=SQRT(DBLE(N)) !近似する実数値 7 MM(1)=INT(R) 8 MA(1)=MM(1) !分子 9 MB(1)=1 !分母 10 XB=MM(l) !第1近似 11 XA=R-XB !近似誤差 12 J=1 13 DO WHILE(ABS(R-XB).GE.ER) 14 J=J+1 15 XA=1.0D0/XA 16 MM(J)=INT(XA) 17 XA=XA-MM(J) 18 MA(J)=MM(J) 19 MB(J)=1 20 DO K=J-1,1,-1 21 MB(K)=MA(K+1) 22 MA(K)=MM(K)*MB(K)+MB(K+1) 23 END DO 24 XB=DBLE(MA(1))/DBLE(MB(1)) !第J近似 25 END DO 26 WRITE(*,100)N,MA(1),MB(1),XB,ABS(R-XB),J 27 END DO 28 END 設問 プログラムと実行結果を分析し,次の記述中の〔 〕に入れる正しい答えを, 解答群の中から選ベ。なお,解答は重複して選んでもよい。 (1)このプログラムの8行目を MA(1)=R に書き換えてプログラムを実行したとき,図の領域1の印字は書換え前と 〔 a 〕 結果になる。 (2)元のプログラムの8行目は変更しないで,9行目だけを MA(2)=MM(1) に書き換えてプログラムを実行したとき,図の領域1の印字は書換え前と〔 b 〕 結果になる。また,領域2の印字は書換え前と〔 c 〕結果になる。 (3)元のプログラムは2,9,19,21,22,24,29行目を修正すれば,配列MBを使用しないで 記述できる。21行目を削除し,22行目を MA(K)=MM(K)*MA(K+1)+MA(K+2) と書き換えたとき,19行目の修正として適切なものは 〔 d 〕 である。 解答群 a 答カb 答オc 答カd 答ウ ア MA(J-1)=1 イ MA(J-1)=MM(J) ウ MA(J+1)=1 エ MA(J+1)=MM(J) オ 一部の行が事なる カ 全ての行が同じ キ すべての行が異なる
n 近似値 近似誤差 繰返し回数 ↓ ↓ ↓ ↓ +----------------------+-+----------------+ | 2 577/408=1.4142157| |ERR=0.0000021 8| | 3 362/209=1.7320574| |ERR=0.0000066 10| | 4 2/ 1=2.0000000| |ERR=0.0000000 1| | 5 682/305=2.2360656| |ERR=0.0000024 5| | 6 485/198=2.4494949| |ERR=0.0000052 6| | 7 717/271=2.6457565| |ERR=0.0000051 10| | 8 577/204=2.8284314| |ERR=0.0000042 8| | 9 3/ 1=3.0000000| |ERR=0.0000000 1| | 10 721/228=3.1622807| |ERR=0.0000030 4| +----------------------+-+----------------+ 領域1 領域2 図 実行結果 〔プログラム〕 (行番号) 1 DOUBLE PRECISION R,XA,XB,ER 2 INTEGER,DIMENSION(20)::MM,MA,MB 3 PARAMETER (ER=0.00001D0) 4 100 FORMAT(2I6,'/',I4,'=',F9.7,3X,'ERR=',F9.7,I4) 5 DO N=2,10 6 R=SQRT(DBLE(N)) !近似する実数値 7 MM(1)=INT(R) 8 MA(1)=MM(1) !分子 9 MB(1)=1 !分母 10 XB=MM(l) !第1近似 11 XA=R-XB !近似誤差 12 J=1 13 DO WHILE(ABS(R-XB).GE.ER) 14 J=J+1 15 XA=1.0D0/XA 16 MM(J)=INT(XA) 17 XA=XA-MM(J) 18 MA(J)=MM(J) 19 MB(J)=1 20 DO K=J-1,1,-1 21 MB(K)=MA(K+1) 22 MA(K)=MM(K)*MB(K)+MB(K+1) 23 END DO 24 XB=DBLE(MA(1))/DBLE(MB(1)) !第J近似 25 END DO 26 WRITE(*,100)N,MA(1),MB(1),XB,ABS(R-XB),J 27 END DO 28 END 設問 プログラムと実行結果を分析し,次の記述中の〔 〕に入れる正しい答えを, 解答群の中から選ベ。なお,解答は重複して選んでもよい。 (1)このプログラムの8行目を MA(1)=R に書き換えてプログラムを実行したとき,図の領域1の印字は書換え前と 〔 a 〕 結果になる。 (2)元のプログラムの8行目は変更しないで,9行目だけを MA(2)=MM(1) に書き換えてプログラムを実行したとき,図の領域1の印字は書換え前と〔 b 〕 結果になる。また,領域2の印字は書換え前と〔 c 〕結果になる。 (3)元のプログラムは2,9,19,21,22,24,29行目を修正すれば,配列MBを使用しないで 記述できる。21行目を削除し,22行目を MA(K)=MM(K)*MA(K+1)+MA(K+2) と書き換えたとき,19行目の修正として適切なものは 〔 d 〕 である。 解答群 a 答カb 答オc 答カd 答ウ ア MA(J-1)=1 イ MA(J-1)=MM(J) ウ MA(J+1)=1 エ MA(J+1)=MM(J) オ 一部の行が事なる カ 全ての行が同じ キ すべての行が異なる