gnuplot忽略多分支拟合中的第二个分支

时间:2012-09-29 11:47:33

标签: function branch gnuplot curve

我想用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适合的演示没有帮助)?

1 个答案:

答案 0 :(得分:3)

如果'data.txt'文件中的行号是函数x的{​​{1}}变量,则可以使其更简单(这是必要的,实际上! !)。您的函数z(x)实际上只是在两个区间上单独定义的单个变量函数z(x,y)。我使用示例数据文件重新创建了您的问题,其中z(x)z1(x)的范围在我的数据文件的第10个点处中断(您需要49或50)。

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

x

然后使用数据点行号(z1(x) = a*x + b a = 1.2 b = 1.2 z2(x) = a + b z(x) = x < 10 ? z1(x) : z2(x) )作为x来拟合数据文件,并将相应行(column(0))上的值作为y,使参数1和{{变化1}}

a

并试图了解我们的工作方式

b

如果这不起作用,您可以查看 fit z(x) 'data.txt' using (column(0)):1 via a,b 选项以绘制数据文件。这需要将数据文件中的数据范围(前50个点)分隔一个空行(或两个,不记得)并相应地修改脚本。