曲线拟合不乐观使用scipy curve_fit

时间:2016-04-04 05:31:46

标签: python r numpy scipy curve-fitting

我正在尝试使用自定义函数拟合曲线。我在log-log图中有数据点,如下所示: enter image description here

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的不确定性,因为我试图自己编写拟合模块。

1 个答案:

答案 0 :(得分:2)

您的对数模型会减去最后一点,因此只考虑第一点。

其他尝试:

def model(r,r0,f0,k): return (r0/r)**k +f0 
p0=(1e-1,1e-3,2)
popt, pcov = curve_fit(model, r, f,p0)
plot(r,f,'ro',r,model(r,*popt),'b')

对于

enter image description here

黑色曲线是一个没有绿点的模型,显然是一个“坏”的曲线。点模型。

但是由于您的数据噪音很大,而且您知道错误,请使用sigma的{​​{1}}参数。