如何使用 GNUplot 获得更好的指数拟合?
How to get a better exponential fit using GNUplot?
我正在尝试使我的数据适合这条曲线:
f(x) = b + n*exp(-x/u)
fit f(x) "data1" using 2:3 via b,n,u
我得到了这个不接近理论的合身:
然后我使用理论中的初始参数,在不重新计算拟合的情况下,我得到了更好的结果。
如果我重新计算拟合,它会在第一次迭代后忽略我的初始参数并返回到第一个结果。
我尝试了几件事。我将 FIT_LIMIT 减少了 20 个数量级,但它没有任何改变。我还对数据进行了偏差处理,以便我对前几个数据点给予更多的重视,然后我得到了更好的拟合,但它仍然很糟糕。
这是输出:
问题:
我不清楚这个问题是数学上的还是 GNUplot 只是通过停止在某个局部最小值或达到某个限制或类似的东西而做错了事情。我完全忘记了卡方拟合的工作原理。
有没有什么方法可以更好地自动拟合,最好是在解决数据错误之前?
两个想法:
您似乎在 (0,0) 周围有相当多的数据点,这些数据点看起来像人工制品,可能会影响您的健康度。
尝试在对数域拟合,即:
f(x) = b + n*exp(-x/u)
fit log(f(x)) "data1" using 2:(log()) via b,n,u
如果大值主导拟合,则此技巧通常有效——因为它们与拟合曲线的偏差在对数域中的权重较小。这对您来说似乎还不是这种情况,但可能是在您解决第 1 点之后。
您根据什么假设拟合不好?您需要的不仅仅是视觉和主观印象。
这是您假定的函数:
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
形式的函数。可能适配性不好跟功能的选择有关
你说的是"theory"。数据代表什么现象?
来一个。 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
将常量调整为您在数据中所拥有的,即使在猜测置信区间和协方差矩阵的情况下也能享受直接的结果。
我同意前面的评论。为了获得合适的工作,您需要良好的起始值。下面是一个示例:在适合鼠标的范围内,您确定 x1,y1 和 x2,y2。从这四个值计算指数拟合的起始值:
x1=6E-6
y1=91
x2=1.8E-5
y2=10.8
a=log(y1/y2)/(x1-x2)
A=y1/(exp(a*x1))
f(x) = A*exp(a*x)
fit [0.6E-5:1.5E-5] f(x) 'data.csv' using ():(abs()) via A, a
我正在尝试使我的数据适合这条曲线:
f(x) = b + n*exp(-x/u)
fit f(x) "data1" using 2:3 via b,n,u
我得到了这个不接近理论的合身:
然后我使用理论中的初始参数,在不重新计算拟合的情况下,我得到了更好的结果。
如果我重新计算拟合,它会在第一次迭代后忽略我的初始参数并返回到第一个结果。
我尝试了几件事。我将 FIT_LIMIT 减少了 20 个数量级,但它没有任何改变。我还对数据进行了偏差处理,以便我对前几个数据点给予更多的重视,然后我得到了更好的拟合,但它仍然很糟糕。
这是输出:
问题:
我不清楚这个问题是数学上的还是 GNUplot 只是通过停止在某个局部最小值或达到某个限制或类似的东西而做错了事情。我完全忘记了卡方拟合的工作原理。
有没有什么方法可以更好地自动拟合,最好是在解决数据错误之前?
两个想法:
您似乎在 (0,0) 周围有相当多的数据点,这些数据点看起来像人工制品,可能会影响您的健康度。
尝试在对数域拟合,即:
f(x) = b + n*exp(-x/u) fit log(f(x)) "data1" using 2:(log()) via b,n,u
如果大值主导拟合,则此技巧通常有效——因为它们与拟合曲线的偏差在对数域中的权重较小。这对您来说似乎还不是这种情况,但可能是在您解决第 1 点之后。
您根据什么假设拟合不好?您需要的不仅仅是视觉和主观印象。
这是您假定的函数:
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
形式的函数。可能适配性不好跟功能的选择有关
你说的是"theory"。数据代表什么现象?
来一个。 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
将常量调整为您在数据中所拥有的,即使在猜测置信区间和协方差矩阵的情况下也能享受直接的结果。
我同意前面的评论。为了获得合适的工作,您需要良好的起始值。下面是一个示例:在适合鼠标的范围内,您确定 x1,y1 和 x2,y2。从这四个值计算指数拟合的起始值:
x1=6E-6
y1=91
x2=1.8E-5
y2=10.8
a=log(y1/y2)/(x1-x2)
A=y1/(exp(a*x1))
f(x) = A*exp(a*x)
fit [0.6E-5:1.5E-5] f(x) 'data.csv' using ():(abs()) via A, a