実験データを整理したり、計算結果を他のプログラムで処理したりする場合、
ファイル入出力の処理が必要不可欠である。ファイル処理の基本について学習
する。
先ほどの微分方程式(
5.4.2)の数値計算の結果は、グラ
フに表示させた。ここでは、グラフに表示のみならず、解の値をファイルに出
力する方法を示す。コンピュータープログラムでファイルを取り扱う場合、
OpenとCloseの処理が必要である。FORTRANやC言語でその処理が必要なように、
Mathematicaでも必要である。Mathematicaでは、次の手順でファイルへデータ
を書き出す。
- OpenWriteコマンドで、ファイルをオープンする。
- Writeコマンドで、データをファイルに書き込む。
- Closeコマンドで、ファイルをクローズする。
先ほどの常微分方程式の結果を、ファイルに書き出すことを練習する。プログ
ラムの動作は次のようにする。
- 計算すべき微分方程式は、式(5.4.2)の通りと
する。
- 微分方程式の解は、
の範囲計算する。
- 計算した範囲はプロットするとともに、num個の数値データとしてファ
イルに書き込む。
Mathematicaのプログラムは、次のようになる。このプログラムの大まかな動
作を理解して、実行させてみよう。そして、書き込まれたファイルの中身を調
べてみよう。このプログラムの各行の動作をプログラムの後に、説明している。
tmin=0.0;
tmax=10.0;
num=1000;
result=NDSolve[
{x''[t]+ x'[t]+x[t]==0,x[0]==0,x'[0]==1},
x,{t,tmin,tmax}
];
f[t_]:=x[t]/.result[[1]];
Plot[f[t],{t,tmin,tmax}];
wfile=OpenWrite[
"c:/temp/numerical_result.txt",
FormatType->OutputForm
];
For[i=0,i<=num, i=i+1,
t=(tmax-tmin) i/num+tmin;
Print[t,"\t",f[t]];
Write[wfile,t,"\t",CForm[f[t]]];
];
Close[wfile];
Clear[tmin,tmax,num,t,i,f,x,result,wfile];
このプログラムの動作について、細かく説明しておく。
- 最初の3行で、変数tmin,tmin,numの値を設定している。
- 次のNDSolveコマンドで、微分方程式の解を数値計算してい
る。微分方程式と初期条件、独立変数、解を計算する領域がそのコマン
ドの引数として与えられている。解は、Mathematicaの形式になってお
り、それを変数resultに代入している。
- Mathematicaの形式である解は、x[t]/.result[[1]]で関数に
直している。これについては、今はおまじないと思って欲しい
4。その解の関数は、
f[t_]:=とすることにより、関数f[t]と定義してい
る。以降、解の値が必要なときは、関数f[t]を使う。
- 次のPlotコマンドにより、解をグラフ表示している。
- 次のOpenWriteコマンドにより、解の値を書き出すファイル
をオープンしている。その第1引数がファイル名、第2引数はオプション
で、ここでは出力形式をしている。このファイルは、wfileと
いうストリーム5を使っ
て、データを書き込むことができる。
- 次のFOR文でnum個の解のデータをファイルに書き
出す。FOR文はループ制御で、初期値i=0、ループ条
件i<=num、ループ後処理i=i+1で、それ以降の文を
繰り返す。
- データを書き出す時刻はtで、tminから
tmaxまで、num個に分割している。
- Print文で、データをディスプレイに書き出している。各行
は、最初に時刻t、そして''\ t''に
よりタブ(Tab)を空け、関数f[t]の値を書き出している。時刻
と関数の値の間にタブを入れるのは、データを書き出すときの常套手段
である。
- ファイルを使い終わったら、クローズしなくてはならない。Closeコマ
ンドを使う。
- もう一度、そのプログラムを実行させる場合、前回の変数が残ってい
ると、思わぬ動作をすることがある。そのため、使った変数はクリアー
するのが望ましい。Mathematicaでは、そのためのコマンド
Clearが用意されている。
次に、ファイルからのデータの入力方法について、説明する。これは、実験デー
タなどをMathematicaで処理する場合、必要不可欠なテクニックなので、覚え
ておくと良い。
先ほど作成したデータをMathematicaで読み込み、処理をすることを考える。
処理は、フーリエ変換を行うことにする。ここで、作成するプログラムの流れ
は、
- ファイルからデータを読み込む。
- 読み込んだデータをプロットする。
- データのうち、式(5.4.2)の解のの数値
を抽出する。
- の数値の列をフーリエ変換する。
- フーリエ変換されたデータをプロットする。
である。実際の、プログラムは次のようになる。このプログラムの流れを理解
して、実際に打ち込んで実行させよう。各行の説明は、プログラムリストの後
に記述している。
data=ReadList[
"c:/temp/numerical_result.txt",
{Number,Number}
];
ListPlot[data];
trdata=Transpose[data];
xlist=trdata[[2]];
ft=Fourier[xlist];
ListPlot[
Abs[ft],
PlotRange->{{0,100},{0,5}},
PlotJoined->True
];
このプログラムの動作について、細かく説明しておく。
- ReadListコマンドで、データを読み込んでいる。第1引数で
ファイルを指定している。第2引数が、データの種類とその記述方法を
示している。ここでは、各行に数値(Number)が2つ並んでいる
ことを示している。読み込んだ結果は、リスト(行列みたいなもの)とし
て、dataに格納される。
- 読み込まれたデータは、ListPlotコマンドでグラフ化されて
いる。
- Transposeコマンドで、行列dataの転置行列を
trdataとしている。
- trdata[[2]]で第2行、すなわち、のデータの数値列を
抽出している。抽出された数値列は、xlistに格納される。
- Fourierコマンドにより、xlistの数値列をフーリ
エ変換している。フーリエ変換されたデータは、ft変数に格
納される。フーリエ変換された結果も数値列である。
- ListPlotコマンドにより、フーリエ変換の結果をプロットし
ている。
- 第1引数が、プロットするデータである。一般に、フーリエ変換
では複素数に変換されるので、絶対値化Absコマンドを
用いて、実数に直している。
- PlotRangeオプションで、グラムの表示領域を指定し
ている。横軸は0から100まで、縦軸は0から5までとしている。
- PlotJoinedオプションで、離散的なプロット点を直線
で接続している。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成16年10月13日