• 締切済み

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

stomachmanの回答

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

データを(x[i],y[i]) (i=1,2,....N)とし、x[i]は誤差が無視でき、y[i]には誤差がある。つまり、 f(a,b,c;x) = a sinc(b(x-c)) としたとき、 y[i]-f(a,b,c:x) = ε[i] このε[i]をたとえば最小二乗法で小さく押さえ込みたい。という問題ですね。 いろんな方法があるんです。そして、アプローチを決める上でのポイントは ●sincが波打ってる所まで、つまり遠くまでxがあるのかどうか。 ●xが沢山あるかどうか。波の一つあたり少なくとも幾つかはxがあるのかどうか。 ●xが等間隔に与えられているのか。 ●yのノイズがモデルに比べてものすごく大きかったりしないか。 ●xにノイズはないか。 ●sincのひとつの山の一部だけのデータしかなければ、どの山のものなのか特定するのは極めて困難である。 ●計算を1回やれば良いのか、数十回やるのか、どんどん入ってくるデータを自動処理したいのか。 ●a,b,cの大体の値は分かっているのか。 などです。これらの条件を勘案して、適当な方法を決めなくてはならない。ともかく幾つか汎用性の高いアプローチを示しましょう。 教科書に載っている「非線形最小二乗法」は、まあ行ってみれば最後の手段です。 (でも「最小二乗法による実験データの解析」東大出版会 は持っていて損のない本です。) ★アプローチ(1) sin(A+B) = sinAcosB+cosAsinB を使って、 f(a,b,c;x) x=c f(a,b,c;x)+{(a/b)(cos bc)} (sin bx) +{-(a/b) (sin bc)} (cos bx) とモデルを書き換えます。 f(a,b,c;x)=y[i]-ε[i] を使って、 y[i](x[i])=   c y[i]+   {(a/b)(cos bc)} (sin bx[i]) +   {-(a/b) (sin bc)} (cos bx[i])+(x[i]-c)ε[i] ですね。従って、 Y[i]= y[i](x[i]) α=c β={(a/b)(cos bc)} γ={-(a/b) (sin bc) δ[i]=(x-c)ε[i] と考えてしまえば、これはbだけが非線形で、あとのa,cについては線形最小二乗法の問題です。だからbを適当な方法で探索すれば良い。その過程で一旦cの概算値が分かってしまえば、 y[i](x[i])/(x[i]-c)=   c y[i]/(x[i]-c)+   {(a/b)(cos bc)} (sin bx[i])/(x[i]-c) +   {-(a/b) (sin bc)} (cos bx[i])/(x[i]-c)+ε[i] によって、より良い評価が得られるから、bを決めてはc,aを計算することを繰り返せばよい。 ★アプローチ2 xが等間隔でたっぷりあって、yのノイズが小さいのなら、フーリエ変換してしまいましょう。 F(a,b,c;ω) = (a/√(2π) )integral{x=-∞~∞} sinc(b(x-c)) exp[-iωx] dx とすると F(a,b,c;ω) = (a/√(2π) )integral{x=-∞~∞} sinc(bx) exp[-iω(x+c)] dx =exp[-iωc] (a/(b√(2π) ))integral{x=-∞~∞} {sin(bx)/x} exp[-iωx] dx =exp[-iωc] (a/(b√(2π) ))√(2π) ---- |ω|>|b| さもなくば0 =exp[-iωc] (a/b)---- |ω|>|b| さもなくば0 =(a/b) ((cos ωc)-i(sin ωc))---- |ω|>|b| さもなくば0 ここで |F(a,b,c;ω|^2 =(a/b)^2---- |ω|>|b| さもなくば0 これでa, bを決めてしまうことができる(かも知れません)。そうすれば、 既知のものを大文字で書けば f(A,B,c;x) x=c f(A,B,c;x)+{(A/B)(cos Bc)} (sin Bx) -(A/B) (sin Bc) (cos Bx) なので、 y[i]x[i]=c y[i]x[i]+(A/B)(cos Bc) (sin Bx[i]) -(A/B) (sin Bc) (cos Bx[i])+(x[i]-c)ε[i] 未知数はcだけですね。この線形方程式はBが既知なのでフーリエ級数展開の0次、1次を計算すれば解けてc, (A/B)(cos Bc), (A/B) (sin Bc)が得られます。cが3通りも求められてしまう。これを使って適当にcを選んで y[i]x[i]/(x[i]-c)=c y[i]x[i]/(x[i]-c)+{(A/B)(cos Bc)/(x[i]-c)} (sin Bx[i]) -{(A/B) (sin Bc)/(x[i]-c)} (cos Bx[i])+ε[i] で最小二乗法をやっても良いし、あとはいろいろやり方ありますねえ。 ★3アプローチ3 ちょっと乱暴ですが、一気に線形で解きます。データの誤差が少なく、データ数が多い場合には非常に強力。 モデルf(a,b,c;x)は微分方程式 (b^2)(x-c)f-f'+(x-c)f''=0 の解である。したがって、 (b^2)xf-(cb^2)f-f'+xf''-cf''=0 これを強引に項別に2回部分積分すると (b^2)int int xf (dx)^2-(cb^2)int int f (dx)^2-int f dx + xf-int fdx -intint f (dx)^2 - cf =Cx+D+誤差 という線形問題になる。ここでfにyを代入して数値積分し(従ってどの積分も定数になる)、線形最小二乗法で誤差の二乗和を最小化すれば、 (b^2), (cb^2), c, C,D という係数を決定することが出来る。あとのaを決める方法は自明でしょう。 こうやって得たa,b,cを非線形最小二乗法で改良すると、出発値が良いので非常に安定かつ短時間で計算できます。(ガウス-ニュートン法程度で十分。) ちと眠たくて、推敲が甘いですから、式の間違いなどチェックはご自分で。 意味不明の部分は、ご遠慮なく補足質問してください。

tacosuke
質問者

お礼

丁寧な回答ありがとうございます。 早速回答中のいくつかのアプローチで考えてみます。 わからないことがあったら、また質問させていただきます。そのときはまたよろしくお願いします。

関連するQ&A

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

    時間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 のようなアルゴリズムの説明をいただけると大変ありがたいです。 よろしくお願いします。

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

    (x,y)の組み合わせのデータが数多くあり、y=a+bx+cx^2..という曲線をフィットさせることを考えます。係数a, b, cを求めるということです。エクセルとか科学ソフトに入っているものと思います。 この係数の決め方は、実際にはどのような方針なのしょうか。例えば、最小二乗法のように誤差を調べて、その誤差の式をa, b, cで偏微分して0として3つの式を立て、それを解いてa, b, cを求めるというようなことでしょうか。それはダメなんじゃないかと思うのですが。 y(x,z)=a+bx+czで、x, zが独立ならそれがやれるのであり、この場合、z=x^2なのでzのxに対する独立性に問題があるからなのですが。どうでしょうか。 試しにy=1.5x^2 でxに乱数を与えて計算して(x, y)の組み合わせを数多く作成し、模擬データとしてy=a+bx+cx^2のa, b, cを推定してa=b=0, c=1.5がしっかり算出されるものでしょうか。y=1.5x^2 で乱数で発生したデータであっても低次のy=a + bxという式で最小二乗法を使えばa, b(いずれも非0)の結果が出ますね。そこでもう1つ高次の項 cx^2を付けて推定したら先のa, bが変更を受けてa, bが0でc=1.5となる結果が出てくるものでしょうか。 よろしくお願いします。

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

    i 個の測定データ(x[i],y[i]) を,最小二乗法などを用いて下記の式にフィッティングさせ、AとBを求めたいと思うのですが、私の勉強不足で線形最小二乗法(グラフにプロットして、切片と傾きから求める方法)で解く方法が分かりません。 Y = Alog{x/(x-B)} (x>B) 考え方だけでも構いませんので,どうかご教授下さい。よろしくお願いいたします。 また、最小二乗法に関する大学学部生程度のレベルの教科書的な本がありましたら、教えて下さい。よろしくお願いします。

  • tan(Y)へのカーブフィット(2)

    1. tan(Y)=(a(X/b)/((X/b)^2-1)の式に データ配列を最小二乗法によりカーブフィットさせたいのですが、線形代数での解き方をご教授お願いします。 2. (マトリックスを使う場合は、どのように展開すれば 良いのでしょうか。)

  • 最小二乗法の推定値の誤差

    変数xを変化させたときの測定値yを最小二乗法で二次式y=a*x^2 + b*x +c にフィッティングさせ推定値a, b, cを求めるとき、 測定値yの誤差がδyであるときの推定値a, b, cの誤差を求めたいのです。 具体的には、(x,y)=(-1,2), (0,0), (1,1.5), (2,5) の4つのデータを 二次式にフィッティングさせたときのa,b,cはa=1.375, b=-0.325, c=0.225ですが、 測定値yの測定誤差が0.1のときのa,b,cの誤差を求めたいのです。 よろしくお願いします。

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

    現在、ガウシアン関数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 .....}

  • 最小二乗法

    n組のデータ (xi, yi) を,特定点(X0, Y0) を通る直線 y = ax+b でフィッティングしたい。最小二乗法で係数a,bを求めるため の式を導きなさい。 という問題で 各データの残差を二乗した和が最小になるときのa,bを求めるのですが 特定点(X0,Y0)を通るにはどうすればよいでしょうか? ただ単に、特定点を通らずフィッティングするやりかたはわかるのですが・・・。 よろしくお願いします。

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

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

  • y=a/(x-b)+cの最小二乗法

    y=a/(x-b)+cの最小二乗法 y=a/(x-b)+c という、反比例の式をx方向に+b、y方向に+c平行移動したような曲線の係数a,b,cを求めるための最小二乗法の方法を教えていただけないでしょうか。 工夫してみたのですが、なかなかうまくいきませんでした。 すみませんが、力を貸してください。

  • 最小二乗法によるtan(Y)へのカーブフィットについて

    tan(Y)=(2aX)/(x^2-1)の式に データ配列を最小二乗法によりカーブフィットさせたいのですが、線形代数での解き方をご教授お願いします。