我正在尝试使用 gnuplot 通过一组数据点绘制一条直线。问题是有一些远离平均拟合线的点我想忽略,因为它们以不好的方式影响线的斜率。你怎么能那样做?
谢谢。
一种方法是进行一次拟合,然后使用第二个函数重新进行拟合,并根据与第一次拟合相关的值来区分一些数据点。为了区分异常值,我为它们分配了一个非常高的方差(在第三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,导致几乎忽略该数据点。