〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
1188 re(2):fitで変数の変域を指定するには? |
2006/1/26(木)02:42 - ringo - pd3fa64.wpdabw01.ap.so-net.ne.jp - 3261 hit(s)
やろうとしていることは、化学実験のデータのフィッティングです。
データは複数のガウス関数型のピークから形成されています。
実験では物質の状態によって複数のピークが得られるのですが、
組成が近い場合(徐々に物質を酸化させる系など)では、それぞれの
組成を示すピーク同士が重なってしまうことがあります。この重な
ったピークを複数のガウス関数でフィッティングしてやることで、
物質の組成の定量化や、ピーク位置からどのような組成の物質が
できているか判断することができます。
f1(x)=a1*exp(-((x-c1)/b1)**2)
f2(x)=a2*exp(-((x-c2)/b2)**2)
f3(x)=a3*exp(-((x-c3)/b3)**2)
fit f1(x)+f2(x)+f3(x) 'test.dat' via a1,a2,a3
#fit f1(x)+f2(x)+f3(x) 'test.dat' via a1,a2,a3,b1,b2,b3,c1,c2,c3
a : ピーク高さ、b : ピークの半値幅、c:ピーク位置
といったように行なっています。半値幅は経験的な値、ピーク位
置は二次微分でわかります。この場合はa1,a2,a3だけ動かします。
しかしピーク同士が接近してピーク位置がよくわからない場合は
cも変数にします。
そのときにピーク位置というのは物質の組成を表すので、組成が
ある程度予測できていれば、ある範囲内だけc1,c2,c3を動かせば
よいことになります(ここであまり主観が入るとまずいので参考
文献などを参照しています)。長くなりましたがこういった事情
で、変数をある範囲だけで変化させたいわけです。
当然、組成の予測できなければこのような範囲の固定はやるべき
ではありませんが。
教えて頂いたスクリプトですが、ちょっとよくわかりませんでした。
始めにダミーデータを作成して、それにフィッティングをしている
と思いますが、どこで変数の範囲を指定しているのでしょうか?
> set xrange[0:5]
> g(x,q,b,c,d)=((atan(q)/pi+0.5)*9+1)*x**3+b**2+c*x+d
> f(x,a,b,c,d)=a*x**3+b**2+c*x+d
> set table
> set out "pseudo.dat"
> plot f(x,0.5,1,5,pi)*(0.95+0.1*rand(0))
> set term x11
> reset
> fit f(x,a,b,c,d) "pseudo.dat" via a,b,c,d
> a1 =a; b1=b; c1=c; d1=d
> fit g(x,q,b,c,d) "pseudo.dat" via q,b,c,d
> a = (atan(q)/pi+0.5)*9+1
> print a1,b1,c1,d1
> print a,b,c,d
> plot f(x,a,b,c,d), f(x,a1,b1,c1,d1), "pseudo.dat"
> pause -1
〔ツリー構成〕
┣【1188】 re(2):fitで変数の変域を指定するには? 2006/1/26(木)02:42 ringo (1902) |
〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
※ 『クリックポイント』とは一覧上から読み始めた地点を指し、ツリー上の記事を巡回しても、その位置に戻ることができます.