Подходит для ROOT Cern, диапазоны не соблюдаются

Я пытаюсь использовать сумму 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» в подгонках, но этого недостаточно.

1

Решение

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

1

Другие решения

Других решений пока нет …