4

特定の行列のすべてのエントリが同じ単位を共有しているわけではない行列計算には、多くの便利なアプリケーションがあるようです。これらの単位を追跡できる型システムを調べて、間違いを犯さないようにしたいと思います (スカラー演算の次元チェックを既に行っている多くのライブラリや言語と同様)。私が話していることの例を挙げてから、そこから構築するいくつかの質問があります.

(ここからランダムな混合単位の線形計画法の例を引用しますが、これは宿題の質問ではなく、うまくいけば明らかになります)

ボブのベーカリーではベーグルとマフィンを販売しています。ボブがベーグルを 12 個焼くには、小麦粉 5 カップ、卵 2 個、砂糖 1 カップが必要です。ボブがマフィンを 12 個焼くには、小麦粉 4 カップ、卵 4 個、砂糖 2 カップが必要です。ボブはベーグルを 10 ドル/ダース、マフィンを 12 ドル/ダースで販売できます。ボブは小麦粉 50 カップ、卵 30 個、砂糖 20 カップを持っています。収益を最大化するために、ボブは何個のベーグルとマフィンを焼く必要がありますか?

それでは、それを行列形式に入れましょう(任意の具体的な構文...):

 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

XA * 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. これらの単位注釈が行列の逆演算を通じてどのように伝播するかのルールを発見/表示できますか? Inverse(M)2x2行列で行ったいくつかの手計算は、 の単位が の単位の要素ごとの逆数であることを示唆しています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) の単位を返します。さらに、~ 演算子は、ベクトル / 行列を転置し、その単位を反転します。 、つまり

次に、任意の乗法行列 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では、物理単位で行列とベクトルに注釈を付けることができるライブラリの実装について説明しています。コンパイル時に行われます。提示されたライブラリは、他の回答の 1 つで説明されている離散カルマン フィルターの例を完全に処理することもできます。

于 2022-02-07T21:11:57.383 に答える
0

実世界の良い例 - あなたの質問 No 1 への答え - は、離散カルマン フィルターの実装である可能性があると思います。一般に、その方程式はタプルと行列で機能し、それらのいくつかは物理単位に対応する値を表す場合があります。

多次元のカルマン フィルター計算が必要な場合、推定結果の値の型が均一ではない場合、反転と転置、および特定の (対称的な) 混合値を持つ行列間の乗算が行われるように見えます。要素でさまざまな物理的なものを表します。

DKF を C++ で使用し、コードで厳密に型指定された値表現を使用して、センサー フュージョン アルゴリズムを実装しようとしたときの問題に触れました。

開発者が整数、浮動小数点数、倍精度数などのベクトルと行列を単純に使用するカルマン フィルターの実装はたくさんありますが、使用されるすべての値の次元を追跡したいと思い、問題が発生しました。

残念ながら、私はこの問題にかなり慣れていない (まだ取り組んでいる) ので、現時点では 2 から 5 の回答をお手伝いすることはできません :-/

于 2012-08-27T10:30:16.250 に答える