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

gnuplot给出了非常大的误差估计,gnuplot,curve-fitting,Gnuplot,Curve Fitting,今天我试图用一个给定的理论模型来拟合实验数据。虽然拟合相当好,但gnuplot返回了极高的错误: Final set of parameters Asymptotic Standard Error ======================= ========================== A = 1.76654e-11 +/- 2.589e-06 (1.465e+07%) g

今天我试图用一个给定的理论模型来拟合实验数据。虽然拟合相当好,但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)

数据:

我认为问题在于使用三参数函数。从第一行开始,似乎
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)

我想这个案子有两个方面。 0我排除了bug的存在,但情况仍然可能如此

  • 检查渐近st.误差的实际定义,以及拟合的其他参数,在这种情况下,这些参数似乎是合理的。 请同时检查配件的其他详细信息: “自由度(FIT_NDF):97 残差均方根值(拟合度)=sqrt(WSSR/ndf):0.0420015 残差方差(减少的平方)=WSSR/ndf:0.00176412 "
    从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>通过A、B、g、y拟合f(x)“data.dat”u 1:2
    iter chisq delta/lim lambda A B g y
    [剪辑]
    经过2次迭代后,拟合收敛。
    残差的最终平方和:487.102
    雷尔。上次迭代期间的变更:-4.02829e-07
    自由度(拟合度):97
    残差均方根值(拟合度)=sqrt(WSSR/ndf):2.24091
    残差方差(减少的平方)=WSSR/ndf:5.02167
    最终参数集渐近标准差
    =======================            ==========================
    A=0.00099999+/-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%)
    拟合参数的相关矩阵:
    A B g y
    1000美元
    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通过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[切割]
    iter chisq delta/lim lambda AA BB gg yy
    经过6次迭代,拟合收敛。
    残差的最终平方和:0.171225
    雷尔。最后一次迭代期间的变更:-3.85774e-08
    自由度(拟合度):97
    残差均方根值(拟合度)=sqrt(WSSR/ndf):0.0420144
    残差方差(减少的平方)=WSSR/ndf:0.00176521
    最终参数集渐近标准差
    =======================            ==========================
    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%)
    拟合参数的相关矩阵:
    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)

    看这张图,我还注意到这张图有三个区域,两个几乎是线性的,一个看起来像一口井。 我并不感到惊讶的是,要找到匹配所有函数的适当函数并不容易

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

    这实际上相当于对导数进行拟合。
    通过这种方式,您可以减少约束的数量,并且可能会以更好的拟合方式着陆。

    这将为OP的结果提供相同的结果。事实上,如何给要求值的函数赋值是完全无关的。好吧,我不相信这个论点。变量和参数本质上是不同的,通常人们会迭代地计算它们,以避免找到不好的解决方案。@Cippo1987可能人们的处理方式不同,但gnuplot则不同。我的观点是,Gnuploth对这两个案例的评估是相同的,是的,对不起,你完全正确。就Gnuplot所关心的而言,没有区别。事实上,我怀疑这里的问题更多的是理论方面的,而不是gnuplot