Я пытаюсь использовать сумму TF1 для подгонки кусочной функции на 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 должна быть функцией
Тем не менее, программа не учитывает диапазон, который я дал для vi2, когда она подходит для vitot. То есть он делает посадочный витот, как будто я вообще не дал диапазона.
Как я могу заставить ROOT соответствовать vtot, учитывая диапазон, который я дал для vi2?
Я не могу установить диапазон непосредственно в vitot, потому что он будет соответствовать только той части данных, в то время как я пытаюсь приспособить все данные различными функциями.
Как вы видите, я уже дал опцию «R» в подгонках, но этого недостаточно.
Похоже, вы хотите, чтобы ROOT принял какое-то значение по умолчанию для vi2
функция за пределами первоначально предоставленного диапазона 0 < x < 0.05
, В вашем случае вы хотите, чтобы значение «по умолчанию» было 0, но, в общем, я не думаю, что ROOT должен предполагать что-либо. Не уверен, что разработчики ROOT использовали ту же логику, но вряд ли сумма функций реализована так, как вы ожидаете. Тем не менее, написать собственную C-функцию для vitot
это будет уважать любой диапазон, который вы хотите. Достаточно взглянуть на раздел «Общая функция C с параметрами» документации TF1 по адресу https://root.cern.ch/doc/master/classTF1.html
Других решений пока нет …