3

我想用 gnuplot 做一个多分支拟合。我定义了两个函数 z1(x) 和 z2(x),我希望 z1(x) 适合所有数据,直到第 49 行,从第 50 行开始,它应该适合 z2(x)。这就是我在配件部分所做的:

z(x,y) = (y < 50) ? z1(x) : z2(x)

fit z(x,y) 'data.txt' using  1:-1:2  via a, b

但是 gnuplot 完全忽略了 z2(x) 部分。我什至可以注释掉 z2(x) 的定义,它甚至没有给出错误或警告。它永远不会达到 y >= 50 的情况,但 data.txt 文件有 100 行。

此外,如果我之后绘制 z1(x) 和 z2(x),它们只是常数零(z1 = z2 = 0),但拟合参数 a 和 b 大致(不完全,因为忽略了第二个分支)在正确的顺序。

我在这里做错了吗?有没有一个很好的例子(官方的 gnuplot fit 演示没有帮助)?

4

1 回答 1

3

假设您在“data.txt”文件中的行号是x您的函数的变量z(x),您可以使其更简单(实际上,这是工作所必需的!!!)。您的函数z(x,y)实际上只是z(x)在两个间隔上单独定义的单变量函数。我使用示例数据文件重新创建了您的问题,其中的范围z1(x)z2(x)中断在我的数据文件的第 10 点(您想要 49 或 50 那里)。

以下代码可以满足您的要求;为前 10 个数据点和其余数据点定义z(x)不同的函数(这是xHAS 等于行号的地方),

z1(x) = a*x + b
a = 1.2
b = 1.2
z2(x) = a + b
z(x) = x < 10 ? z1(x) : z2(x)

然后使用数据点行号 ( column(0)) 作为 x 并将相应行 ( 1) 上的值作为 ya来拟合数据文件b

 fit z(x) 'data.txt' using (column(0)):1 via a,b

并密谋看看我们是怎么做的

 plot 'data.txt' using (column(0)):1, z(x)

如果这不起作用,您可以查看index用于绘制数据文件的选项。这需要将数据文件中的数据范围(前 50 个点)用一个空行(或两个,不记得)分隔,并相应地修改脚本。

于 2012-12-04T00:11:58.323 回答