使用gnuplot调整日志日志数据

时间:2014-05-13 18:20:26

标签: gnuplot data-fitting

我尝试拟合这个情节enter image description here,因为你可以看到拟合对数据不太好。

我的代码是:

    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的值)然后采用此参数修复我只适合曲线只有a,发现它我修复它并仅修改b。之后使用输出作为适合的起始解决方案我发现最合适。 enter image description here

4 个答案:

答案 0 :(得分:1)

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

a = 100
b = -3

更好的开始。也许你需要更多地调整这些值,我不能,因为我没有数据文件。

此外,您可能希望将拟合的区域限制在10以上的部分:

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

当然只有,如果合适的话。

答案 1 :(得分:1)

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

问题在于标准拟合程序中的罚函数通常是误差平方的总和,并且尽可能尝试,如果您的数据具有大量动态范围,则最小y值的误差将出现从算法的角度来看基本上为零。

我最近向学生讲授了他们需要适合这些数据的课程。他们中的许多人通过选择非常严格的收敛标准来击败他们的(matlab)拟合程序,但即便如此也没有太多帮助。

如果你想要很好地适应这种幂律尾巴,你真正需要做的是将数据转换为对数日志形式,并对该对数日志表示进行线性回归。

答案 2 :(得分:1)

这里的主要问题是较高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轴并进行线性回归。

答案 3 :(得分:-1)

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