【问题标题】:Fitting multiset data in GNUplot在 GNUplot 中拟合多集数据
【发布时间】:2020-08-06 15:29:49
【问题描述】:

我有 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

【问题讨论】:

  • 你的问题我不清楚。你的意思是 5 个 2x2 矩阵?您的 y 数据如何?你想装什么?请显示一个最小的简化示例...带有一些数据和功能。然后也许我们可以就如何以不同方式排列数据提出建议。
  • @theozh 我已经编辑了这个问题来展示一个简单的例子
  • 还是不清楚。我是否正确理解您有四个数据集,称它们为 A B C D,每个数据集包含五个“y”值。您想为它们中的每一个拟合一个函数 f(a,x) = y。出于某种原因,您计划打印“a”的结果估计值,将它们称为正方形中的 a(A)、a(B)、a(C)、a(D),但这与计算无关。程序应该在哪里找到这个拟合的 x 值?

标签: gnuplot


【解决方案1】:

嗯,还是很难理解。但是,让我尝试一下,希望我们越来越接近你想要的。

为了说明和更容易理解,下面示例矩阵中的值选择如下:<MatrixNo><RowNo><ColNo>。在您的 cmets 之后,它现在是 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 

剧情:

【讨论】:

  • 虽然这适用于 4 组 y 数据,但我如何修改 sprintf 命令,使其适用于 N 为大数的 N 组 y 数据。
  • 这取决于你如何需要输出。就像打印输出或格式化为矩阵或数据集......?查看修改后的答案。
  • 好的,那么它是一个 NxN 矩阵还是 N 是一个平方数(如您的示例 4)一个 sqrt(N) x sqrt(N) 矩阵?
  • N 是 y 个数据集的总数,因此矩阵可以是 I x J 类型,其中 I 和 J 可以是任意数字,使得 I x J = N。可以把它想象成 5每个像素有 N 个像素的图像,每个像素都需要进行拟合,以制作具有参数的新图像
  • 请始终从一开始就指定您的确切输入和所需输出,这里:您有 M 次 IxJ 矩阵。理想情况下使用数据和代码,即最小化的工作示例,可以使用 2x2 矩阵。请参阅修改后的答案,现在用于 M 次 IxJ 矩阵。我假设您可以按照给定的格式组织数据。
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2013-01-22
  • 2021-11-30
  • 2017-11-09
  • 2019-06-14
  • 2014-07-01
  • 2020-07-08
相关资源
最近更新 更多