変数 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つのスペースと同じとみなす)で 同じ行に順に与える。
scanf
を使った。
これはちょっと危険だが
[別記事参照]、
プログラムを短くするために使った。結果は標準出力に書くようにした。 とくに指定しないと画面に表示されるが、その形ではあまり実用的でない。 リダイレクション(redirection)機能 [別記事参照] を使ってファイルに書き出すことを想定している。
結果の主要部分は、 各行に、時刻tと、その時刻のSの値の、2つの数値が書かれていて、 そのような行が、書き出し対象の時間ステップの数だけならんでいるものである。 スペース区切り2列のデータとも言える。
主要部分の前に、プログラム名と、入力変数の名前・値を書きだしておく。
これらの行は、初めに「#」の字を入れておく。
「#」で始まる行はgnuplot
ではコメント扱いされるので、
この行が含まれたままのファイルを作図することができる。
プログラム名を書き出しているところの文字列は仮のものなので、
各自の判断で変更してほしい。
入力変数の名前・値を書きだすところでは数量の単位も書くようにするとよい。
awk -f ex1.awk > ex1out1.txt 100 -0.1 0.1 100 10 control-D
gcc ex1.c ./a.out > ex1out1.txt 100 -0.1 0.1 100 10
g77 ex1.f ./a.out > ex1out1.txt 100 -0.1 0.1 100 10
a.out
はLinuxなどUnix系OSの場合の実行ファイル名。
CygWinの場合は、a.exe
となるので、
それを実行するには上記のa.out
の代わりにa
で
よいと思われる(ただし未確認)。-lm
」で
関数exp
を含むmath libraryをリンクする必要がある。
今後の演習問題では、
差分の場合にもこれが必要になる場合もあるかもしれない。計算の結果をグラフにしてみることを勧める。
グラフ作成ソフトウェアとしては、gnuplot
を勧める。
上に述べた実行例のようにファイルを作ったとすれば、
gnuplot
の中で
plot "ex1out1.txt"
のようにすれば、横軸に時刻、縦軸にSの値をとったグラフができる。
plot
コマンドには、ファイル名をコンマでくぎって複数ならべる
ことができ、そうすると複数のデータのグラフが同じ画面に表示される。
[gnuplot教材ページ]
も参考にしてほしい。