我正在尝试使用自定义函数拟合曲线。我在log-log图中有数据点,如下所示:
x轴为logr
,y轴为logf
。对于具有负值的数据点,我使用上部错误栏作为数据pint,对于具有未定义的较低错误栏的数据点,我设置为某个值。
从图中我们可以看到数据点几乎是直线+尾部(尾部大约从-0.6开始到结束)。所以我假设原始数据具有以下行为,数据也在下面:
f = a * r^b + c
r = [ 0.00528039 0.00721161 0.00873037 0.01108928 0.01413011 0.01790143 0.02263833 0.02886089 0.03663713 0.04659512 0.05921978 0.07540126 0.09593949 0.12190075 0.15501736 0.19713563 0.25041524 0.31850255 0.40514023 0.51507869 0.65489938 0.83278859 1.05865016 1.34624082]
f = [ 0.07905728 0.04011504 0.03490303 0.03138561 0.01401272 0.0053508 0.00546048 0.00296805 0.00041698 0.00078639 0.00235994 0.00221327 0.00115695 0.0008026 0.00054334 0.00052034 0.00089253 0.000486 0.0008194 0.00073325 0.00071894 0.00066874 0.00066106 0.00064371]
但直接适合上述功能是可怕的,因为这一点下降得那么快。所以我修改了拟合函数,如下所示:
def fit_func(x,a,b,c):
xx = a * x**b
xxx = 10**xx + 10**c
return np.log10(xxx)
popt, pcov = optimize.curve_fit(fit_func, r, f)
f_fit = fit_func(r,popt[0],popt[1],popt[2])
虽然我将误差条放在图中,但在曲线拟合中并不重要。我使用scipy.optimize进行拟合,下面的黑线是合适的。但拟合曲线太快了。任何人都有更好的想法做适合?或者任何人都可以告诉我如何计算拟合参数a, b, c
的不确定性,因为我试图自己编写拟合模块。