在 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
剧情:
我有 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
剧情: