【问题标题】:fit straight lines with gnuplot用 gnuplot 拟合直线
【发布时间】:2015-08-12 17:15:11
【问题描述】:

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

【问题讨论】:

    标签: gnuplot


    【解决方案1】:

    我找到了两个解决方案:

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

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

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

    2) 完全去掉b参数

    f(x) = a*x
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        你有几个选择:

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

        • b一个非常小的起始值。

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

        【讨论】:

          猜你喜欢
          • 2018-09-21
          • 1970-01-01
          • 2020-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多