代码之家  ›  专栏  ›  技术社区  ›  Foo Bar

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

  •  3
  • Foo Bar  · 技术社区  · 13 年前

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   MickLock    13 年前

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

    下面的代码可以满足您的要求;定义函数 z(x) 对于前10个数据点和其余数据点(这是 x HAS必须等于行号),

    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,改变参数 a b

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

    计划看看我们怎么做

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

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