アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に下記のようなデータを使用しフィッティングを行いたいのですが、
手法やパラメータa,b,c,dの求め方がわかりません。
どなたか教えていただけませんか。
よろしくお願いいたします。
(x,y)={
48.8006092
48.8056105
48.8105942
48.8156000
48.8206021
48.8256127
48.8306131
48.8356169
48.8406146
48.8456077
48.8506141
48.8556236
48.8606115
48.8656179
48.8706296
48.8756176
48.8806272
48.8856294
.....}

A 回答 (1件)

Excelしか使えないのであれば、ソルバーを使って、以下の手順で「残差2乗和」を最小とするパラメータ a, b, c, d を探すと良いでしょう。

ただし、パラメータの初期値があまりかけ離れていると変な値に収束するか解が見つかりません。a, b, c は元のデータのグラフから見当をつけられると思います( a はベースライン高さ、b はピーク高さ、 c はピーク位置x)。d は直感では見当をつけられないので、(ピークの半値全幅)/1.67 で計算してそれを初期値としてください。

【ソルバーを使った最小自乗法】
(1) Excelのメニューの [ツール] → [アドイン] で [ソルバーアドイン] の左側の□をチェックして OK
(2) A列に x データ、B列に y データを書き込む( x は A1 から、y は B1 から下方向に書き込む)
(3) D1からD4にフィッティングパラメータの初期値を書き込む(a → D1、b → D2、c → D3、d → D4)
(4) セル C1 に以下の式を貼り付ける(これをCopy&Paste)
   =($D$1+$D$2*EXP(-1*(A1-$D$3)^2/($D$4)^2)-B1)^2
(5) セルC1をコピーして、C2以下の全データ分のC列にペースト(これでC列=「残差2乗」となる)
(6) セルD5 に =sum(C1:C??)と書く(??はC列最後の行番号)
(7) Excelのメニューの [ツール] → [ソルバー] で [目的セル」を $D$5、[目標値] を 最小、[変化させるセル]を $D$1:$D$4 とする。この意味は、「セルD1~D4に書かれている数値を変化させて、 D5セルを最小となるようにする」ということです。
(8) ソルバーウィンドウのオプションボタンをクリック → 制限時間を 1000、反復回数を 1000、精度・公差・収束をすべて 1e-10 とし、OKをクリック
(9) ソルバーウィンドウの実行ボタンをクリック
(10) フィッティングパラメータが見つかったら、「最適解が見つかりました・・」と出るので、OKをクリック
(11) ExcelのセルD1~D4にフィッティングパラメータが書き込まれている

なお、精度・公差・収束の値をあまり小さくすると収束しないので、もしデータのばらつきが大きくて収束しないときは、これらの値を適宜、大きくしていってみてください。ご質問のデータはGaussianのほんの1部でしたのでこちらで実験することはできませんでした。ちなみに私は通常、カレイダグラフというグラフソフトで任意関数のフィッティングをやっています。

この回答への補足

inara様 御回答ありがとうございます。私の質問内容が少し抜けておりました。Excel、gnuplot等のソフトを使用せず、計算結果が出力されるまでの途中のアルゴリズムを教えていただけませんかと記載すればよかったのですが質問が不十分でした。大変御迷惑をお掛けし、申し訳ありませんでした。

補足日時:2007/11/15 09:17
    • good
    • 5

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています