gnuplot给出了非常大的误差估计

时间:2014-07-17 15:19:44

标签: gnuplot curve-fitting

今天我尝试用给定的理论模型拟合实验数据。尽管拟合相当不错,但gnuplot返回了极高的错误:

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

A               = 1.76654e-11      +/- 2.589e-06    (1.465e+07%)
g               = 0.000929911      +/- 1.006e-05    (1.082%)
offset          = 0.831727         +/- 0.005273     (0.634%)
x0              = 25.7152          +/- 3768         (1.465e+04%)

特别是,x0上的错误是我后续计算的重要指标。显然,这个值绝对是无稽之谈,如下图所示。

我该怎么做才能获得有意义的错误?

screenshot

MWE:

f(x,x0,g) = -16.0*A*(g*(g**2.0-12.0*(x-x0)**2))/(pi*(g**2.0+4.0*(x-x0)**2.0)**3.0) + offset
FIT_LIMIT = 1e-16

A=-1e-3
g=1e-3
offset=0.8
x0 = 25.71514200

fit f(x,x0,g) "data" via A,g,offset,x0

plot "data", f(x,x0,g)

数据: Link (pastebin)

2 个答案:

答案 0 :(得分:0)

我想这种情况有两个方面。 0.我排除了错误的存在,但情况仍然如此。

  1. 检查渐近st的实际定义。错误和拟合的其他参数,在这种情况下,这似乎是合理的。 请同时检查配件的其他细节: “自由度(FIT_NDF):97 残留均方根(FIT_STDFIT)= sqrt(WSSR / ndf):0.0420015 残差方差(减少的卡方)= WSSR / ndf:0.00176412 “

来自Gnuplot手册:

渐近标准误差通常过分乐观,不应用于确定置信度,但对于定性目的很有用。

拟合度可能是实际正确的,但是由于您拥有很多自由度,并且您可以严格实现最佳的复杂功能。

  1. 有一个固有的限制。例如,它取决于起始值,有时您会陷入困境。

作为测试,我从参数的不同起始值开始运行拟合。 (我将变量重命名),并使用不同的参数创建了第二个函数,以确保我们始终从新参数开始。

f(x) = -16.0*A*(g*(g**2.0-12.0*(x-y)**2))/(pi*(g**2.0+4.0*(x-y)**2.0)**3.0)+B
g(x) = -16.0*AA*(gg*(gg**2.0-12.0*(x-yy)**2))/(pi*(gg**2.0+4.0*(x-yy)**2.0)**3.0)+BB
gnuplot> A=1e-3 ; g=1e-3; B =0.8 ; y = 25.71514200
gnuplot> AA=-1e-3 ; gg=1e-3; BB =0.8 ; yy = 25.71514200

(基本上,我做了第二次拟合来更改A的符号) 拟合结果f(x)


gnuplot> fit f(x) "data.dat" u 1:2 via A,B,g,y
iter      chisq       delta/lim  lambda   A             B             g             y            
[CUT]

After 2 iterations the fit converged.
final sum of squares of residuals : 487.102
rel. change during last iteration : -4.02829e-07

degrees of freedom    (FIT_NDF)                        : 97
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 2.24091
variance of residuals (reduced chisquare) = WSSR/ndf   : 5.02167

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
A               = 0.000999999      +/- 585.1        (5.851e+07%)
B               = 0.8              +/- 2124         (2.655e+05%)
g               = 0.001            +/- 535.8        (5.358e+07%)
y               = 25.7408          +/- 1362         (5292%)

correlation matrix of the fit parameters:
                A      B      g      y      
A               1.000 
B              -0.999  1.000 
g              -1.000  0.999  1.000 
y               1.000 -1.000 -1.000  1.000

拟合g(x)的结果

gnuplot> fit g(x) "data.dat" u 1:2 via AA,BB,gg,yy
iter      chisq       delta/lim  lambda   AA            BB            gg            yy           
   0 5.0258343096e+02   0.00e+00  1.03e+03   -1.000000e-03   8.000000e-01   [CUT]
iter      chisq       delta/lim  lambda   AA            BB            gg            yy           

After 6 iterations the fit converged.
final sum of squares of residuals : 0.171225
rel. change during last iteration : -3.85774e-08

degrees of freedom    (FIT_NDF)                        : 97
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 0.0420144
variance of residuals (reduced chisquare) = WSSR/ndf   : 0.00176521

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
AA              = -0.000999968     +/- 9.454e+07    (9.454e+12%)
BB              = 0.828332         +/- 240.8        (2.908e+04%)
gg              = 0.000999968      +/- 9.453e+07    (9.454e+12%)
yy              = 26.1206          +/- 3.798e+06    (1.454e+07%)

correlation matrix of the fit parameters:
                AA     BB     gg     yy     
AA              1.000 
BB             -0.040  1.000 
gg              1.000 -0.040  1.000 
yy             -0.110  0.998 -0.109  1.000 
gnuplot> 

不仅配件不同,而且在我的情况下,它们完全不可用(我的gnuplot版本不同)。

查看图形我也注意到图形有3个区域,两个区域几乎是线性的,一个看起来像井。 我并不感到惊讶不容易找到适合所有人的适当功能。

您是否尝试过一次从X0开始拟合一个参数,因为它似乎是最明确的参数? (您也可以通过肉眼对其进行分配,或者对数据的子集使用抛物线方法)。

这实际上等效于对导数进行拟合。 这样,您可以减少约束的数量,并且可以更好地着陆。

答案 1 :(得分:-1)

我认为问题在于使用3参数功能。从第一行开始,x0g似乎是变量。但在fit中,它被用作参数的混合(因为via ...)和变量(因为f(x,x0,g))。

有多少列有文件“数据”?看起来2是正确答案。

试试这个:

f(x) = -16.0*A*(g*(g**2.0-12.0*(x-x0)**2))/(pi*(g**2.0+4.0*(x-x0)**2.0)**3.0) + offset
FIT_LIMIT = 1e-16

A=-1e-3
g=1e-3
offset=0.8
x0 = 25.71514200

fit f(x) "data" via A,g,offset,x0

plot "data", f(x)