63 Fit

fit コマンドはユーザの与えた式を (x,y) または (x,y,z) の形式のデータ 点の集合への当てはめを可能にします。それには Marquardt-Levenberg 法に よる非線形最小自乗法 (NLLS) の実装が用いられます。式の内部に現われるユ ーザ定義変数はいずれも当てはめのパラメータとして使うことができます。た だ、その式の返り値は実数である必要があります。

書式:

     fit {<ranges>} <expression>
         '<datafile>' {datafile-modifiers}
         via '<parameter file>' | <var1>{,<var2>,...}

範囲 (xrange,yrange) は、当てはめられるデータ点を一時的に制限するのに 使うことができ、その範囲を超えたデータは全て無視されます。その書式は plot コマンド同様

     [{dummy_variable=}{<min>}{:<max>}],

です。以下参照: plot ranges (71.8)

< expression> は通常はあらかじめユーザ定義された f(x) または f(x,y) の 形の関数ですが、gnuplot で有効な任意の数式を指定できます。

< datafile> plot コマンドと同様に扱われます。plot datafile の修 飾子 (using, every,...) は、smooth とあまり勧められない thru を除いて、全て fit に使うことができます。以下参照:plot datafile (71.3)

当てはめる 1 変数関数 z=f(x) へのデフォルトのデータの書式は z か x:z です。つまり、データが 1 列しかなければそれは従属変数値 (関数値) と見 なされ、行番号が独立変数値 (変数値) となり、2 列のデータがあれば、1 列 目が独立変数値、2 列目が従属変数値となります。

これらの形式はデータファイルへの using 指定子で変更でき、例えば z の 値を他の列から取ったり、あるいは複数の列から計算した値とすることができ ます。3 番目の using 指定 (列番号、または数式) が与えられた場合は、 それは対応する z の値の標準偏差として解釈され、それはそのデータへの重 み (=1/s**2) を計算するのに使われます。そうでなければ、全てのデータは 同じ重み (1) で計算されます。using オプションを全く指定しなかった場 合、3 列目のデータがあった場合でもデータから z の偏差は読まれませんの で、その場合は重み 1 になります。

2 変数関数 z=f(x,y) を当てはめる場合、データの書式は using による 4 つの項目 x:y:z:s が要求されます。これは完全に全てが与えられなければな らず、不足する項目に対してはどの列もデフォルトは仮定されていません。各 データ点の重みは上と同様に 's' から計算されます。もし誤差評価を持って いなければ、定数値を定数式として指定すればいいでしょう (以下参照:plot datafile using (71.3.7))。例えば using 1:2:3:(1) のように。

当てはめ関数には、独立変数を 5 つまで持たせられますが、1 変数以外の場合は、その独立変数の個数よりも 2 つ多い using 指定をしなければいけません。許される書式、そしてデフォルトのダミー変数名は以下の通りです:


     z
     x:z
     x:z:s
     x:y:z:s
     x:y:t:z:s
     x:y:t:u:z:s
     x:y:t:u:v:z:s

ダミー変数名は、下にあげるように範囲指定によって変更できます。最初の範 囲は using 指定の最初のものに対応し、以下同様です。z (従属変数) の範 囲も指定できますが、その名前は変更できません。

複数のデータ集合も複数の 1 変数関数に同時に当てはめることも、y を '仮 変数' とすれば可能です。例えばデータ行番号を使い、2 変数関数への当ては め、とすればいいでしょう。以下参照: fit multi-branch (63.5)

via 指定子は、パラメータの調節を直接か、またはパラメータファイルを参 照することによって行うかを指定します。

例:

     f(x) = a*x**2 + b*x + c
     g(x,y) = a*x**2 + b*y**2 + c*x*y
     FIT_LIMIT = 1e-6
     fit f(x) 'measured.dat' via 'start.par'
     fit f(x) 'measured.dat' using 3:($7-5) via 'start.par'
     fit f(x) './data/trash.dat' using 1:2:3 via a, b, c
     fit g(x,y) 'surface.dat' using 1:2:3:(1) via a, b, c
     fit a0 + a1*x/(1 + a2*x/(1 + a3*x)) 'measured.dat' via a0,a1,a2,a3
     fit a*x + b*y 'surface.dat' using 1:2:3:(1) via a,b
     fit [*:*][yaks=*:*] a*x+b*yaks 'surface.dat' u 1:2:3:(1) via a,b
     fit a*x + b*y + c*t 'foo.dat' using 1:2:3:4:(1) via a,b,c
     h(x,y,t,u,v) = a*x + b*y + c*t + d*u + e*v
     fit h(x,y,t,u,v) 'foo.dat' using 1:2:3:4:5:6:(1) via a,b,c,d,e

反復の個々のステップの後で、当てはめの現在の状態についての詳細な情報が 画面に表示されます。そし最初と最後の状態に関する同じ情報が "fit.log" というログファイルにも書き出されます。このファイルは前の当てはめの履歴 を消さないように常に追加されていきます。これは望むなら削除、あるいは別 な名前にできます。コマンド set fit logfile を使ってログファイルの名 前を変更することもできます。

gnuplot が、set fit errorvariables を使えるようにインストールされて いて、そのコマンドを使用した場合、各当てはめパラメータの誤差は、そのパ ラメータと似た名前 ("_err" が追加された名前) の変数に保存されます。よ ってその誤差を更なる計算の入力として使用することができます。

当てはめの反復は Ctrl-C を押すことで中断できます。現在の反復が正常に終 了した後、 (1) 当てはめを止めて現在のパラメータの値を採用する (2) 当てはめを続行する (3) 環境変数 FIT_SCRIPT で指定した gnuplot コマンドを実行する のいずれかを選ぶことができます。FIT_SCRIPT のデフォルトは replot で あり、よってもしデータと当てはめ関数を一つのグラフにあらかじめ描画して あれば、現在の当てはめの状態を表示することができます。

fit が終了した後は、最後のパラメータの値を保存するのに update コマ ンドを使います。その値は再びパラメータの値として使うことができます。 詳細は、以下参照: update (89)


Subsections
竹野茂治@新潟工科大学
2014年2月25日