2

我正在尝试使用 gnuplot 通过一组数据点绘制一条直线。问题是有一些远离平均拟合线的点我想忽略,因为它们以不好的方式影响线的斜率。你怎么能那样做?

谢谢。

4

1 回答 1

2

一种方法是进行一次拟合,然后使用第二个函数重新进行拟合,并根据与第一次拟合相关的值来区分一些数据点。为了区分异常值,我为它们分配了一个非常高的方差(在第三using列中)。在第二列中使用未定义的数据值1/0不起作用。

考虑文件test.dat

1 1
2 2
3 5
4 4

适合使用:

f(x) = a*x + b
g(x) = c*x + d
fname = 'test.dat'
limit = 1

fit f(x) fname via a,b
fit g(x) fname using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000) via c,d

set key left
set offset 0.5,0.5,0.5,0.5
plot f(x), g(x), fname

4.6.3 的结果是:

在此处输入图像描述

使用语句的解释

使用using关键字,您可以选择使用数据文件的哪些列。最简单的情况是using 1:2,它使用第一列 asx和第二列 as (这是在第一次调用y中隐含的假设)。fit例如using 1:2:3,可以使用第三列作为相应数据点的权重(在fit命令的情况下)。在这里,高值意味着较大的方差,因此保真度低(请参阅fit命令文档)。

除了选择列之外,还可以进行类似的计算using 1:($2*2),将第二列乘以2并将结果作为y-value。$2是 的简写column(2),整个语句周围的括号是必需的。

因此,using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000)执行以下操作:f($1)是先前拟合某个x值的值,$2是数据文件中相应的y值。因此,如果abs(f($1) - $2)数据y值与先前拟合结果的距离低于 a limit,则将1其用作权重。否则使用非常大的权重1000,导致几乎忽略该数据点。

于 2013-10-10T12:58:08.697 回答