〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
1189 re(3):fitで変数の変域を指定するには? |
2006/1/26(木)08:47 - 松田七美男 - 203-165-192-238.rev.home.ne.jp - 2225 hit(s)
丁寧な説明ありがとうございます.事情は良く判りました.
ガウス関数など非線型な関数への fitting が簡単にできることは,
gnuplot の特徴の一つですね.
次のスクリプトではどうでしょう.パラメータの制限は,実数(無限)の領域を有限の
領域に写像する関数を用いれば良いのではないかという発想に基づいてます.
arctan(x) は,うってつけの関数で [-infty:infty] → [-pi/2:pi/2] に制限してくれます.
したがって atan(x)/pi+0.5 は [0:1] の変数領域を持ちますから,あとは1次変換で,
如何様にも制限変数領域を持たせることができます.
# 疑似データの作成
a1=1.0; b1=0.15; c1=1.0
a2=0.5; b2=0.15; c2=1.05
a3=0.5; b3=0.15; c3=1.2
f1(x)=a1*exp(-((x-c1)/b1)**2)
f2(x)=a2*exp(-((x-c2)/b2)**2)
f3(x)=a3*exp(-((x-c3)/b3)**2)
g(x)=f1(x)+f2(x)+f3(x)
set term table
set out 'test.dat'
set samples 400
plot [0:2] g(x)*(0.995+ 0.01*rand(0))
# パラメータに制限をかけずに fit
set term x11 1
reset
plot 'test.dat' w l
fit g(x) 'test.dat' via a1,a2,a3,c1,c2,c3
plot g(x), 'test.dat', f1(x), f2(x), f3(x)
a11=a1; a21=a2; a31=a3;
c11=c1; c21=c2; c31=c3;
# パラメータ c2 を [1.06:1.06+0.03] に制限して fit
set term x11 2
g2(x)=a2*exp(-((x-( (atan(q2)/pi+0.5)*0.03 + 1.06 ))/b2)**2)
fit f1(x)+g2(x)+f3(x) 'test.dat' via a1,a2,a3,c1,q2,c3
c2=(atan(q2)/pi+0.5)*0.03 + 1.06
plot g(x), 'test.dat', f1(x), f2(x), f3(x)
print a1, a2, a3, c1, c2, c3
print a11, a21, a31, c11, c21, c31
pause -1
〔ツリー構成〕
┣【1189】 re(3):fitで変数の変域を指定するには? 2006/1/26(木)08:47 松田七美男 (1348) |
〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
※ 『クリックポイント』とは一覧上から読み始めた地点を指し、ツリー上の記事を巡回しても、その位置に戻ることができます.