• 検索結果がありません。

定数は意味のある名前をつけた変数に代入して使う

ドキュメント内 Fortran (2015 ) (ページ 38-44)

第 2 章 手順の繰り返しと条件分岐 19

2.4 プログラミング スマートテクニック ( その 2)

2.4.7 定数は意味のある名前をつけた変数に代入して使う

数学的に決まっている単純な定数(2倍するとか,1を加えるとか,3乗するとか)の場合以外は,でき るだけ定数の使用量を減らすほうがいいと思います.プログラムを書いている時には理解していても時

間が経ってから読んだ時に意味がわからなくなる可能性があるからです.

例えば,電子の質量me (= 9.10938356×1031 kg)と光の速度c (= 2.99792458×108 m/s)を使って 計算すればmec2 = 8.1871056497×1014 Jですが,これを単位とするエネルギー,energy/mec2を計 算するプログラムを,

ene = energy/8.1871056497e-14

と書くと,後で8.1871056497×10−14という数字がどこから来たのかわからなくなる可能性があります.

こういう時には多少面倒でも,

me = 9.10938356e-31 ! 電子の質量

cl = 2.99792458e8 ! 真空中の光速

mc2 = me*cl**2 ene = energy/mc2

としておけば,わかりやすいしプログラム内容の記録にもなります.

また,doブロックを100回繰り返す,とか,10回ごとに出力する,とかいう制御数も,変数にしてお けば数値の意味が明示されるし,変更もしやすくなります.例えば,

do i = 1, 100 ! 1001個

a(i) = b(i)**2 enddo

sum = 0

do i = 1, 100 ! 100が1個

sum = sum + a(i) enddo

ave = sum/100 ! 1001個

というプログラムにおいて,100という数は配列要素数に依存する共通の数値ですから,以下のように 変数にします.

imax = 100 ! 100を変更するときはここだけでOK

do i = 1, imax a(i) = b(i)**2 enddo

sum = 0

do i = 1, imax sum = sum + a(i) enddo

ave = sum/imax

こうしておけば意味がはっきりするし,100を200に変更したい時には変更点が1カ所ですみます.こ のような変数化はプログラムが長くなるほど価値が増します.

演 習 問 題 2

(2–1) 繰り返し出力

i=1,2,3,...,nの整数に対し,ii2,1/i,

iの値を並べて出力するプログラムを作成せよ.なお,整数 と実数の変換に注意すること.

(2–2) 統計計算

1次元配列,a(n)に,1,2,3,...のデータを順にn個代入し,

平 均 A=¯ 1 n

n i=1

Ai

標準偏差 σ= vu ut1

n

n i=1

(Ai−A)¯ 2

を計算するプログラムを作成せよ.

次に,a(n)1,3,5,...と奇数を順にn個入れて,同様に平均と標準偏差を計算するプログラムを追加

せよ.

(2–3) 定積分

等間隔hごとに並んだ座標点x1(=a)x2· · ·xn(=b)に対して,関数値,f(x1),f(x2),· · ·f(xn) が与えられているとする.このときf(x)の定積分を

b

a

f(x)dxh (1

2f(x1) +f(x2) +· · ·+f(xn1) + 1 2f(xn)

)

と近似的に計算する方法を台形公式という.以下に与えた関数と積分範囲の定積分値を台形公式を使っ て計算せよ.その際,分割数nが大きくなるほど正確な値に近づくことも確かめよ.

     (1) f(x) = sin(x)a= 0b=π      (2) f(x) = (x2)3a= 1,b= 5 (2–4) 漸化式

次の漸化式で計算される数値を,それぞれ,配列a(n)b(n)に代入し,それぞれの平均と標準偏差 を計算せよ.

(1) ai+1 = 3ai+ 2,   a1 =1 (2) bi+1 = 2

3bi4,   b1 = 3

(2–5) テーラー展開

テーラー展開の公式から指数関数や三角関数を計算するプログラムを作成せよ.ただし,第0項から 第n項までの指数関数と三角関数のテーラー展開の係数は以下の通りである.

ex = 1 + x 1!+x2

2! +x3

3! · · ·+xn

n! =

n i=0

xi i! cosx = 1 x2

2! + x4

4! · · ·+ (1)n x2n

(2n)! =

n i=0

(1)i x2i (2i)!

sinx = x−x3 3! +x5

5! · · ·+ (1)n x2n+1 (2n+ 1)! =

n i=0

(1)i x2i+1 (2i+ 1)!

次数nと変数値xは複数個選んで計算し,組み込み関数で計算した値と比較して,nが大きくなるほ ど正確な関数値に近づくこと,xが大きくなるほど近似が悪くなることなどを確かめよ.

(2–6) 2次方程式の解 (解の判別付き)

3個の実変数abcに適当な値を代入し,それから,

ax2+bx+c= 0

の解を計算して出力するプログラムを作成せよ.まず,解の判別式,D=b24ac,を計算して,2 解になった時,重解になった時,虚解になった時でそれぞれ正しい結果を出力するようにせよ.さらに,

