4

似乎矩阵数学有许多有用的应用,其中并非给定矩阵中的所有条目都共享相同的单位。我想研究可以跟踪这些单元并确保我们不会犯错误的类型系统(类似于已经对标量算术进行维度检查的许多库和语言)。我将举一个我所说的例子,然后我有几个问题从那里开始。

(从这里抄写一个随机混合单位线性规划示例,尽管这不是一个家庭作业问题,希望会变得清晰)

鲍勃的面包店出售百吉饼和松饼。烤一打百吉饼 Bob 需要 5 杯面粉、2 个鸡蛋和 1 杯糖。烤一打松饼 Bob 需要 4 杯面粉、4 个鸡蛋和 2 杯糖。Bob 可以以 10 美元/打的价格出售百吉饼,以 12 美元/打的价格出售松饼。Bob 有 50 杯面粉、30 个鸡蛋和 20 杯糖。Bob 应该烤多少个百吉饼和松饼才能使他的收入最大化?

所以让我们把它放在矩阵形式(任意具体语法......):

 A = [ [ 5 cups of flour / dozen bagels, 4 cups of flour / dozen muffins ],
       [ 2 eggs          / dozen bagels, 4 eggs          / dozen muffins ],
       [ 1 cups of sugar / dozen bagels, 2 cups of sugar / dozen muffins ] ]

 B = [ [ 10 dollars      / dozen bagels, 12 dollars      / dozen muffins ] ]

 C = [ [ 50 cups of flour ],
       [ 30 eggs          ],
       [ 20 cups of sugar ] ]

我们现在想要最大化内积B * X,使得A * X <= CX >= 0,一个普通的线性规划问题。

在带有单元检查的假设语言中,我们将如何理想地表示这些矩阵的类型?

我在想一个 m x n 矩阵只需要 m + n 个单位,而不需要完整的 m * n 个单位,因为除非这些单位以合理的方式分布到行和列中,否则剩下的唯一合理的操作就是加/减完全一般的矩阵与另一个完全相同的形状或乘以一个标量。

我的意思是,单位的安排A比在以下方面更有用:

WTF = [ [ 6 pigeons,      11 cups of sugar ],
        [ 1 cup of sugar, 27 meters        ],
        [ 2 ohms,         2 meters         ] ]

而且像后者这样的情况在实践中根本不会出现。(有人有反例吗?)

在这个简化假设下,我们可以用 m + n 个单位表示矩阵的单位如下。对于 m 行中的每一行,我们找出该行中所有条目共有的单位,对于 n 列也是如此。让我们将行单位放在列向量中,将列单位放在行向量中,因为这使得Units(M) = RowUnits(M) * ColUnits(M),这似乎是一个不错的属性。因此,在示例中:

RowUnits(A) = [ [ cups of flour ],
                [ eggs ],
                [ cups of sugar ] ]
ColUnits(A) = [ [ dozen bagels ^ -1, dozen muffins ^ -1 ] ]

RowUnits(B) = [ [ dollars ] ]
ColUnits(B) = [ [ dozen bagels ^ -1, dozen muffins ^ -1 ] ]

RowUnits(C) = [ [ cups of flour ],
                [ eggs ],
                [ cups of sugar ] ]
ColUnits(C) = [ [ 1 ] ]

似乎(虽然我不确定如何证明它......)的单位M1 * M2RowUnits(M1 * M2) = RowUnits(M1)ColUnits(M1 * M2) = ColUnits(M2),并且为了使乘法有意义,我们需要ColUnits(M1) * RowUnits(M2) = 1

我们现在可以推断 的单位X,因为表达式A * X <= C必须表示那个A * X并且C具有相同的单位。这意味着RowUnits(A) = RowUnits(C)(检查出)、ColUnits(X) = ColUnits(C)RowUnits(X)是 的转置的元素倒数,ColUnits(A)换句话说RowUnits(X) = [ [ dozen bagels ], [ dozen muffins ] ]

(“万岁”,我听到你在欢呼,“我们刚刚绕着月球转了一圈,看到了一些非常明显的东西!”)

我的问题是:

  1. 你能想到现实世界的例子,其中矩阵元素的单位不属于这样的“行单位”和“列单位”吗?
  2. 你能想出一种优雅的方法来处理相同单元是每个单元格中的一个因素的情况,因此它可以等效地放置在每个“行”或每个“列”中,因此行单元和列单元不是独特的代表?将它们保持在“最低条件”并消除愚蠢的附带条件应该是什么,例如将每一行乘以,furlongs ^ 17以便您可以将每列乘以furlongs ^ -17
  3. 你能证明我提到的通过矩阵乘法传播这些单元注释的规则吗?
  4. 你能发现/展示这些单元注释如何通过矩阵逆运算传播的规则吗?我对 2x2 矩阵进行的一些手工计算表明 的单位Inverse(M)是 的单位的元素倒数Transpose(M),但我不知道如何在一般情况下显示它,或者即使对于一般情况也是如此。
  5. 你知道关于这些问题的任何学术工作吗?或者对某种语言的程序执行这种静态分析的软件?我可能使用了错误的搜索词,但我找不到任何东西。

