• 締切済み

ガウシアン関数へのフィッティングについて

現在、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に下記のようなデータを使用しフィッティングを行いたいのですが、 手法やパラメータa,b,c,dの求め方がわかりません。 どなたか教えていただけませんか。 よろしくお願いいたします。 (x,y)={ 48.800 6092 48.805 6105 48.810 5942 48.815 6000 48.820 6021 48.825 6127 48.830 6131 48.835 6169 48.840 6146 48.845 6077 48.850 6141 48.855 6236 48.860 6115 48.865 6179 48.870 6296 48.875 6176 48.880 6272 48.885 6294 .....}

みんなの回答

  • inara
  • ベストアンサー率72% (293/404)
回答No.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部でしたのでこちらで実験することはできませんでした。ちなみに私は通常、カレイダグラフというグラフソフトで任意関数のフィッティングをやっています。

bug001
質問者

補足

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

関連するQ&A

  • ExcelでGaussian fittingをしたいのですが、どうすれば良いですか?

    A1・・・A1001にx軸の値が B1・・・B1001にy軸の値が入っているとします。 このデータをグラフ化したのちに、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に対してフィッティングを行い、それぞれの定数を算出及び、その算出されたグラフを上に乗せるということをしたいのですが、 Excel VBAを使ってどのようにすれば良いのでしょうか? また、ピークが1本ではなく2本ある場合Multipeak Gaussian fittingというものでそれぞれのピークに対してフィッティングすることもできるそうなのですが、できればその方法についても教えて頂けないでしょうか? 自分でひな形くらい作って質問したいところですが、全くどうやって作れば良いのか検討もつかないのでどなたかよろしくお願い致します。

  • パラメータからの説明についての件

    y=a b*exp(-(x-c)^2/d^2)に実践データを使用しフィッティングを行ったとします。 パラメータ推定の結果 a=6076.4 b=349.5 c=48.9558 d=0.09921 が得られたとします。 ここであるxの値を代入してy1を得ます。 その次に、新たにフィッティングに使用するデータを加えて、 フィッティングした結果、 a=6020.4 b=370.5 c=2.1092 d=0.00028 が得られたとします。 ここで、先ほどと同じxを代入してy2を得ます。 例えば、パラメータcの値が48→2に変わったから、y1→y2のような推移になった。 ということを調べることは可能でしょうか? 可能であればどのような方法がありますか? ※ここで示している値は適当です。

  • データのフィッティングについて

    データを誤差関数erf(x)=(2/√π)×∫_0^x exp(-u^2)duでフィッティングしてパラメータxを求める方法が分かりません。webで調べたところ、scilabでフィッティングできるようなのでインストールしたのですが、詳しい解説書がなくわかりません。scilabに限らず、このようなフィッティングの手順の分かる方、詳しく教えていただければと思います。

  • sinc関数のカーブフィッティング

    データ配列に、 y = a sinc(b(x-c)) で表せれる式をフィッティング(最小二乗法など)したいのですが、良い方法がわかりません。 どなたか教えてもらえませんでしょうか?

  • 指数関数のカーブフィッティング

    時間tに対する1chデータ列yがありまして、それを y=a exp(b t) + c に対して客観的に、できれば自動的にフィッティングして、a,b,cを求めたいです。 これがただの1次関数の最小二乗法ならわかりますし、cが既知なら1次関数の応用で、というところまでもわかります。恥ずかしながら渡井には非線形最小二乗法を一般論で理解して解けるような気がしません。 Excelを使った最小二乗法手順説明サイト http://szksrv.isc.chubu.ac.jp/lms/lms2.html のような方法か、 C/C++のプログラム http://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/predict/predict.htm#2 のようなアルゴリズムの説明をいただけると大変ありがたいです。 よろしくお願いします。

  • ガウスフィッティングについて

    時間 t に対するデータ列 yi (i=1, 2, …) に 最小二乗法を用いて ガウス関数 y(t) = a + b exp( -(t-c)^2 / 2σ^2 ) を 当てはめたいのです。 これまでは、エクセルなどのソフトを用いて 未知数 a, b, c, σを求めていたのですが、 これをソフトなどを用いずに理論式で解くにはどうすれば良いでしょうか? ひとつのやり方として、 ガウス関数の右辺の a を左辺に移行して、両辺の対数を取り 対数データ列 ln(yi - a) との誤差を求めて最小二乗法… という手を考えたのですが、 これだと、誤差の総和を求める際、Σの中にパラメータの a が ln(yi - a) という形で残ってしまい、 誤差の偏微分で得られるパラメータに関する方程式が、 非線形な連立方程式となって解くことができません。 (説明が分かり難くて申し訳ありません) その他にもいろいろ考えたのですが、 どうにもうまくいきません。 とにかく、パラメータの a が邪魔で、 これを b, c, σを用いずに先に求める、 という方向で考えているのですが、 何か良い方法がありましたら、よろしくお願いします。

  • エクセルで三次関数をつくりたいのですが

    検量線を三次関数で書きたいというヒトから質問を受けたのですが、 y=4E-11x^3-3E-7x^2+0.0007x というような式をエクセルで作成する場合、こんな式の作り方で合っているのでしょうか? y=a(exp(1)+b)x^3+c(exp(1)+d)x^2+ex a=4 b=-11 c=-3 d=-7 e=0.0007 また、基本的なことですが「E」とは自然対数の底(≒2.71828)で合っていますか?

  • 指数関数の逆関数について

    a,b,c1,c2,u1,u2は定数、x,yは変数、eはexpで、 a,b,c1,c2,u1,u2の全ての定数が異なります。 また、abc1c2u1u2≠0 ae^(-((x-u1)/c1)^2)+be^(-((x-u2)/c2)^4)=y の逆関数を求めたいのですが、解けなくて困っています。 どなたか解る方いらっしゃいますでしょうか? 教えていただけるとありがたいです。 よろしくお願いします。

  • データ列の曲線によるフィッティング

    データ列(xi,yi)(i=1,...,n)を関数 y=α(x+γ)^2 exp(-β(x+γ)) (α>0,β>0,γ>0) でフィッティングしたいです。対数をとって普通に最小2乗法で解こうとしたら得られる連立方程式が線形でなくて解けませんでした。 どうしたらいいのでしょうか?

  • 任意の形の波形を関数でフィッティングするためにはどうしたら良いですか?

    任意の形の波形を関数でフィッティングするためにはどうしたら良いですか? ある実験より得られた波形があります。 その波形が多項式によってフィッティング可能であると仮定してフィッティングを行いたいのですが、 どうすれば良いのでしょうか? 例えば、その波形が10乗までの関数で表されると考えたとしても y=A + Bx^1 + Cx^2....Kx^10 とフィッティングパラメータが11個もあるわけですよね? そうすると、フィッティングをかけたとしても、一通りだけでなく幾通りも解が出てきてしまうのではないでしょうか? 昔、電子工学の授業でこういう任意の波形のフィッティング式の作り方に関して 習ったことがあるのですが、完全に忘れてしまいました。 どなたかご存じでしたら、参考書などを教えて頂けますでしょうか?