ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

逆行列と行列式

はじめに

A が正方で特異でない場合、方程式 AX = IXA = I は同じ解 X となります。この解は A の逆行列と呼ばれ、A-1 で表し、関数 inv で計算できます。

行列の "行列式" は理論的な考察や数式計算に役立ちますが、スケーリングや丸め誤差の特性によって数値計算の信頼性は低下します。この条件の下で、関数 det は正方行列の行列式を計算します。

A = pascal(3)

A =
       1     1     1
       1     2     3
       1     3     6
d = det(A)
X = inv(A)

d =
       1

X = 
       3    -3     1
      -3     5    -2
       1    -2     1

A は対称で整数要素をもち、行列式が 1 であるため逆行列も整数要素になります。ただし、

B = magic(3)

B =
       8     1     6
       3     5     7
       4     9     2
d = det(B)
X = inv(B)

d =
     -360

X =
      0.1472   -0.1444    0.0639
     -0.0611    0.0222    0.1056
     -0.0194    0.1889   -0.1028

上記のように、X の要素を詳細に調べたり、format rat を使用すると、これらは 360 で割った整数であることがわかります。

A が正方で特異でない場合に丸め誤差を無視すると、理論的には X = inv(A)*BX = A\B と等価で、Y = B*inv(A)Y = B/A と等価です。ただし、バックスラッシュとスラッシュを使う計算を推奨します。この計算方法を使うと、計算時間が短く、使用メモリが少なく、かつエラーの検出が容易であるという利点があるためです。

疑似逆行列

長方行列は、逆行列または行列式をもたないことがあります。少なくとも方程式 AX = IXA = I のいずれかは解をもちません。逆行列に対する部分的な置換は「Moore-Penrose 疑似逆行列」によって与えられ、関数 pinv で計算されます。

format short
C = fix(10*gallery('uniformdata',[3 2],0));
X = pinv(C)

X =
    0.1159   -0.0729    0.0171
   -0.0534    0.1152    0.0418

行列

Q = X*C

Q =
    1.0000    0.0000
    0.0000    1.0000

は 2 行 2 列の単位行列になりますが、行列

P = C*X

P =
    0.8293   -0.1958    0.3213
   -0.1958    0.7754    0.3685
    0.3213    0.3685    0.3952

は 3 行 3 列の単位行列ではありません。ただし P は対称で P*CC に等しく、X*PX に等しいという点では、P は空間の一部で単位行列のように機能します。

ランク落ちのシステムに対する解法

A が m > n の m 行 n 列で、フル ランクが n の場合、次の 3 つの各ステートメントは理論的には同じ最小二乗解 x を計算します。

x = A\b
x = pinv(A)*b
x = inv(A'*A)*A'*b

ただし、バックスラッシュ演算子の方が高速に処理できます。

ただし A がランク落ちの場合、最小二乗問題の解は一意ではなくなります。次の値を最小にするベクトル x は多数あります。

norm(A*x -b)

x = A\b によって計算される解が基本解です。この解は r を A のランクとすると、最大 r 個のゼロ以外の要素をもちます。x = pinv(A)*b によって計算される解は norm(x) を最小にするため、最小ノルム解といいます。A'*A が特異であるため、x = inv(A'*A)*A'*b を使って解を計算しても失敗します。

さまざまな解法例を示します。

A = [ 1  2  3
      4  5  6
      7  8  9
     10 11 12 ];

上記は、ランク落ちです。2 番目の列は、最初の列と 3 番目の列の平均になっています。ここで、

b = A(:,2)

が 2 番目の列の場合、A*x = b になる解は x = [0 1 0]' になります。ただし、この x を計算する方法はありません。バックスラッシュ演算子は次の結果を出力します。

x = A\b

警告:ランク落ち、rank = 2、tol = 1.4594e-014. x = 0.5000 0 0.5000

この解は 2 つのゼロ以外の要素をもちます。疑似逆行列のアプローチは次のようになります。

y = pinv(A)*b

y =
      0.3333
      0.3333
      0.3333

ランク落ちに対する警告はありません。ただし norm(y) = 0.5774norm(x) = 0.7071 よりも小さくなります。最終的に、

z = inv(A'*A)*A'*b

は失敗します。

警告:行列が特異値に近いか、スケーリングが正しくありません。結果が不正確になる可能性があります。RCOND = 9.868649e-018。 z = -0.8594 1.3438 -0.6875
この情報は役に立ちましたか?