使用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。