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



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

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

下面的代码可以满足您的要求;对于前10个数据点和其余数据点,定义了不同的函数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)

然后使用数据点行号(column(0))作为x和相应行上的值(1)作为y来拟合数据文件,改变参数ab

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

并绘图查看我们如何进行

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

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

相关内容

最新更新