我尝试拟合这个情节,因为你可以看到拟合对数据不太好。
我的代码是:
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。之后使用输出作为适合的起始解决方案我发现最合适。
答案 0 :(得分:1)
您必须找到合适的起始值才能获得正确的拟合,因为这种拟合没有一个全局解决方案。
如果您未定义a
和b
,则两者都设置为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”)