Main Content

inv

説明

Y = inv(X) は、正方行列 X逆行列を計算します。

  • X^(-1)inv(X) と等価です。

  • x = A\bx = inv(A)*b とは異なる方法で計算され、連立線形方程式の求解に推奨されます。

すべて折りたたむ

3 行 3 列の行列の逆行列を計算します。

X = [1 0 2; -1 5 0; 0 3 -9]
X = 3×3

     1     0     2
    -1     5     0
     0     3    -9

Y = inv(X)
Y = 3×3

    0.8824   -0.1176    0.1961
    0.1765    0.1765    0.0392
    0.0588    0.0588   -0.0980

結果をチェックします。理想的には、Y*X は単位行列を生成します。inv は浮動小数点計算を使用して逆行列を求めるため、実際には、Y*X は単位行列 eye(size(X)) に近くなりますが、厳密に等価ではありません。

Y*X
ans = 3×3

    1.0000    0.0000   -0.0000
         0    1.0000   -0.0000
         0   -0.0000    1.0000

inv(A)*b を使用した逆行列による線形システムの求解が、バックスラッシュ演算子を使用した直接的な求解 x = A\b より劣る理由を調べます。

500 次の乱数行列 A を、条件数 cond(A)1e10 でノルム norm(A)1 となるように作成します。厳密解 x は長さ 500 の乱数ベクトルで、右辺は b = A*x になります。したがって、この線形方程式系は悪条件ですが、矛盾はありません。

n = 500; 
Q = orth(randn(n,n));
d = logspace(0,-10,n);
A = Q*diag(d)*Q';
x = randn(n,1);
b = A*x;

線形システム A*x = b を、係数行列 A の逆行列を求めることで解きます。タイミング情報を取得するには、tic および toc を使用します。

tic
y = inv(A)*b; 
t = toc
t = 0.5247

計算の絶対誤差と残差誤差を見つけます。

err_inv = norm(y-x)
err_inv = 3.3813e-06
res_inv = norm(A*y-b)
res_inv = 4.6577e-07

ここで、バックスラッシュ演算子 \ を使用して同じ線形システムを解きます。

tic
z = A\b;
t1 = toc
t1 = 0.3137
err_bs = norm(z-x)
err_bs = 2.6561e-06
res_bs = norm(A*z-b)
res_bs = 2.6734e-15

バックスラッシュ計算の方が速く、残差誤差の桁数も少なくなります。err_inverr_bs がどちらも 1e-6 単位の大きさであるという事実は、単に行列の条件数を反映したものです。

この例は典型的なものです。inv(A)*b の代わりに A\b を使用すると計算が 2 倍から 3 倍速くなり、残差はデータの大きさに対するコンピューターの相対的精度と同程度になります。

入力引数

すべて折りたたむ

入力行列。正方行列として指定します。X のスケーリングが良好でなかったり、特異行列に近い場合、inv 計算の数値精度は失われます。行列の条件数をチェックするには、rcond または cond を使用します。

データ型: single | double
複素数のサポート: あり

詳細

すべて折りたたむ

逆行列

行列 X は、XY=YX=In となる同じサイズの行列 Y が存在する場合に可逆です。ここで、Innn 列の単位行列です。行列 Y は、X の逆行列と呼ばれます。

逆行列のない行列は特異行列です。正方行列は、行列式が正確にゼロの場合のみ特異行列となります。

ヒント

  • 行列の明示的な逆行列を求める必要はあまりありません。関数 inv は、線形方程式系 Ax = b を解くときにしばしば誤用されます。この方程式を解く 1 つの方法は、x = inv(A)*b を使うことです。実行時間と数値精度の両面でより優れた方法は、行列バックスラッシュ演算子を x = A\b のように使用することです。この場合、逆行列を明示的に求めることなく、ガウスの消去法を使って解を求めます。詳細については、mldivide を参照してください。

アルゴリズム

inv は、入力行列の LU 分解 (または、入力行列がエルミートの場合は LDL 分解) を実行します。その後、その結果を使用して、解が逆行列 inv(X) である線形システムを形成します。スパース入力の場合、inv(X) はスパース単位行列を作成し、バックスラッシュ X\speye(size(X)) を使用します。

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する

参考

| | |