我想使用gnuplot来获得许多曲线的一阶多项式方程(F(x)= a * x + b)的拟合参数。一些曲线完全用直线表示。
例如,如果我的数据看起来像
1 1
2 2
3 3
4 4
可以用f(x)= x表示(param a = 0,b = 0)。
但是下面的gnuplot代码
# regression line
f(x) = a*x + b
fit f(x) './test.dat' u 1:2 via a, b
无法计算下面显示消息的合适参数
Singular matrix in Invert_RtR
更新:如果我定义适合函数的迭代次数,似乎gnuplot没有“崩溃”
FIT_MAXITER = 1
# regression line
f(x) = a*x + b
fit f(x) './test.dat' u 1:2 via a, b
它应该是a = 1且b = 0。但是gnuplot给出了
Final set of parameters Asymptotic Standard Error
======================= ==========================
a = 0.989067 +/- 0.004339 (0.4387%)
b = 0.0761393 +/- 0.02692 (35.36%)
我如何“强迫”gnuplot计算a和b的正确值?
答案 0 :(得分:4)
我找到了两个解决方案:
1)为你的拟合函数添加一个微小的偏移量:
f(x) = a*x + b + 1e-9
这可以防止出现奇点问题,从而得到完全正确的拟合(a = 1,b = -1e-9)。
2)完全消除b参数
f(x) = a*x
这假设你的拟合线都会经过0,这当然不是你想要的。
答案 1 :(得分:3)
我认为问题可能是f(x)
可以完全适合数据。如果您为任何数据添加任何非零值,则不会出现错误。在现实生活中,这种精确拟合根本不会发生(你有噪音)。无论如何,无论gnuplot说“适合期间的错误”,似乎gnuplot正确地适应了这个功能。
添加FIT_MAXITER = 1
的解决方案可以解决方法。您为FIT_MAXITER定义的值越高,您获得的拟合就越好。但如果你给它太高的值,那么拟合将是精确的(误差将小于数字精度)。
尝试让f(x)
符合您的实际数据并告诉我们您的收获!
答案 2 :(得分:0)
您有几个选择:
将变量b
替换为(b+1)
,然后从结果中减去1。这样你的变量就不会消失,并且gnuplot算法将成功地适应&当它发现数字错误已达到零时退出而没有错误消息。
为b
提供一个非常小的起始值。
拟合的一般规则:您的参数需要具有相同的数量级,并且初始化为正确的数量级。