実習課題1: 指数関数型の時間発展

変数 S の単位時間あたりの変化がS自体に比例する問題を考える。 比例定数を a とする。 (6月2日の講義では減衰問題に限ったため比例定数を -a (aが正)としたが、 成長問題も含めるにはこのほうがわかりやすいので変更した。 タンクモデルの話と対応づける場合には符号に注意してほしい。)

微分方程式は

dS/dt = a S ... (1)

解析解は

S(t) = S(0) exp(a t) ... (2)

となる。

これを、前方差分 [差分法の教材参照]で計算してみる。 比較のため、解析解を計算して同様な形で書き出すプログラムも用意した。

ソースプログラム (表の中からリンクされています)

前方差分

Unix用(改行コードLFのみ)Windows用(改行コードCRLF)
Awk ex1.awk ex1.awk
C ex1.c ex1.c
Fortran ex1.f ex1.f

解析解 (言語コンパイラ・インタプリタ常備のexp関数を使う)

Unix用(改行コードLFのみ)Windows用(改行コードCRLF)
Awk expfunc.awk expfunc.awk
C expfunc.c expfunc.c
Fortran expfunc.f expfunc.f

プログラムへの値の入力

次の数値を、 スペース区切り(連続するスペースは1つのスペースと同じとみなす)で 同じ行に順に与える。

szero (浮動小数点数)
S(0)、時刻t = 0でのSの値。
a (浮動小数点数)
式(1)のaの値。
deltat (浮動小数点数)
Δt、差分の時間刻み。
nstep (整数)
計算するステップ数。計算の終わりの(モデルの世界での)時刻は nstep*deltat となる。
intvp (整数)
計算するステップのうちいくつおきに結果を書き出すか。 毎回書き出す場合は1とする。

出力

結果は標準出力に書くようにした。 とくに指定しないと画面に表示されるが、その形ではあまり実用的でない。 リダイレクション(redirection)機能 [別記事参照] を使ってファイルに書き出すことを想定している。

結果の主要部分は、 各行に、時刻tと、その時刻のSの値の、2つの数値が書かれていて、 そのような行が、書き出し対象の時間ステップの数だけならんでいるものである。 スペース区切り2列のデータとも言える。

主要部分の前に、プログラム名と、入力変数の名前・値を書きだしておく。 これらの行は、初めに「#」の字を入れておく。 「#」で始まる行はgnuplotではコメント扱いされるので、 この行が含まれたままのファイルを作図することができる。 プログラム名を書き出しているところの文字列は仮のものなので、 各自の判断で変更してほしい。 入力変数の名前・値を書きだすところでは数量の単位も書くようにするとよい。

使い方の例

Awk

awk -f ex1.awk > ex1out1.txt
100  -0.1   0.1   100  10
control-D 

C

gcc ex1.c
./a.out > ex1out1.txt
100  -0.1   0.1   100  10

Fortran

g77 ex1.f
./a.out > ex1out1.txt
100  -0.1   0.1   100  10

作図

計算の結果をグラフにしてみることを勧める。 グラフ作成ソフトウェアとしては、gnuplotを勧める。 上に述べた実行例のようにファイルを作ったとすれば、 gnuplotの中で

plot "ex1out1.txt"

のようにすれば、横軸に時刻、縦軸にSの値をとったグラフができる。 plotコマンドには、ファイル名をコンマでくぎって複数ならべる ことができ、そうすると複数のデータのグラフが同じ画面に表示される。 [gnuplot教材ページ] も参考にしてほしい。


2008-06-02(夜); 更新 2008-06-20
増田 耕一 (MASUDA Kooiti)
[この授業の目次へ] [日程へ]