物理学特別実験
最小2乗法を用いたモデル関数の最適化(フィッティング)の練習
手順
以下では情報端末室のPCを利用することを想定しています。自分のPCを用いる場合, "z: ドライブ"を各自のPCの"C:ドライブ"等に読み替えて下さい。また,gnuplotをgnuplot homepageなどからダウンロードしてPCにインストールして下さい。Mathematicaは個人で使う場合には購入すル必要があります。大学の端末室で利用しましょう。
- z:ドライブに fitfile という名前のフォルダを作り, その中に次のファイルをダウンロードする(windowsではマウスを右クリックし, 「リンク先を名前を付けて保存」をクリック).
最小2乗法復習ファイル (ファイル名 lsfit.pdf)
Mathematica用ファイル (ファイル名 lsfitting.nb)
dataファイル (ファイル名 12.dat)
dataファイル (ファイル名 22.dat)
dataファイル (ファイル名 32.dat)
dataファイル (ファイル名 42.dat)
- 「最小2乗法復習ファイル」を読んで, 多項式のフィッティングについて復習しよう. 要点は□で囲ってある部分に出ている.
gnuplotによる最適化
gnuplotはデータフィッティングの機能ももつグラフ作成ソフトです. 様々な関数を利用することも簡単に出来る.
- gnuplotを起動する.
- fitting dataの入っているディレクトリを指定する
gnuplot> cd 'z:\fitfile'
- フィットするデータをグラフに表示
gnuplot> plot '12.dat'
- フィットする関数を入力する
gnuplot> f(x)= a*x+b
(a, b はfitting 係数, gnuplotが備える関数はタイトルバーの[Functions]に掲載されている. xの2乗はx**2と書く)
- 関数f(x)をデータにフィットする
gnuplot> fit f(x) '12.dat' via a,b
via の後にはfittingで決める係数を記入する.
何回かの繰り返しの後係数が誤差とともに表示される.
- データとフィットされた関数を図示
gruplot> plot f(x), '12.dat'
うまく計算できないときのヒント
-
計算が中断して,
「 undefined value during function evaluation 」
などと表示される場合がある. フィッティング係数(a, b, ...等)の初期値が良くないことが原因となっていることがある. フィッティング係数の値は,
gnuplot> show all
により確認できる. 出来るだけよい初期値を与えるためには, データ点とフィッティング関数をよく見比べながら, 係数の初期値を決めてやる必要がある. 例えば,
gnuplot> a=4; b=5;
等のように, 具体的に数値を代入してやり
gnuplot> plot f(x), 'データファイル'
として, データと関数を同時に描かせながら, 初期値を出来るだけよい値にしてやるとうまくいく.
-
グラフの表示範囲が適切でない
グラフ上で右クリックしたままマウスを移動することにより、表示部分を変更ができる。しかし、うまくやらないと画面からグラフが見えなくなってしまう。
そのような場合には、
set xrange [0:10] ( 0<x<10の例)
set autoscale (範囲を自動で決める)
コマンドを使うとよい。
-
軸のラベル
set xlabel 't (s)'
など。
- その他
Mathematicaプログラムによる最適化
- 「最小2乗法復習ファイル」に記されている多項式のフィッティング方法をプログラム化したのが, lsfitting.nb(Mathematica)ファイルだ. このファイルをダブルクリックすると, Mathematicaが起動する. ファイルの中で, [Shift]+[Enter] keyによりブロック(右端に]型でブロック単位が示されている)ごとに実行される.
- 一通り実行した後で, 下記の説明を参照しながらファイルを読んでみよう. データファイル(22.dat)では, 赤文字の部分を適宜変更する必要がある.
- 上で用いた文字変数 data, x, yはMathematicaではListと呼ばれており, いくつかの数字をまとめたもので, これは行列やベクトルと同様な扱いができる. 「data」と入力して[Shift]+[Enter] keyでその中身が表示される. 例えば {{1,2},{3,4},....}のように, 各成分は{ }で一つにまとめられ, それが更に{ }でまとめられる. 各要素には 例えば data[[2,1]]とやることでアクセスできる. これは2番目の中括弧の1番目のデータということで, 上の例では3ということになる.
- list1=Table[・・・・・, {n,1,ndim}] では, 1からndimまでのndim個のデータ・・・・・からなるListを作り, それにlist1と名前を付けている.
- Sum[・・・・, {i,1,ndata}] では, iの値を1からndataまで変えながら,・・・・を加えている.
- 「.」(ピリオド)は内積と似ている. a={{1,2},{3,4}}, b={c,d}のとき,
a.b={c+2d, 3c+4d}, b.a={c+3d,2c+4d}
となる.
Mathematicaの練習
1. 変数cに適当な数値を代入, それを表示しなさい.
2. 変数dに3変数のListを代入し, それを表示しなさい.
3. 変数eに3×3のListを代入し, それを表示しなさい.
4. 変数fにeの逆行列を代入し, それを表示しなさい.
5. eとfの積を表示しなさい.
6. 1から100までの和を求め, gに代入しなさい.
7. sin x (-π< x < π)のグラフを描きなさい.
8. x2+y2 (-1< x < 1, -1< y < 1)のグラフを描きなさい.
解答例 (大文字小文字に注意)
1. c=5; Print[c]
2. d={1, 2, 3};Print[d]
3. e={{1, 2, 3}, {4, 5, 6}, {7, 8, 10}}; Print[e]; Print[TableForm[e]]
4. f=Inverse[e]; Print[f]
5. Print[e.f]
6. g=Sum[i, {i,1,100}] または, g=0; Do[g=g+i,{i,1,100}]; Print[g]
7. Plot[Sin[x], {x, -Pi, Pi}]
8. Plot3D[x^2 + y^2, {x, -1, 1}, {y, -1, 1}]
参考書
スティーブン ウルフラム Mathematica --A System for Doing Mathematics by Computer-- アジソンウエスレイ
課題
(a) 22.dat, (b) 32.dat, (c) 42.dat に入っているデータについて適切な関数をフィットし, その関数, 求めた係数, その誤差を示すとともに, データ点, 関数を図にまとめよ. ただし,
32.dat は横軸が時間を表していると仮定して, 減衰時間を誤差とともに求めよ. (減衰時間は, 縦軸の値が1/eの大きさになるまで経過する時間とせよ)
42.dat は横軸が周波数を表していると仮定し, 中心周波数, 半値全幅(ピークとバックグラウンドの中間を取る位置での幅)を誤差とともに求めよ.
注意 誤差を求める場合には次の誤差伝播の法則を利用しよう.
誤差の伝播 x, y の分散がそれぞれσx2, σy2で, z がx, y の関数 z=f(x, y) と表される場合に, z の分散は
σz2=(∂ f/∂ x)2σx2+(∂ f/∂ y)2σy2
と表される.
tips
- error bar 付きのグラフにする
gnuplot> plot 'datafile' with yerrorbar
datafileには x, y, dy の順にデータを書き込んでおく. このデータ使うと重み付きfitができる.