関数matrix_inverse_LU マニュアル

(The documentation of function matrix_inverse_LU)

Last Update: 2021/12/6


◆機能・用途(Purpose)

LU分解を用いて正方行列の逆行列を計算する。 LU分解を行う前の行列そのものを与えるバージョン。
Calculate the inverse of a square matrix using an LU decomposition. In this function, the matrix itself (i.e., the matrix for which the LU decomposition has not been performed) is given.


◆形式(Format)

#include <matrix/inverse.h>
inline struct matrix matrix_inverse_LU(const struct matrix A)


◆引数(Arguments)

A 逆行列を計算したい正方行列\(\myvector{A}\)。
A square matrix \(\myvector{A}\) for which the inverse is to be calculated.


◆戻り値(Return value)

行列\(\myvector{A}\)の逆行列。
The inverse of a matrix \(\myvector{A}\).


◆使用例(Example)

struct matrix A;
struct matrix Ainv=matrix_inverse_LU(A);


◆検証(validation)

この関数が実際に正しい結果を与えるか否かの検証のため、 \(\myvector{A}\)を乱数を用いて生成し、 この関数を用いて逆行列\(\myvector{A}^{-1}\)を求めた後、 \(\myvector{A}\myvector{A}^{-1}\)を計算して 単位行列になるかをチェックした。 \(\myvector{A}\myvector{A}^{-1}\)の計算には 関数multiply_matrix (matrix/operation.h)を用いた。 結果は以下の通りであった。
To examine if this function gives a correct result, \(\myvector{A}\) was generated by random values, and \(\myvector{A}^{-1}\) was calculated using this function, and then \(\myvector{A}\myvector{A}^{-1}\) was calculated to check if it becomes a unit matrix. Function multiply_matrix (matrix/operation.h) was used for the calculation of \(\myvector{A}\myvector{A}^{-1}\). The result was as follows.

\[\begin{equation*} \myvector{A}= \begin{pmatrix} -5.542348e-10 & 1.180734e-09 & -5.946389e-10 & -5.832139e-10 \\ -5.107910e-10 & -2.357166e-09 & 1.389110e-09 & 6.061486e-10 \\ -1.676399e-09 & -8.405894e-10 & 9.754172e-10 & -7.404720e-10 \\ 1.276538e-09 & -9.070130e-10 & -4.890220e-10 & 5.082556e-10 \end{pmatrix} \end{equation*}\] \[\begin{equation*} \myvector{A}^{-1}= \begin{pmatrix} -2.383907e+09 & -1.493902e+09 & 7.269966e+08 & 1.053009e+08 \\ -5.438816e+08 & -2.738960e+08 & -3.361579e+08 & -7.871889e+08 \\ -2.809204e+09 & -1.210118e+09 & 5.320499e+08 & -1.005178e+09 \\ 2.313949e+09 & 2.098986e+09 & -1.913908e+09 & -6.688866e+08 \end{pmatrix} \end{equation*}\] \[\begin{equation*} \myvector{A}\myvector{A}^{-1}= \begin{pmatrix} 1.000000e+00 & 0.000000e+00 & 2.220446e-16 & 1.110223e-16 \\ -8.881784e-16 & 1.000000e+00 & 2.220446e-16 & -5.551115e-16 \\ 0.000000e+00 & 2.220446e-16 & 1.000000e+00 & -1.110223e-16 \\ -2.220446e-16 & -6.661338e-16 & -2.220446e-16 & 1.000000e+00 \end{pmatrix} \end{equation*}\] この結果から、\(\myvector{A}\myvector{A}^{-1}\)は 単位行列と見なせるものになっており、 \(\myvector{A}^{-1}\)を正しく求められたことが分かる。
In this result, \(\myvector{A}\myvector{A}^{-1}\) is sufficiently close to a unit matrix, indicating that \(\myvector{A}^{-1}\) was solved correctly.


◆補足(Additional notes)

この関数の中で実際にやっていることは
  1. 関数LU_decomposition (matrix/inverse.h)を用いて \(\myvector{A}\)をLU分解する、
  2. その結果を関数matrix_inverse_givenLU (matrix/inverse.h)に入力して 解を求める、
という2つの処理である。すなわち
struct matrix A;
struct LU A_LU=LU_decomposition(A);
struct matrix Ainv=matrix_inverse_givenLU(A_LU);
と書いてもこの関数を用いて逆行列を計算したのと全く同じ結果が得られる。
Within this function, the following two procedures are conducted:
  1. LU decomposition of \(\myvector{A}\) using the function LU_decomposition (matrix/inverse.h), and
  2. calculating the inverse through function matrix_inverse_givenLU (matrix/inverse.h).
Therefore, writing the following code will results in exactly the same value as what is obtained by this function:
struct matrix A;
struct LU A_LU=LU_decomposition(A);
struct matrix Ainv=matrix_inverse_givenLU(A_LU);

逆行列を計算できるのは\(\myvector{A}\)が正則な場合のみである。 非正則行列の場合にはLU分解の段階でエラーとなる。 しかしマクロFORCE_LU_DECOMPOSITIONをTRUEにした場合には 非正則行列であっても計算が行われる (詳しくは関数LU_decompositionのマニュアル参照)。 この場合、この関数の戻り値が逆行列とはならない点に留意。
The inverse can be computed only when \(\myvector{A}\) is a regular matrix. If \(\myvector{A}\) is not regular, an error occurs during the LU decomposition. However, if a macro FORCE_LU_DECOMPOSITION is set TRUE, then the calculation is conducted for an irregular matrix; for detail, see the documentation of function LU_decomposition. In this case, note that the return value of this function is not an inverse matrix.