今天我尝试用给定的理论模型拟合实验数据。尽管拟合相当不错,但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上的错误是我后续计算的重要指标。显然,这个值绝对是无稽之谈,如下图所示。
我该怎么做才能获得有意义的错误?
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)
答案 0 :(得分:0)
我想这种情况有两个方面。 0.我排除了错误的存在,但情况仍然如此。
来自Gnuplot手册:
渐近标准误差通常过分乐观,不应用于确定置信度,但对于定性目的很有用。
拟合度可能是实际正确的,但是由于您拥有很多自由度,并且您可以严格实现最佳的复杂功能。
作为测试,我从参数的不同起始值开始运行拟合。 (我将变量重命名),并使用不同的参数创建了第二个函数,以确保我们始终从新参数开始。
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参数功能。从第一行开始,x0
和g
似乎是变量。但在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)