使用gnuplot拟合日志数据

使用gnuplot拟合日志数据,gnuplot,data-fitting,Gnuplot,Data Fitting,我试着拟合这个图,因为你可以看到拟合对数据不是很好 我的代码是: clear reset set terminal pngcairo size 1000,600 enhanced font 'Verdana,10' set output 'LocalEnergyStepZoom.png' set ylabel '{/Symbol D}H/H_0' set xlabel 'n_{step}' set format y '%.2e' set xrange [*:*] set yrang

我试着拟合这个图,因为你可以看到拟合对数据不是很好

我的代码是:

    clear
reset


set terminal pngcairo size 1000,600 enhanced font 'Verdana,10'
set output 'LocalEnergyStepZoom.png'
set ylabel '{/Symbol D}H/H_0'
set xlabel 'n_{step}'
set format y '%.2e'

set xrange [*:*]
set yrange [1e-16:*]

f(x) = a*x**b
fit f(x) "revErrEnergyGfortCaotic.txt" via a,b


set logscale

plot 'revErrEnergyGfortCaotic.txt' w p,\
 'revErrEnergyGfortRegular.txt' w p,\
f(x) w l lc rgb "black" lw 3 

exit
所以问题是我在这里计算的错误是什么?因为我假设在一个日志平面中,我在代码中放入的形式的拟合应该很好地表示数据

非常感谢

最后,我可以使用Christop答案中的建议来解决这个问题,并稍微修改一下

我找到了函数的近似斜率(接近-4),然后取这个参数fix,我只用a拟合曲线,找到它,我修正它,只修改b。之后,使用输出作为拟合的起始解,我找到了最佳拟合。

您必须找到合适的起始值以获得正确的拟合,因为这种拟合没有一个全局解决方案。 如果未定义
a
b
,则两者都设置为
1
,可能距离太远。试用

a = 100
b = -3
为了更好的开始。也许你需要进一步调整这些值,我不能,因为我没有数据文件

此外,您可能希望将配件的区域限制为10以上的零件:

fit [10:] f(x) "revErrEnergyGfortCaotic.txt" via a,b

当然,只有在适当的情况下才可以。

这是数据分析中的一个常见问题,我不确定是否有一个好的Gnuplot方法来解决它

问题在于,标准拟合例程中的惩罚函数通常是误差的平方和,如果数据有很多动态范围,则从算法的角度来看,最小y值的误差基本上为零

我最近给学生们上了一门课程,让他们能够适应这些数据。他们中的许多人通过选择非常严格的收敛标准来击败他们的(matlab)拟合例程,但即使这样也没有太大帮助


如果你想很好地拟合这个幂律尾部,你真正需要做的是将数据转换成对数形式,并在对数表示上运行线性回归。

这里的主要问题是,与较低x值的残差相比,较高x值的函数值的残差非常小。毕竟,在y轴上几乎可以跨越20个数量级

只需使用
1/y**2
对y值进行加权,甚至更好:如果您有数据点的标准偏差,则使用
1/std**2
对值进行加权。那么拟合应该收敛得更好

在gnuplot中,使用第三个数据列进行加权:

fit f(x) 'data' using 1:2:(1/$2**2") via ... 

或者,您可以使用Raman Shah的建议,将y轴线性化并进行线性回归。

您需要使用权重进行拟合(目前较低的值并不重要),并有一个更好的起始猜测(通过“pars_file.pars”)

您的最佳选择是拟合线性函数
f(x)=a*x+b
然后使用
log(y)
log(x)
进行拟合。为此,请使用
using
选项:
fit f(x)“data”using(log($1)):(log($2))via,b
@Miguel:这应该是一个答案-答案@RamanShah问题是(严格地说)如何使用gnuplot拟合指数,Christoph的答案是正确的。现在,如果您从数据分析的角度询问解决此问题的正确方法。。。我只想把这个评论作为一个有用的“解决办法”留给有类似问题的人。哈哈,很公平,@Miguel。