c++ - 分段拟合 ROOT Cern,范围不受尊重

标签 c++ parameters curve-fitting data-fitting root-framework

我正在尝试使用 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 的拟合应该是函数

enter image description here

尽管如此,该程序在执行 fit vitot 时不遵守我为 vi2 提供的范围。也就是说,它执行 fit vitot 就好像我根本没有给出范围一样。

考虑到我为 vi2 提供的范围,我如何强制 ROOT 适应 vtot?

我不能直接在 vitot 上设置一个范围,因为它只适合那部分数据,而我试图用不同的函数来适应所有数据。

如您所见,我已经给出了适合的选项“R”,但这似乎还不够。

最佳答案

看起来您希望 ROOT 为 vi2 假定一些“默认”值在最初提供的范围之外的功能0 < x < 0.05 .在您的情况下,您希望“默认”值为 0,但总的来说,我认为 ROOT 不应该假设任何东西。不确定 ROOT 开发人员是否使用了相同的逻辑,但功能总和不太可能按照您的预期实现。尽管如此,为 vitot 编写自定义 C 函数还是很简单的。那会尊重你想要的任何范围。只需查看位于 https://root.cern.ch/doc/master/classTF1.html 的 TF1 文档的“带参数的通用 C 函数”部分即可。

关于c++ - 分段拟合 ROOT Cern,范围不受尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773657/

相关文章:

c++ - 更有效的调用 vector.size() 的方法

mysql - MySQL的rs报表设计参数化查询

matlab - 如何通过 Matlab 中的一系列分段线来拟合曲线?

algorithm - 我如何估计功能的增长?

algorithm - 如何减少 10k 数据点并在较小的显示器上显示它们?阿杜诺

c++ - 转换为基本的 for 循环

c++ - 具有零计数和无效指针的 std::memset

c++ - 如何设置不定数量的变量,由另一个变量指定

javascript - 带参数运行的安全帽

sql - 参数化 WHERE 子句?