その解をax2+bx+cに代入して0に近い値になることを,判別式の値と数値型に応じて計算手順を変 えて確かめよ.

(2–7) 非線形方程式の解法:逐次代入法

x0= 0として,次のように次々に代入していくと,xnは徐々にcosx=xの解に近づくことがわかっ ている.

x1 = cosx0

x2 = cosx1 x3 = cosx2

.. . xn+1 = cosxn

最初に,この代入を100回繰り返し,その後で101回目の値x101と 100回目の値x100の差を計算す るプログラムを作成せよ.

それができたら,収束条件を|xn+1−xn|< εとし,εを適当に小さい値に定めて(例えば,107),収 束したらxnを出力して終了するプログラムにせよ.このとき,収束するまでの回数も出力せよ.

なお,この問題では配列を使わないこと.

(2–8) 非線形方程式の解法:Newton法

次の公式を繰り返し用いて方程式f(x) = 0の解を近似的に求めるアルゴリズムをNewton法という.

xn+1 =xn f(xn) f0(xn)

以下の関数f(x)に対し,適当な初期値x0を与えてNewton法で解を求めるプログラムを作成せよ.

また収束条件を|xn+1−xn|< εとし,εは適当に定めよ.このとき,収束するまでの回数も出力せよ.

     (1) f(x) =x−cos(x)      (2) f(x) =x32

それぞれの問題に対し,得られた結果をf(x)に代入して,答えがどの程度0に近いかを確認せよ.

(2–9) 常微分方程式(初期値問題)の解法:サイクロトロン運動

一様な磁場中での荷電粒子の速度v(t) = (u(t), v(t))は次の運動方程式を満足する.この運動方程式 をオイラー法で解け.ただし,サイクロトロン周波数ωcは一定とする.

du dt =ωcv dv

dt =−ωcu

ここで1回の時間ステップを∆tとしてfn=f(n∆t)とした時に,オイラー法とはnステップ目の値 fnn+ 1ステップ目の値fn+1を使って df

dt ' fn+1−fn

∆t という近似で時間微分を評価する方法であ る.例えば,x方向は

un+1−un

∆t =ωcvn

と近似できるから,これを変形して,un+1=un+ωcvn∆tとなる.vn+1も同様に変形すれば,オイラー 法とは次の連立の漸化式を使って(un, vn)から(un+1, vn+1)を計算することである.

un+1 =un+ωcvn∆t vn+1 =vn−ωcun∆t 1周期2π

ωc を適当な回数Nで分割して∆tを決定し,初期条件u0 = 1,v0= 0から出発して,オイラー 法でN回計算するようなプログラムを作成せよ.そして,その結果得られる1周期後の速度,uNvNu0v0を比較せよ.また,10周期後の速度,u10Nv10N とも比較せよ.

次に,オイラー法を少し修正したシンプレクティック法,(vn+1の式に注意! ) un+1 =un+ωcvn∆t

vn+1 =vn−ωcun+1∆t のプログラムを作成し,オイラー法の結果と比較せよ.

なお,以上のプログラムは 配列を使わないで作成すること.

(2–10) 常微分方程式(境界値問題)の解法:1次元ポワソン方程式 電荷密度ρ(x)が与えられているときに電位が満足する1次元ポワソン方程式

d2V(x)

dx2 =−ρ(x) を解くには,以下のようにする.

等間隔hごとに並んだx座標点xi =hi,(i= 0〜N)に対して,Vi=V(xi),ρi =ρ(xi)として,上式 の左辺を差分で近似すれば,

Vi+12Vi+Vi1

h2 =−ρi

となる.これを座標点に関して書き下せば,

V02V1+V2 =−ρ1h2 V12V2+V3 =−ρ2h2 V22V3+V4 =−ρ3h2

.. .

VN22VN1+VN =−ρN1h2

になるが,両端の電位V0 =V(x0),VN =V(xN)が与えられていれば,これらはV1V2· · ·VN1に 対する連立1次方程式になる.

一般に,連立1次方程式,

aiVi1+biVi+ciVi+1 =dii= 1,2, . . . , N 1) をV0VN を与えて解くときには,まず,G0 = 0H0=V0から出発して,

Gi = ci

bi+aiGi1

, Hi= di−aiHi1

bi+aiGi1

i= 1,2, . . . , N1

を計算し,次に,Viを以下の式で計算する(計算の方向に注意! ).

Vi =GiVi+1+Hii=N 1, N 2, . . . ,1)

以上の方法を用いて,次の2種類の電荷密度と境界条件における電位を計算するプログラムを作成 せよ.

(1) ρ(x) = 0       境界条件は,V0 = 0,VN = 1 (2) ρ(x) = sin

(2πx N h

)

   境界条件は,V0 = 0,VN = 0

ドキュメント内 Fortran (2015 ) (ページ 38-44)