在 GNUplot 中拟合多集数据

Fitting multiset data in GNUplot

我有 5 个矩阵,每个矩阵有 4 个单元格。我需要使用 GNUplot 中的函数来拟合每个单元格。所以,例如。与第一个单元格对应的 y 数据将是 5 个矩阵中第一个单元格的值。我应该如何在文件中安排这些数据,以便 GNUplot 自动识别 x 和 y 数据并适合每个单元格,将拟合参数作为矩阵以与单元格相同的顺序给出?还有,这样的装修脚本要怎么写?

举例如下:

Matrix 1: 2 4
          3 6
Matrix 2: 5 7
          9 1

像这样存在5个矩阵 现在第一组 y 数据是 2,5,...;第二组是 4,7,...;第三组是 3,9,...;和第四组 6,1,... 假设我的 x 值为 0、1、2、4、8。现在,我将第一组 y 值与这些 x 值一起拟合到某个函数 f(x) 并获得参数值 4。类似地,对于其他三组,我得到 7,9 和 6 作为参数值。所以我希望结果看起来像:

Result: 4 7
        9 6

嗯,还是比较难理解。但是尽管如此,让我尝试一下,希望我们越来越接近您想要的。

为了便于说明和便于理解,下面示例矩阵中的值选择如下:<MatrixNo><RowNo><ColNo>。在您发表评论后,它现在是 3x2 矩阵。

数据:

# Matrix1
111  112
121  122
131  132

# Matrix2
211  212
221  222
231  232

# Matrix3
311  312
321  322
331  332

# Matrix4
411  412
421  422
431  432

# Matrix5
511  512
521  522
531  532

我想上面的数据可能会更好地组织在 方式如下面的示例代码所示。当然,您可以使用外部工具甚至 gnuplot 重新格式化数据。 然后,你在一个循环中做适合。为了记住拟合参数值,我使用了数组(我猜需要 gnuplot 5.0 或 5.2)。在 gnuplot 控制台中,例如输入 help fit 或任何其他关键字以获取更多信息。

代码:(为 I x J 矩阵编辑)

### fits in a loop
reset session

$Data <<EOD
0  111  112  121  122  131  132
1  211  212  221  222  231  232
2  311  312  321  322  331  332
4  411  412  421  422  431  432
8  511  512  521  522  531  532
EOD

M = 5    # number of matrices
I = 3    # number of rows of each matrix
J = 2    # number of columns of each matrix
N = I*J  # number of y values

array aList[N]
array bList[N]

# fitting in a loop
f(x,a,b) = a*sqrt(x) + b
set fit nolog quiet
do for [i=1:N] {
    fit f(x,a,b) $Data u 1:(column(i+1)) via a,b
    aList[i] = a
    bList[i] = b
}

# prepare the matrix output 
do for [i=1:I] {
    line = ''
    do for [j=1:J] {
        line = line.sprintf("%g ",bList[(i-1)*J+j])
    }
    print line
}

set key bottom right
plot for [i=1:N] $Data u 1:(column(i+1)) w p ti sprintf("Values %d",i), \
     for [i=1:N] f(x,aList[i],bList[i]) w l ti sprintf("Fit %d",i)

### end of code

结果:

97.1388 98.1388 
107.139 108.139 
117.139 118.139 

剧情: