自定义插值/最小化函数(又名曲线拟合)任何库

Custom interpolation / minimization function (aka curve fitting) any library

我通常在 C++ 环境中使用 ROOT 及其强大的 MINUIT 插值 类。出于与绘图和易于数据处理相关的原因,我最近切换到 Python 3.8。问题是我找不到允许我设置自定义插值函数的库(现在是 1D,将来是多变量)! ScipyPandas 预设了 methods,我不知道其他库是否可以插值。我觉得不太可能,所以我问你!

我需要重现的是在 ROOT 中听起来像这样的东西:

插值函数的定义

TF1* f3 = new TF1("PECD6", "([0]*x + 0.5*[2]*(5*x*x*x-3*x) +0.125*[4]*(63*x*x*x*x*x-70*x*x*x+15*x)) / (1 + 0.5*[1]*(3*x*x-1) + 0.125*[3]*(35*x*x*x*x-30*x*x+3) + 0.0625*[5]*(231*x*x*x*x*x*x-315*x*x*x*x+105*x*x-5)) +1", -0.9, 0.9);
    f3->SetParameters(0, 0, 0, 0, 0, 0);
    f3->SetParLimits(0, -1, 1);
    f3->SetParLimits(1, -1, 1);
    f3->SetParLimits(2, -1, 1);
    f3->SetParLimits(3, -1, 1);
    f3->SetParLimits(4, -1, 1);
    f3->SetParLimits(5, -1, 1);
    f3->SetParNames("b1", "b2", "b3", "b4", "b5", "b6");

如您所见,我使用的是高达 6 阶的勒让德多项式,我想接收系数,可能带有误差传播。

函数的使用

ratio_genarray[rcounter]->Fit("PECD6", "QR");
fit1[k] = ratio_genarray[rcounter]->GetFunction("PECD6");

有人有什么建议吗?

谢谢!

我建议使用 iminuit。您需要将 C++ 语法重新排列为 iminuit 的 Python 语法,但从那以后,这是一个很小的变化,因为它 MINUIT。

(LMFIT 看起来也很有前途,但由于您已经在使用 MINUIT,因此过渡到 iminuit 会更顺利。)