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

Function gnuplot忽略多分支拟合中的第二个分支,function,branch,gnuplot,curve,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 z(x,y)=(y=50的情况,但data.txt文件有100行 此外,如果我随后绘制z1(x)和z2(x),它们只是常数零(z1=z2=0),但拟

我想用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
z(x,y)=(y<50)?z1(x):z2(x)
通过a,b使用1:-1:2拟合z(x,y)'data.txt'
但是gnuplot完全忽略了z2(x)部分。我甚至可以注释出z2(x)的定义,它甚至没有给出错误或警告。它永远不会达到y>=50的情况,但data.txt文件有100行

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


我做错什么了吗?有没有一个好的例子(官方的gnuplot-fit演示没有帮助)?

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

以下代码满足您的要求;为前10个数据点和其余数据点定义不同的函数
z(x)
(此处
x
必须等于行号)

然后计划看看我们是怎么做的

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

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

我想您可能希望使用1:($0):2,但我不能完全确定(pseudo column
0
应该是行号。
使用pseudo column的帮助数据文件
(不过,快速查看一下,我认为可能-1就可以了)…我试过了,但它没有改变任何东西…'d建议首先消除拟合,手动指定a=,b=并查看是否得到您期望的绘图类型。在不知道函数是什么的情况下很难看到发生了什么…(可能a和b同时出现?)是的,a和b同时出现。函数类型为z1(x)=(a+b)v4手册中的x+z10和z2(x)=(a-b)x+z20:为了使函数适合两个自变量,z=f(x,y),所需的格式与四项x:y:z:s一起使用。必须提供完整的格式-对于缺少的标记,不假定默认列。每个数据点的权重根据上述“s”进行计算。如果错误估计不可用,则可以将常量值指定为常量表达式(请参见使用(第43页)的绘图数据文件),例如,使用1:2:3:(1)。
 fit z(x) 'data.txt' using (column(0)):1 via a,b
 plot 'data.txt' using (column(0)):1, z(x)