北海道大学 大学院工学院 応用物理学専攻 応用物理学コース English version
光量子物理学研究室 Laboratory of Nonlinear Optics and Laser Physics

光量子Tips - 実験データのフィッティングを行う

(2014/10/07作成)
ここでは実験データの解析法について説明します。
このページでは数式を表示するためにMathJaxを利用しています。javascriptがONでありかつこの(MathJax公式ページ)リストに載っているWebブラウザーを利用しているときのみに数式が正しく表示されます。ご了承ください。

この文章で行うこと

この文章では、

  1. Excel上にある表計算データをgnuplotで読み込み可能なデータにし
  2. gnuplotを用いてグラフを表示し
  3. フィッティング関数を設定し
  4. フィッティングを行い、結果を得る

方法について説明します。

この文章では、図1に示すようなデータに対して、三角関数のフィッティングを行うことを想定しています。

図1 想定するデータ

Excelのデータからgnuplotで読み込めるデータを作る

まずは、Excelのデータからgnuplotで読み込めるデータを作る方法について説明します。

図2,図3のようにフィッティングに必要なデータを範囲指定してメモ帳などのテキストエディタにコピーします。

図2 フィッティングするのに必要なデータをコピーする

図3 メモ帳にコピーされた状態

本来、gnuplotはデータファイルとして数値データのみが書かれているファイルしか読み込めません。しかし、数値データではない行や読み込んで欲しくない行に関しては行頭に"#"(シャープ)を付けることによって、エラーが発生することを回避できます。("#"が付いた行は読み込まれない)

メモ帳にコピーした内容をデータファイルとして保存します。本文章では、"C:\gnuplot_test\data.txt"と保存しました。(保存する場所、名前については適宜読み変えてください。))

data.txt(1KB)の内容はこちらからダウンロードできます。

gnuplotを用いてグラフを表示する

データファイルが作成できたので、次にgnuplotを起動します。まず、スタートボタンをクリックし検索ボックスに"gnuplot"と入力します。そうすると、gnuplotのプログラムが現れるのでそれをクリックします。(console versionと書かれている方ではない方をクリックしください。)(図4)

図4 gnuplotと検索するとプログラムが現れます。

これでgnuplotが起動します。(図5)

図5 gnuplotと検索するとプログラムが現れます。

このターミナルと呼ばれるウィンドウに命令を打ち込むことにより、gnuplotはグラフを描画します。gnuplotではグラフを描画するためのデータファイルを指定するのに絶対パス指定と相対パス指定の両方が使えますが、相対パス指定の方が打ち込む文字の量が少ないのでそちらで行います。

相対パス指定を行うためにはまずどこのフォルダを相対パスの原点にするかを指定しなければなりません。そのために、まずツールバーの「移動」と書かれたボタンをクリックします。(図6)

図6 移動ボタンの場所

そして、今読み込みたいデータがあるフォルダを指定し、"OK"をクリックしてください。(図7)

図7 移動ボタンの場所

さて次に、試しにグラフを描画してみます。ターミナルに"plot "data.txt" using 1:5"と入力し、[Enter]キーを押してください。(図8)図9のウィンドウが出てきます。

図8 "plot "data.txt" using 1:5"と入力し[Enter]を押す

図9 表示されたグラフ

図10に先ほどターミナルに打ち込んだ"plot "data.txt" using 1:5"の意味を示しました。plotとは2次元グラフを描画せよという命令でその後に2次元グラフをプロットするために必要なデータファイル名を指定します。このデータファイルは図3のように複数のデータ列を持たせることが可能です。この場合は、"using 1:5"と1列目(degreeと書かれた列)をx軸のデータとして、5列目(aveと書かれた列)をy軸のデータとして読み込ませています。

図10 "plot "data.txt" using 1:5"の意味

フィッティング関数を設定する

次に、フィッティングするための関数を設定します。フィッティング関数は式(1)のようにします。(注意:元々のデータが三角関数でフィッティングをするべきものであるためcosで関数を設定しています。当たり前のことですが、フィッティングをさせたいデータに対して適切な関数を各自設定してください。)

\[ f(x) = a \cos ((x+c)/b\cdot \pi)+d \tag{1} \]

gnuplotには数式をセットする方法があります。図11のように、ターミナルに"f(x) = a*cos((x+c)/b*pi)+d"と入力し、[Enter]キーを押してください。