我感兴趣的实际应用程序是通过确保所有滤波器增益等在任何地方都具有正确的单位来防止信号处理/控制器软件出现问题,在这些应用程序中,在不同单元中使用具有不同单位的此类矩阵非常常见。

4

3 回答 3

1

4) 如果你承认 inv(M)*M = Identity 是无量纲的 (Id*X=X),这与 3 的证明相同)

5)我会询问是否可以扩展 BOOST UNITS http://www.boost.org/doc/libs/1_50_0/doc/html/boost_units.html并最终联系作者

1 & 3)
你的量纲问题 Adim*Xdim=Ydim 可以转化为无量纲问题 A*X=Y

  • 您将输入参数 X 除以它们各自的单位(X)
  • 然后你将输出 Y 乘以它们各自的单位(Y)

那是

Ydim=diag(units(Y))*Y
Ydim=diag(units(Y))*A*X
Ydim=diag(units(Y))*A*inv(diag(units(X)))*Xdim
Ydim=Adim*Xdim

或者其他方式

Adim*Xdim=Ydim
Adim*diag(units(X))*X=diag(units(Y))*Y
Adim*diag(units(X))*X=diag(units(Y))*A*X

这对于任何 X 都是正确的,所以你会发现

A=inv(diag(units(Y))) * Adim * diag(units(X))
Adim=diag(units(Y)) * A * inv(diag(units(X)))

也就是说,您将无量纲 A 的行与 Y 的单位和列乘以 X 的单位的倒数

2)从数学上讲,您从矩阵中简单地考虑了一个标量,所以我认为这个问题与 5)更相关,您如何用软表示这个。回答时必须将此功能作为要求 5)

于 2012-08-16T08:58:24.147 回答
1

关于该主题的一个非常好的信息来源是 George W. Hart 的“多维分析”一书,该问题的评论中也引用了该书。关于个别问题(数学结果在书中有解释):

首先,我们需要介绍一点符号。方括号运算符提取矩阵/矩阵条目的物理单位,即为 我们提供矩阵 A 中条目 (i, j) 的单位。此外,~ 运算符转置向量/矩阵并反转其单位, IE

然后我们需要书中的另一个结果,它说任何可乘矩阵 A 中的单位都可以写为,即矩阵条目的单位可以用 2 个向量 a 和 b 的外积来描述,其中 a 是列向量, b^\sim 是一个单位倒置的行向量。

对 4) 的回答:给出矩阵 A 的逆矩阵的单位, 这意味着这些单位是原始问题中已经提出的原始单位的元素倒数。

关于 3):是的,如果内部单位相同并因此抵消,您关于矩阵乘法的规则是正确的,即

但是,也可以乘以内部列/行单元在维度上平行的矩阵:(这里 b/c 非正式地指的是公共单位因子,必须乘以 c 以获得 c)

关于 2):通常矩阵的每一行或每一列都指代一个特定的物理量,该物理量导致行和列单元的规范表示。例如,考虑卡尔曼滤波应用中的 (x,y) 位置协方差矩阵。在那里,很明显,行和列描述了某个物理单元中的 x 和 y 位置,例如,所有行和列单元都是 [m],导致每个矩阵元素的单位为 [m^2] . 也可以使用 [m/s] 和 [s*m] 作为行和列单位,这也将导致每个元素的单位为 [m^2]。

但是,从问题描述中应该清楚,第一种表示更有意义。

关于 5):有 George W. Hart 的书和一篇非常短的论文,其中包含该书https://www.georgehart.com/research/tdm.ps的一些关键结果。就软件实现而言,Meeting C++ 2021 https://www.youtube.com/watch?v=4LmMwhM8ODI的演讲描述了一个库的实现,该库能够用物理单位注释矩阵和向量,所有检查在编译时完成。所提供的库还能够完全处理其他答案之一中描述的离散卡尔曼滤波器示例。

于 2022-02-07T21:11:57.383 回答
0

我认为这个很好的现实世界的例子——对你的问题 1 的回答——可能是离散卡尔曼滤波器的实现。一般来说,它的方程在元组和矩阵上运行,其中一些可能表示对应于物理单位的值。

只要需要多维卡尔曼滤波器计算,其中估计的结果在值类型上不均匀,在我看来就会有反转和转置,以及具有某些(对称)混合值的矩阵之间的乘法在其元素上代表不同的物理事物。

在尝试使用 DKF 和 C++ 以及代码中的强类型值表示来实现传感器融合算法时,我刚刚触及了这个问题。

有很多卡尔曼滤波器实现,开发人员只需使用整数、浮点数、双精度等的向量和矩阵,但我想跟踪使用的每个值的维度,然后问题就出现了。

不幸的是,我对这个问题很陌生(仍在解决这个问题),所以我现在还不能帮助你回答 2 到 5:-/

于 2012-08-27T10:30:16.250 回答