2

我尝试拟合这个图在此处输入图像描述,因为你可以看到拟合对数据不太好。

我的代码是:

    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。之后使用输出作为拟合的起始解决方案,我找到了最合适的。 在此处输入图像描述

4

4 回答 4

1

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

a = 100
b = -3

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

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

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

当然只有在合适的情况下。

于 2014-05-13T18:29:26.223 回答
1

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

问题是标准拟合例程中的惩罚函数通常是误差平方和,并且尽可能尝试,如果您的数据有很大的动态范围,最小 y 值的误差从算法的观点。

我最近为需要拟合此类数据的学生教授了一门课程。他们中的许多人通过选择非常严格的收敛标准来击败他们的(matlab)拟合例程,但即使这样也没有太大帮助。

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

于 2014-05-13T18:31:30.610 回答
1

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

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

在 gnuplot 中,加权是使用第三个数据列完成的:

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

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

于 2014-11-11T13:22:24.630 回答
-1

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

于 2021-01-26T10:57:56.133 回答