入力した式の解説を図12に示します。a,b,c,dは変数でcos(),piはそれぞれgnuplotに最初から入っているコサイン関数と円周率です。"*"(アスタリスク)は掛け算のマークで、gnuplotの場合、掛け算の記号を省略することはできません。また、"**"とアスタリスクを2回並べるとべき乗の意味に変わります("^"(キャレット)ではありません)。数式について詳しく知りたい場合は、gnuplotの説明書[1](バージョン4.4の説明書には日本語版があります。)の第13章「式」を参考にしてください。そのほかのwebサイトでも有用な情報を得ることができます。

さて、次に試しにフィッティングを行ってみましょう。"fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"と入力し[Enter]キーを押してください。(図11)[Enter]キーを押すとすぐにフィッティングが開始されます。しばらくすると、画面の更新が止まり、フィッティングが終わります。(図13)

図11 "f(x) = a*cos((x+c)/b*pi)+d"と入力し[Enter]を押すと式(1)がgnuplotにセットされます。その次に、"fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"と入力し[Enter]キーを押すことによりフィッティングが開始します。

図12 "f(x) = a*cos((x+c)/b*pi)+d"の意味

図13 試しにフィッティングを行った結果

"fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"の意味は次の項目で説明するとして、図13の結果をご覧ください。例えば"Asymtotic Standard Error"の項目を見てみると、誤差がパラメーターの値に比べて大変大きいことが分かります。(注:この誤差は「実験上の誤差」ではなくフィッティングにおけるパラメータの誤差です)このような場合は、フィッティングがうまくいっていないことを示しています。

試しに、フィッティングした関数f(x)と元のデータを重ねてグラフ描画してみます。ターミナルに"plot "data.txt" using 1:5, f(x)"と入力して[Enter]キーを押してください。(図14) (少し脱線しますが、plotコマンドは","(カンマ)でそれぞれのデータや関数を区切ることにより、複数のデータや関数を一つのグラフに表示することができます。)

図14 フィッティングした関数f(x)と元のデータを重ねてグラフ描画した結果

(図14)からもフィッティングがうまくいっていないことが分かります。gnuplotでフィッティングを行うには、まず、変数の初期値を適切に設定しなければなりません。その方法を次に説明します。

フィッティングを行い結果を得る

gnuplotでフィッティングを適切に行うためにはまず変数の初期値を適切に指定しなければなりません。今使用している変数はa,b,c,dの4つですが、何も指定していない場合はgnuplotは1を初期値として使用します。そこで、図15のようにa=5000, b=45, c=-45, d=5000と設定します。

図15 変数の初期値の設定

変数の初期値を設定した後に、ターミナルでもう一度"plot "data.txt" using 1:5, f(x)"と打ち[Enter]を押してみましょう。(キーボードの矢印キー[↑]を押すと、以前に入力した命令が出せて便利です。)そうすると、図16のように元のデータの近くを関数が通る様子が分かります。このように、事前に元のデータと関数が近くなるようにしておくとフィッティングが適切に行われる可能性が高くなります。

図16 変数の初期値を設定した後に関数の形を確認

ここで、もう一度"fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"と入力し(もしくは[↑]キーで履歴を呼び出し)[Enter]を押します。そして、もう一度"plot "data.txt" using 1:5, f(x)"と打ち(もしくは[↑]キーで履歴を呼び出し)[Enter]を押してみましょう。(図17)フィッティングに成功したことが分かります。

図17 フィッティング成功

図18に"fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"の意味を示します。"[0:90]"はフィッティングを適用するxの範囲を指定していますが、これは省略可能です。また、"via a,b,c,d"はf(x)のどの変数を動かしてフィッティングを行うのかを指定できます。例えば、bは波長(の半分)に対応していますが、波長をフィッティングによって変えて欲しくない場合は先にbの値を設定したうえで"via a,b,c,d"を"via a,c,d"と書き変えた命令を実行すればよいです。

図18 "fit [0:90] f(x) "data.txt" using 1:5 via a,b,c,d"の意味

フィッティングの最終結果はターミナルに表示された"Final set of parameters"にあります。その下の"correlation matrix of the fit parameters"はパラメータ間の相関を示しており、非対角成分1や-1に近い場合(対角成分は常に1です。)は、フィッティングがうまくいっていない、もしくは設定した関数がよくないことを示唆します。(例えば、f(x)=a*x+b+cとセットすると、bとcは重複した役割を持っているため、bとcの相関が-1になります。)[2][3]

gnuplotのフィッティングについて更に知りたい場合は、gnuplotの説明書[1]の第57章「FIT」を読まれることをお勧めします。

参考文献

  1. "Official gnuplot documentation"(日本語の説明書もあります)
  2. "Gnuplot: An Interactive Plotting Program - fit"
  3. "Gnuplot tutorial #2, Physics 209 Linear and Non-linear fitting"