| |
|
|
|
gnuplot3.7の強力な機能の一つに,関数のフィッティング(当てはめ)があり ます.パラメータを含んだ関数を用意すると,データファイルの数値に対 して最適なパラメータの数値を自動的に探索します.関数はgnuplotで表現 できるものなら,線形・非線形を問いません.ここでは, f(x)=a/(1+b*x*x) というLorentz型の関数を使った例を示します.この関 数のパラメータは,aとbの2 つです. サンプルのデータとして,a=2, b=1 の値をこの関数に与えて 計算したものを用意しました.この数値に関数をフィットしたときに, a=2, b=1という結果が得られるかどうかを見ようとしてい ます.
この数値を,"exp.dat" という名前のファイルに保存しておきます.最初 に,gnuplotで当てはめたい関数を定義します.探索するパラメータの変数名 は,xやt等のgnuplotが使う特別な変数でなければ何でも構いません.関数フィッ ティングには, fit コマンドを使います.オプションに,探索した いパラメータ名を via に続けて与えます. フィットを行うデータファイルに対しては,using, index, every等のオプションが使うことができ,デー タファイル中の任意の数値をフィッティングの対象にすることができます. また,データの誤差を与える事で,各点での重みを変えることができます. データの重みは,誤差σの2乗の逆数(σ^{-2})となります.重み付き最小 自乗法を行うためには,データファイルの3カラム目に誤差を用意し, fit f(x) "exp.dat" using 1:2:3 via a,b のようにusing を使って誤差のカラムを指定します.誤差を与えない場合は,全データの 重みは1になります.
途中,フィッティングのログが長々と画面を流れて行きます.同じ内容が, fit.log という名前のファイルにも同時に書き出されています.フィッティ ングがうまく終れば,得られたパラメータの値と,それらの相関(共分散) 行列が出力されます.上の例では,a=2, b=1がほぼ正しく 得られています. 得られた数値は,変数a,bに入っていますので,関数f(x)をデータと ともにプロットすると,フィッティングの結果をプロットできます.
|
次はもう少し具体的な例を用います.次のような実験データがあります.こ のデータに関数f(x)=c*(x-a)**bをフィットし,変数a,b,cの値を求 めます.
各データ点の重みは,誤差の値をZとすると,1/Z*Zとなります.従って誤 差が大きい程重みは小さくなります. まず,実験値だけをプロットしてその傾向を見ます.
次に変数a,b,cの初期値を決めます.gnuplotのフィッティングでは, 初期値を与えていないと全て1として計算を始めます.しかし,反復回数が 多くなったり場合によっては結果が出なかったりしますので,ほどほどの 初期値を決めておいた方がうまく行きます.f(x)=c*(x-a)**bをあてはめま すので,上のプロットを見れば,aは大体6位だろうと想像できます (x=aで関数はゼロになるはずなので).xが1増える と数十倍になっているので,bは1〜2程度でしょう.また, cは10のオーダー(f(x)の対数をとったら分かります),これを初期 値にして,fit を実行します.
17回の反復の後に計算が収束したメッセージが出,最終的なパラメータの値 とその共分散が出力されます.得られた値はa=5.77, b=1.89, c=25.8 でしたので,仮定した初期値はまずまずだっ たようです(プロットしてみるとあまりデータにあっていないのですが...)
この結果を,先程のプロットに重ねて表示します.
|
| |
|
|
|