2017-03-13 11 views
1

私はTF1の合計を使って、ROOT Cernの区分的関数を使ってフィットしようとしています。ここにコードの重要な部分があります。ROOT Cernにはっきりとフィットします。範囲は尊重されません。

TCanvas *cvi = new TCanvas("V(i)","V(i)",200,10,600,400); 
TGraphErrors *gvi = new TGraphErrors(27,i,V,si,sV); 

TF1 *vi1 = new TF1("vi1","[0]*log(x*[1]+1)"); 
gvi->Fit(vi1,"MR+"); 

TF1 *vi2 = new TF1("vi2","[0]*x+[1]",0.005,0.012); 
gvi->Fit(vi2,"MR+"); 

TF1 *vitot = new TF1("vi1+vi2","vi1+vi2"); 
gvi->Fit(vitot,"MR+"); 

VI1およびVI2とのフィッティングVI2が範囲を持っている、あなたが見るように、細かいですが、そのためvtotとのフィット感は

enter image description here

関数であるべきにもかかわらずプログラムの開発はしていません私がvi2のために与えた範囲を尊重します。つまり、まったく範囲を与えなかったかのようにフィットビトを行います。

私はvi2に与えた範囲を考慮して、どのようにROOTをvtotに合わせることができますか?

私はさまざまな機能を持つすべてのデータに合わせようとしているのですが、それはデータのその部分だけにフィットするため、範囲をビトーに直接設定することはできません。

私はすでにフィット感でオプション「R」を与えていましたが、それは十分ではないようです。

答えて

1

ROOTに、最初に提供された範囲外のvi2機能の「デフォルト」値を取るように見えます。0 < x < 0.05。あなたの場合、 "デフォルト"の値を0にしたいが、一般的には、ROOTは何も想定していないと思う。 ROOT開発者が同じロジックを使用しているかどうかは不明ですが、関数の合計が期待どおりに実装される可能性は低いです。それにもかかわらず、あなたが望む任意の範囲を尊重するカスタムC関数vitotを書くのは簡単です。 TF1のドキュメントの「パラメータ付きの一般的なC関数」のセクションをご覧ください。https://root.cern.ch/doc/master/classTF1.html

関連する問題