我想用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”文件中的行号是函数xz(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个点)用一个空行(或两个,记不起来)分开,并相应地修改脚本。

10-08 20:28