MATLAB Function Reference    
inv

逆行列の計算

表示

詳細

Y = inv(X) は、正方行列 X の逆行列を求めます。スケーリングが悪かったり、特異値に近いとワーニングメッセージが表示されます。

実際問題として、行列の厳密な逆行列を求めることはほとんど必要ではありません。inv の間違った使い方は、線形方程式 Ax = b を求めるときにしばしば起こります。この方程式を解く一つの方法は、x = inv(A)*b を使うことです。計算時間と数値精度の観点から見て良い方法は、行列除算演算子を、x = A\b というように使うことです。この方法は、逆行列を求めないで、ガウス消去法を用いて解を求めます。詳しくは、\/ を参照してください。

例題

ここでは、inv(A)*b で行列の逆行列を求めて線形システムを解く方法と、A\b で直接線形システムを解く方法の違いを示します。500次の行列A は、条件数 cond(A) が 1.e10 で、ノルム norm(A)が 1になるように要素が作られています。厳密解 xは、長さ 500のランダムベクトルで、右辺は b =A*x になります。従って、この線形方程式システムは条件数が悪いのですが、矛盾はありません。

300 MHz のラップトップコンピュータで、つぎのステートメントを計算すると、

つぎの結果を得ます。

これに対して、つぎのステートメント

は、つぎの結果を得ます。

y = inv(A)*b で解を求めるためには、z = A\b で解を求めるのに比べ、約 2.5 倍の計算時間を要します。計算された解は、ほぼ同じ計算誤差 1.e-7 で求められています。この計算誤差は、行列の条件数を反映するものです。しかし、計算された解をもとの方程式に代入して得られる残差の大きさは、数桁も異なっています。直接解を求める方法では、方程式システムが悪い状態であっても、コンピュータの精度と同じような残差になります。

この例は典型的なものです。inv(A)*b の代わりに、A\bを使うと、計算時間で約2倍から3倍速く、残差はデータの大きさに関連してコンピュータの精度と同じ程度になります。

アルゴリズム

inv は、LAPACK ルーチンを使って、逆行列を計算します。

行列
ルーチン
実数
DLANGE, DGETRF, DGECON, DGETRI
複素数
ZLANGE, ZGETRF, ZGECON, ZGETRI

参考

det, lu, rref

代数演算子 \, /

参考文献

Anderson, E., Z. Bai, C. Bischof, S. Blackford, J. Demmel, J. Dongarra, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenney, and D. Sorensen, LAPACK User's Guide, Third Edition, SIAM, Philadelphia, 1999.


 intersect invhilb