考虑具有两列和两行的数据文件:
3869. 1602.
3882. 9913.
我想使用gnuplot
来拟合一行gnuplot> f(x) = a * x + b
gnuplot> fit f(x) './data.txt' u 1:2 via a, b
Iteration 0
WSSR : 3.43474e+07 delta(WSSR)/WSSR : 0
delta(WSSR) : 0 limit for stopping : 1e-05
lambda : 2740.4
initial set of free parameter values
a = 1.7524
b = -1026.99
/
Iteration 1
WSSR : 3.43474e+07 delta(WSSR)/WSSR : -1.49847e-12
delta(WSSR) : -5.14686e-05 limit for stopping : 1e-05
lambda : 274.04
resultant parameter values
a = 1.7524
b = -1026.99
After 1 iterations the fit converged.
final sum of squares of residuals : 3.43474e+07
rel. change during last iteration : -1.49847e-12
Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.
Final set of parameters
=======================
a = 1.7524
b = -1026.99
gnuplot>
给出拟合参数的错误值。为什么会这样?我的gnuplot版本是Version 4.4 patchlevel 0
。
答案 0 :(得分:1)
在我看来,曲线拟合函数正在努力寻找真正的参数。这可能与您的数据点的大小相关联和/或尝试将具有两个参数的线拟合到仅两个数据点。
在任何情况下,在Excel中计算a和b或等效产生:
a= 577.769
b = -2233787
如果你给gnuplot一个很好的猜测它应该是什么,例如a=500
和b=-2233700
并重复此过程,它应该会成功找到正确的解决方案:
Final set of parameters
=======================
a = 577.769
b = -2.23379e+06
当然,如果您将两个点拟合为双参数直线,则可以更轻松地手动计算a
和b
的值:
a = (9113-1602) / (3882-3869)
b = 1602 - a * 3869
答案 1 :(得分:1)
Gnuplot使用非线性方法确定函数f
相对于某个错误值的参数:limit for stopping : 1e-05
。
如果更改了该错误值,您的功能将完全适合。可以使用FIT_LIMIT
变量指定错误值,如下所示:
FIT_LIMIT = 1e-8
使用此设置,您的点将在12次迭代后完全匹配。 (至少在我的机器上^^)