如何使用GNUplot获得更好的指数拟合?

时间:2016-10-20 07:59:03

标签: math gnuplot curve-fitting data-fitting chi-squared

我正在努力使我的数据符合这条曲线:

f(x) = b + n*exp(-x/u)
fit f(x) "data1" using 2:3 via b,n,u

我认为这与理论并不相符:

image of bad automatic fit

然后我使用理论中的初始参数,而不重新拟合,我得到了更好的结果。

如果我重新计算拟合,它会在第一次迭代后忽略我的初始参数并返回第一个结果。

我尝试了几件事。我将FIT_LIMIT降低了20个数量级,但它没有改变任何东西。我也偏倚数据有错误,所以我把更多的重量放在前几个数据点上,然后我得到了更好的适应性,但它​​仍然很糟糕。

这是输出:

image of output of values

问题:

  1. 我不清楚这个问题是数学问题,还是GNUplot是通过停在某个局部最小值或达到某种限制或某些此类事情而做错事。我已经忘记了卡方式的合适性。

  2. 是否有某种方法可以获得更好的自动调整,理想情况是在解决以便在数据中包含错误之前?

3 个答案:

答案 0 :(得分:3)

两个想法:

  1. 您似乎在(0,0)附近有相当数量的数据点,看起来像是工件,可能会影响您的健康。

  2. 尝试拟合对数域,即:

    f(x) = b + n*exp(-x/u)
    fit log(f(x)) "data1" using 2:(log($3)) via b,n,u
    

    如果大值主导拟合,这个技巧通常会起作用 - 因为它们与拟合曲线的偏差在对数域中的权重较小。对于您来说,情况似乎并非如此,但可能在您解决第1点之后。

答案 1 :(得分:2)

你认为合适的基础是什么?你需要的不仅仅是你的视觉和主观印象。

这是你假设的功能:

y = b + n*exp(-x/u)

尝试拟合此功能:

z = y-b = n*exp(-x/u)

采取双方的自然记录:

ln(z) = ln(n*exp(-x/u)) = ln(n) - x/u

这是一个简单的线性回归,包含因变量x,自变量ln(z),截距ln(n)和斜率-1/u

问题是你的数据在x = 0时似乎是渐近的,这会向我提出1/x形式的函数。也许不合适与选择功能有关。

你说“理论”。数据代表什么现象?

答案 2 :(得分:1)

一个。 Gnuplot具有非常好的非线性拟合能力。

我不建议使用线性化方法:在纸机上使用笔和纸的方法之前,计算机仅通过标尺制作毫米纸上对数点的折线图并从纸上读取系数。我们不必做旧的事情,因为老老师只知道这种方法。让我们利用计算机的力量。

让我们建议先进行一些系数的非线性回归。

f(x) = b + n*exp(-x/u)
b = -5
n = 1.5
u = 15
fit log(f(x)) "data1" using 2:3 via b,n,u
plot "data1" using 2:3 with points, f(x) with line

将常数调整为数据中的常数,即使猜测置信区间和协方差矩阵也可以享受直接结果。