2

我想使用 gnuplot 为许多曲线获取一次多项式方程 (F(x)=a*x+b) 的拟合参数。一些曲线精确地表示为直线。

例如,如果我的数据看起来像

1 1
2 2
3 3
4 4

可以用 f(x)=x (参数 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 的正确值?

4

3 回答 3

4

我找到了两个解决方案:

1)为您的拟合函数添加一个微小的偏移量:

f(x) = a*x + b + 1e-9

这可以防止奇点问题,并导致完全正确的拟合(a = 1,b=-1e-9)。

2)完全消除b参数

f(x) = a*x

这假设您的拟合线将全部通过 0,这当然可能不是您想要的。

于 2012-07-03T16:31:26.207 回答
3

正如我所看到的,问题可能是f(x)可以完全适合数据。如果向任何数据添加任何非零值,则不会出现错误。在现实生活中,这种精确的拟合根本不会发生(你有噪音)。无论如何,不​​管 gnuplot 说“拟合期间的错误”,似乎 gnuplot 正确地拟合了函数。

通过添加您的解决方案FIT_MAXITER = 1可能是一种解决方法。您为 FIT_MAXITER 定义的值越高,您获得的拟合效果就越好。但是如果你给它的值太高,拟合就会很精确(误差会小于数字精度)。

尝试拟合f(x)您的真实数据并告诉我们您得到了什么!

于 2013-01-13T16:24:11.293 回答
0

你有几个选择:

  • 用 替换你的变量b(b+1)然后从结果中减去 1。这样,您的变量不会消失,当 gnuplot 算法发现数字错误已达到零时,它将成功拟合并退出而不会出现错误消息。

  • 给 一个很小的起始值b

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

于 2015-08-12T09:15:11.313 回答