MATLAB Function Reference | ![]() ![]() |
表示
Y = inv(X)
詳細
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 のラップトップコンピュータで、つぎのステートメントを計算すると、
tic,
y = inv(A)*b, toc
err = norm(y-x)
res = norm(A*y-b)
elapsed_time = 1.3320 err = 2.4321e-07 res = 1.8500e-09
tic, z = A\b, toc err = norm(z-x) res = norm(A*z-b)
elapsed_time = 0.5810 err = 6.6161e-08 res = 9.1103e-16
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 |
参考
代数演算子 \
, /
参考文献
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 | ![]() |