フォートランにはデフォルトでいくつかの関数が用意されているが,ユーザー
が独自に関数を定義して用いたい場合は「関数副プログラム」というものをつかって関数を定義することが出来る.使い方は
t function f(a1,a2,....aN)
......
f=.....
return
end
function文 |
f=.... |
関数副プログラムの定義をおこなう |
t |
型宣言:real*8, integerなど |
a1,a2,...aN |
仮引数:型宣言をすること |
プログラム中で用いる時は,
b=f(c1,c2,....cn)
のように引数を代入して行う.
たとえば, 1からnまでの総和を求める関数副プログラムは
integer function souwa(n)
implicit none
integer i,n
souwa=0
do i=1,n
souwa=souwa+i
enddo
return
end
implicit none
integer souwa,n
read(5,*) n
write(6,*) souwa(n)
end
注意点
- 関数副プログラムを定義する部分では()はつかない(関数の名自体に値が入る)
- 関数副プログラムを使用する時は, 定義した時と同じ型をで関数名を宣言する必要がある
練習問題1
1) n!を計算する関数副プログラム fact(n)を作成せよ.
2) n個のものからm個のものを取り出す組み合わせの数 nCmを計算する関数副
プログラムを作成せよ.
3) 二項定理によると,f(x,y,n)=(x+y)**nは
(x+y)**n=ΣnCm x**(n-m)y**m
となる.f(x,y,n)を計算する関数副プログラムを作り,x=0.3,y=0.7,n=10として実行し,結果が1.0になることを確かめよ.
[2] オイラー法
一階の常微分方程式
 |
(1) |
を初期条件 t=t0 のとき y=y0 のもとで解くことを考える.tをtn=t0+n△tと△
tづつ増加させるとき,n回目の値 yn=y(tn)を順に求めていく.
最も単純な方法は,
 |
(2) |
としてどんどん足し算していく方法である.これをオイラー法と呼ぶ.
練習問題2
次の常微分方程式
 |
(3) |
を初期条件t=0のときy=1のもとでt=2まで解き,解析的に得られる解
 |
(4) |
と比較せよ.時間刻みを変化させて(1.D-1, 1.D-2, 1.D-3)誤差の変化を観察せよ.
[3]常微分方程式その2 「Δtの二次の精度」
オイラー法における誤差はΔtに比例する(一ステップの誤差はΔtの二乗に比例するため).すな
わち誤差を10分の1にしたければΔtを1/10にする必要がある.これは計算にかか
る時間が10倍になることを意味する.これでは時間がかかってしょうがない.
そこでΔtの2乗,4乗に誤差が比例するようなアルゴリズムが存在する.4乗に
比例するものはルンゲクッタ法と呼ばれ広く用いられている.
ルンゲクッタ法に入る前に誤差がΔtの2乗に比例するアルゴリズムについて考
えてみよう.
 |
(5) |
という微分方程式が与えられたものとする.タイムステップがΔtのとき,n+1
ステップ目のyの値yn+1は,ynを用いて
 |
(6) |
と書くことができる.ここでy''は二次の微係数で
 |
(7) |
となる.2項出てくることに注意.これを用いると先ほどの式は
 |
(8) |
のようにかきかえられる.ここでポイントは,我々はft,fyを知らないと言うことである.なので別の式でさらに書き替えないといけない.そのため式(8)が,以下のように書けるものと仮定する.
 |
(9) |
ここでf1,f2は
である.f2の中身に注意.f1,f2はそれぞれtnでの傾き,および傾きk1でΔt
秒進んだとしたときのt+Δt秒後の傾きを表す.この二つの傾きを適当に重ね
合わせることによりΔtの二乗の精度にすることができる.(11)式をテーラー展
開すると,λ1,λ2,α,βの間の関係式が
と求めることができる.求めるべき数が4つあるのに式が3つしか存在しない.なのでいろいろな値の組み合わせが
 |
(15) |
 |
(16) |
といったようにありうる.いずれの場合も二次の精度まで正しく計算できる.つまり一ステップの誤差はΔtの3乗に比例する. 今回は(15)式を採用し,以下の(17)-(19)式で積分を行う.
 |
(17) |
練習問題3
式(17),(18),(19)を用いて,上で解説した方法を用いて先の例の積分を行
え.オイラー法の場合と精度を比較せよ.
[4] ルンゲクッタ法
先ほどのアルゴリズムの誤差はΔtの二乗である.これを4乗に高めたの
がルンゲクッタ法である.
さきほどと同じ考え方を使うと,ルンゲクッタ法のアルゴリズムは以下のよう
になる.
 |
(20) |
練習問題3
式(20),(21)を用いて,ルンゲクッタ法を用いて先の例の積分を行え.3つの
場合の誤差を比較せよ.
[4] 連立微分方程式
先ほどのルンゲクッタ法は多変数に拡張できる.例えば,y=y(t)とz=z(t)がそれぞれ
にしたがって進化する場合は,以下のようにアルゴリズムを組めばよい.
練習問題5
式(28)で与えられる連立微分方程式を解け.なお,ω=1.D0とせよ.t=0.D0でx=0.D0, y=1.D0とする.