适合与gnuplot的直线

时间:2012-07-03 15:56:54

标签: gnuplot

我想使用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的正确值?

3 个答案:

答案 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提供一个非常小的起始值。

拟合的一般规则:您的参数需要具有相同的数量级,并且初始化为正确的数量级。