スポンサードリンク

こんにちは、ももやまです。

線形代数第03羽では、ただ1つの解をもつ連立方程式 \( A \vec{x} = \vec{b} \) を正方行列の係数行列 \( A \) の逆行列 \( A^{-1} \) を用いて \( \vec{x} = A^{-1} \vec{b} \) と解く方法を説明しましたね。

しかし、係数行列の正方行列ではない場合、そもそも 逆行列 \( A^{-1} \) が定義がされないため、[たとえ解がただ1つであったとしても \( \vec{b} = A^{-1} \vec{b} \) を用いて連立方程式を計算することができません。

例えば、\[
\left\{ \begin{align*} \ \ x - \ \ y & = 1 \\ -x +2y & = 1 \\ 2 x - \ \ y & = 4 \end{align*} \right.
\]のような連立方程式は、係数行列が\[
A = \left( \begin{array}{cc} 1 & -1 \\ -1 & 2 \\ 2 & -1 \end{array} \right)
\]となるので、逆行列を用いた計算ができませんね。

そこで、今回は「逆行列もどき」を作ることで、連立方程式を掃き出し法なしで解く方法についてみていきましょう!

スポンサードリンク

[復習] 逆行列を用いた連立方程式の計算

まずは、復習として逆行列を用いて連立方程式を計算する方法を復習しましょう。

復習

連立方程式\[
\left\{ \begin{align*} \ \ x - \ \ y & = 1 \\ -x +2y & = 1 \end{align*} \right.
\]は、行列を用いて\[
\left( \begin{array}{cc} 1 & -1  \\ -1 & 2 \end{array} \right) \left( \begin{array}{cc} x \\ y \end{array} \right) = \left( \begin{array}{cc} 1 \\ 1 \end{array} \right)
\]と書き直すことができる。

係数行列\[
A = \left( \begin{array}{cc} 1 & -1  \\ -1 & 2 \end{array} \right)
\]の逆行列を求めることで、連立方程式を解きなさい。

係数行列 \( A \)、ベクトル \( \vec{b} \) および解ベクトル \( \vec{x} \) を\[
A = \left( \begin{array}{cc} 1 & -1  \\ -1 & 2 \end{array} \right), \ \ \ \vec{x} = \left( \begin{array}{cc} x \\ y \end{array} \right), \ \ \ \vec{b} = \left( \begin{array}{cc} 1 \\ 1 \end{array} \right)
\]とおくことで、\[\begin{align*}
A \vec{x} & = \vec{b} \\
A^{-1} A \vec{x} & = A^{-1} \vec{b} \ \ \left( \mathrm{両辺の左側に} \ A^{-1} \ \mathrm{を掛ける} \right) \\
E \vec{x} & = A^{-1} \vec{b} \\
\vec{x} & = A^{-1} \vec{b}
\end{align*}\]と逆行列 \( A^{-1} \) を用いて連立方程式が計算できる形となります。

よって、\[\begin{align*}
A^{-1} & = \frac{1}{|A|} \left( \begin{array}{cc} 2 & 1  \\ 1 & 1 \end{array} \right) \\ & = \left( \begin{array}{cc} 2 & 1  \\ 1 & 1 \end{array} \right)
\end{align*}\]となるので、\[\begin{align*}
\vec{x} & = \left( \begin{array}{cc} 2 & 1  \\ 1 & 1 \end{array} \right) \left( \begin{array}{cc} 1 \\ 1 \end{array} \right)
\\ & = \left( \begin{array}{cc} 3 \\ 2 \end{array} \right)
\\ & = \left( \begin{array}{cc} x \\ y \end{array} \right)
\end{align*}\]と連立方程式を得る。

連立方程式と逆行列

連立方程式 \( A \vec{x} = \vec{b} \) の係数行列 \( A \) が正方行列、かつ正則であるとき、\( \vec{x} = A^{-1} \vec{b} \) で解を求めることができる。

※ 正方行列ではない場合は逆行列を用いて解を計算できない。

スポンサードリンク

1. 擬似逆行列とは

\( A \) が正方行列ではない場合、逆行列 \( A^{-1} \) が定義されないため、 \(
A^{-1} \vec{x} = \vec{b}
\) を用いた連立方程式の計算ができません。

そこで、無理やり正方行列を作って逆行列を計算できる形にしましょう。

連立方程式の形は \( A \vec{x} = \vec{b} \) ですね。この両辺に \( A^{\top} \) を掛けます。つまり、\[
A^{\top} A \vec{x} = A^{\top} \vec{b}
\]ですね。

すると、\( A^{\top} A \) は必ず正方行列となるため[1] \( A \) を \( m \) 行 \( n \) 列とすると、\( A^{\top} \) を \( n \) 行 \( m \) 列となるため、\( A^{\top} A \) は \( n \) 行 \( n \) 列になりますね。、正則であれば逆行列 \( ( A^{\top} A )^{-1} \) を持ちますね。そのため、\[\begin{align*}
A^{\top} A \vec{x} & = A^{\top} \vec{b} \\
( A^{\top} A )^{-1} (A^{\top} A) \vec{x} & = (A^{\top} A )^{-1} A^{\top} \vec{b} \\
\vec{x} & = \underbrace{ (A^{\top} A )^{-1} A^{\top} }_{A^+} \vec{b}
\end{align*}\]とすることで、正方行列掃き出し法を使わずに行列を用いた連立方程式を実現できますね!

ここで、1つ上の式に出てきた \( (A^{\top} A )^{-1} A^{\top} \) を、\( A^+ \) とおくことで\[
\vec{x} = A^+ \vec{b}
\]とあたかも逆行列を解いたかのような形にすることができます。

この \( A^+ \) のことを擬似逆行列と呼びます。(疑似逆行列・一般化逆行列・一般逆行列と表記されることもあり)

ここで、擬似逆行列の性質を確認しておきましょう。

擬似逆行列の定義と性質

\( m \) 行 \( n \) 列の行列 \( A \) の擬似逆行列(疑似逆行列・一般化逆行列・一般逆行列)は、次のように計算でき、\( A^+ \) と表記される。\[
A^+ = (A^{\top} A )^{-1} A^{\top}
\]

擬似逆行列の特徴として、つぎの2つがあげられる。

  • 擬似逆行列 \( A^+ \) は \( n \) 行 \( m \) 列である。
  • 擬似逆行列 \( A^+ \) は、\( A^{\top} A \) が正則であるときのみ計算できる。
    (\( A^{\top}A \) が正則であることは、\( \mathrm{Rank} \ A = n \) を確認すればOK)

ここで、特徴の仕組み(なぜそうなるのか)を軽く説明しましょう。

まず、擬似逆行列 \( A^+ \) のサイズですが、

  • \( A^{\top} \) は \( n \) 行 \( m \) 列
  • \( A^{\top} A \) は \( n \) 行 \( n \) 列
  • \( (A^{\top} A)^{-1} \) は \( n \) 行 \( n \) 列

となるため、\( (A^{\top} A)^{-1} A^{\top} \) は \( n \) 行 \( m \) 列となりますね。

また、擬似逆行列 \( A^+ \) は、\( A^{\top} A \) の逆行列を計算するため、\( n \) 次正方行列である \( A^{\top} A \) が正則、つまり \( \mathrm{Rank} \ A^{\top} A = n \) のときのみ擬似逆行列が計算できます。

ここで、\( A \) と \( A^{\top} A \) の行列の階数の関係として\[
\mathrm{Rank} \ A = \mathrm{Rank} \ A^{\top} A
\]が成り立つので[2]\( A \) と \( A^{\top} A \) ともに列数が \( n \) … Continue reading、\( \mathrm{Rank} \ A = n \) を確認するだけで \( \mathrm{Rank} \ A^{\top} A = n \) であることも同時に確認できます。

スポンサードリンク

2. 擬似逆行列を計算してみよう

それでは、例題で擬似逆行列の計算をしてみましょう。

例題1

次の行列\[
A = \left( \begin{array}{cc} 1 & -1 \\ -1 & 2 \\ 2 & -1 \end{array} \right)
\]の擬似逆行列 \( A^+ \) を計算しなさい。

[解説1]

\( A^+ = (A^{\top} A)^{-1} A^{\top} \) を計算すればOKです。

一気に計算するとしんどいので、

  1. \( A^{\top} A \) を計算
  2. \( (A^{\top} A)^{-1} \) を計算
  3. \( A^+ = (A^{\top} A)^{-1} A^{\top} \) を計算

とわけて計算していきましょう。

[Step1] \( A^{\top} A \) の計算

\[\begin{align*}
A^{\top} A & = \left( \begin{array}{cc} 1 & -1 & 2 \\ -1 & 2 & -1 \end{array} \right) \left( \begin{array}{cc} 1 & -1 \\ -1 & 2 \\ 2 & -1 \end{array} \right)
\\ & = \left( \begin{array}{cc} 1 + 1 + 4 & -1 - 2 - 2 \\ -1 - 2 -2 & 1 + 4 + 1 \end{array} \right)
\\ & = \left( \begin{array}{cc} 6 & -5 \\ -5 & 6 \end{array} \right)
\end{align*}\]※ \( A^{\top} A \) は必ず実対称行列になります。検算に使いましょう。

[Step2] \( (A^{\top} A)^{-1} \) の計算

\[\begin{align*}
A(A^{\top} A)^{-1} & = \frac{1}{|A^{\top} A|} \left( \begin{array}{cc} 6 & -5 \\ -5 & 6 \end{array} \right)
\\ & = \frac{1}{36-25} \left( \begin{array}{cc} 6 & 5 \\ 5 & 6 \end{array} \right)
\\ & = \frac{1}{11} \left( \begin{array}{cc} 6 & 5 \\ 5 & 6 \end{array} \right)
\end{align*}\] [Step3] 擬似逆行列の計算

\[\begin{align*}
A^+ & = (A^{\top} A)^{-1} A^{\top}
\\ & = \frac{1}{11} \left( \begin{array}{cc} 6 & 5 \\ 5 & 6 \end{array} \right) \left( \begin{array}{cc} 1 & -1 & 2 \\ -1 & 2 & -1 \end{array} \right)
\\ & = \frac{1}{11} \left( \begin{array}{cc} 6 - 5 & -6 + 10 & 12 - 5 \\ 5 - 6 & -5 + 12 & 10 - 6 \end{array} \right)
\\ & = \frac{1}{11} \left( \begin{array}{cc} 1 & 4 & 7 \\ -1 & 7 & 4 \end{array} \right)
\end{align*}\]

となるので、擬似逆行列は\[
A^+ = \frac{1}{11} \left( \begin{array}{cc} 1 & 4 & 7 \\ -1 & 7 & 4 \end{array} \right)
\]と計算できる。

3. 擬似逆行列で連立方程式を解いてみよう

擬似逆行列の計算ができるようになったので、次は実際に連立方程式を計算してみましょう。

例題2

掃き出し法を使わずに連立方程式\[
\left\{ \begin{align*} \ \ x - \ \ y & = 1 \\ -x +2y & = 1 \\ 2 x - \ \ y & = 4 \end{align*} \right.
\]を計算しなさい。

[解説2]

まずは連立方程式を行列に書き換え、\( A \vec{x} = \vec{b} \) の形にする。\[
\left( \begin{array}{cc} 1 & -1  \\ -1 & 2 \\ 2 & -1 \end{array} \right) \left( \begin{array}{cc} x \\ y \end{array} \right) = \left( \begin{array}{cc} 1 \\ 1 \\ 4 \end{array} \right)
\]

しかし、\( A \) は正方行列ではないため、逆行列 \( A^{-1} \) を計算できない。

そこで、連立方程式を擬似逆行列 \( A^+ \) を用いた下の式のように変形する。\[\begin{align*}
A \vec{x} & = \vec{b} \\
A^{\top} A \vec{x} & = A^{\top} \vec{b} \\
(A^{\top} A)^{-1} A^{\top} A \vec{x} & = (A^{\top} A)^{-1} A^{\top} \vec{b} \\
A \vec{x} & = \underbrace{ (A^{\top} A)^{-1} A^{\top} }_{A^+} \vec{b}
\end{align*}\]

ここで、\( A \) の擬似逆行列 \( A^+ \) は例題1より\[
A^+ = \frac{1}{11} \left( \begin{array}{cc} 1 & 4 & 7 \\ -1 & 7 & 4 \end{array} \right)
\]である。

よって、\[\begin{align*}
A^+ \vec{b} & = \frac{1}{11} \left( \begin{array}{cc} 1 & 4 & 7 \\ -1 & 7 & 4 \end{array} \right) \left( \begin{array}{cc} 1 \\ 1 \\ 4 \end{array} \right)
\\ & =\frac{1}{11} \left( \begin{array}{cc} 1 +4 + 28 \\ -1 + 7 + 16 \end{array} \right)
\\ & =\frac{1}{11} \left( \begin{array}{cc} 33 \\ 22 \end{array} \right)
\\ & = \left( \begin{array}{cc} 3 \\ 2 \end{array} \right)
\end{align*}\]となる。

実際に連立方程式に \( \textcolor{deepskyblue}{x = 3} \), \( \textcolor{magenta}{y=2} \) を代入すると、\[
\left\{ \begin{align*} \ \ \textcolor{deepskyblue}{x} - \ \ \textcolor{magenta}{y} = \ \ \ \ \textcolor{deepskyblue}{3} - \ \ \ \ \textcolor{magenta}{2} & = 1 \\ -\textcolor{deepskyblue}{x} +2 \textcolor{magenta}{y} = - \textcolor{deepskyblue}{3} + 2 \cdot \textcolor{magenta}{2} & = 1 \\ 2 \textcolor{deepskyblue}{x} - \ \ \textcolor{magenta}{y} = \ 2 \cdot \textcolor{deepskyblue}{3} - \ \ \textcolor{magenta}{2} & = 4 \end{align*} \right.
\]と確かに正しい解が求められていますね。

この通り、掃き出し法なしに擬似逆行列を計算することができましたね。

4. 解がない連立方程式を解こうとすると…?

例題2で解いた連立方程式を少し変えて\[
\left\{ \begin{align*} \ \ x - \ \ y & = 1 \\ -x +2y & = 1 \\ 2 x - \ \ y & = \textcolor{red}{5} \end{align*} \right.
\]としてみましょう。(赤色部分が変わったところ)

すると、この連立方程式は解をもたなくなりますね。実際に掃き出し法をしてみても\[\begin{align*}
(A|\vec{b}) & = \left( \begin{array}{cc|c} 1 & -1 & 1 \\ -1 & 2 & 1 \\ 2 & -1 & 5 \end{array} \right)
\\ & = \left( \begin{array}{cc|c} 1 & -1 & 1 \\ 0 & 1 & 2 \\ 0 & 1 & 3 \end{array} \right)
\\ & = \left( \begin{array}{cc|c} 1 & -1 & 1 \\ 0 & 1 & 2 \\ 0 & 0 & 1 \end{array} \right)
\end{align*}\]となり、\( 0 = 1 \) というありえない形が出てきますし、行列の階数を見ても、\( \mathrm{Rank} \ A < \mathrm{Rank} \ (A | \vec{b}) \) となっています。

しかし、この連立方程式を擬似逆行列で解こうとすると[3]連立方程式の左辺(係数)は例題2と変えていないため、擬似逆行列は例題1, 2と同じです。、\[\begin{align*}
\vec{x} & = A^+ \vec{b}
\\ & = \frac{1}{11} \left( \begin{array}{cc} 1 & 4 & 7 \\ -1 & 7 & 4 \end{array} \right) \left( \begin{array}{cc} 1 \\ 1 \\ 5 \end{array} \right)
\\ & = \frac{1}{11} \left( \begin{array}{cc} 40 \\ 26 \end{array} \right)
\end{align*}\]となり、\[
\left\{ \begin{array}{cc} \textcolor{deepskyblue}{x = \frac{40}{11}} \\ \textcolor{magenta}{y = \frac{26}{11}} \end{array} \right.
\]と、あたかも解があるかのように計算ができてしまいます。

連立方程式の解がないのにも関わらず、答えが出てくるなんて少しおかしいですよね。

しかし、この計算には重要な意味があります。実際に擬似逆行列の値を \( \textcolor{deepskyblue}{x} \), \( \textcolor{magenta}{y} \) に代入してみると、\[\
\left\{ \begin{align*} \textcolor{deepskyblue}{x} - \textcolor{magenta}{y} = \ \ \ \ \ \ \ \ \textcolor{deepskyblue}{ \frac{40}{11}} - \textcolor{magenta}{ \frac{26}{11} } = \frac{14}{11} & > 1 \\ - \textcolor{deepskyblue}{x} + 2 \textcolor{magenta}{y} = - \textcolor{deepskyblue}{ \frac{40}{11}} + 2 \cdot \textcolor{magenta}{ \frac{26}{11} } = \frac{12}{11} & > 1 \\ 2 \textcolor{deepskyblue}{x} - \textcolor{magenta}{y}= \ \ \ 2 \cdot \textcolor{deepskyblue}{ \frac{40}{11}} - \textcolor{magenta}{ \frac{26}{11} } = \frac{54}{11} & < 5 \end{align*} \right.
\]と(右辺)の値と等しくはなりませんが、かなり近い値が計算できていますよね。

実は、擬似逆行列で解がない連立方程式を計算する場合、最も連立方程式の右辺に近くなるような解(それっぽい解)を計算してくれるのです。

この仕組みは最小2乗法と呼ばれますが、どうしてそれっぽい解を計算してくれるのかについては、次の応用編第09羽で説明しましょう。

5. 擬似逆行列を用いた連立方程式プログラム

擬似逆行列を用いた連立方程式の計算は、プログラミングでも簡単に実現できます。

実際に例題2の連立方程式\[
\left\{ \begin{align*} \ \ x - \ \ y & = 1 \\ -x +2y & = 1 \\ 2 x - \ \ y & = 4 \end{align*} \right.
\]を計算するPythonとMATLABのプログラムを見てみましょう。

Pythonのプログラム

8行目で連立方程式を計算しています。 np.linagle.pinv(A) で擬似逆行列 \( A^+ \) が計算できます。

import numpy as np # numpyを用いた行列計算に必要
## 連立方程式の準備
A = np.array([[1, -1],[-1, 2],[2, -1]]) # 左辺 (係数行列)
b = np.array([[1],[1],[4]])             # 右辺
## 計算
x = np.matmul(np.linalg.pinv(A),b) # np.linalg.pinv(A) = np.matmul(np.linalg.inv(np.matmul(A.T,A)),A.T)
print(x) # 解ベクトル x

[実行結果]

MATLABのプログラム

6行目で連立方程式を計算しています。 pinv(A) で擬似逆行列 \( A^+ \) が計算できます。

%% 連立方程式の準備
A = [1 -1; -1 2; 2 -1]; % 連立方程式の左辺の係数 (係数行列)
b = [1;1;4]; % 連立方程式の右辺
%% 計算
x = pinv(A) * b % 解ベクトルx
                % pinv(A) = inv(A'*A) * A' に等しい

[実行結果]

x =
    3.0000
    2.0000

6. 練習問題

それでは、擬似逆行列から連立方程式の解を計算する練習をしてみましょう。

練習問題

連立方程式\[
\left\{ \begin{align*} \ \ x + 2 y & = 2 \\ \ \ x +4y & = 0 \\ 2 x + 5 y & = 3 \end{align*} \right.
\]を計算したい。

(1) 行列\[
A = \left( \begin{array}{cc} 1 & 2  \\ 1 & 4 \\ 2 & 5 \end{array} \right)
\]の擬似逆行列 \( A^+ \) を求めなさい。
(2) (1)を用いて連立方程式の解を求めなさい。

7. 練習問題の答え

(1) 擬似逆行列の計算

擬似逆行列 \( A^+ \) は \( (A^{\top} A)^{-1} A^{\top} \) で計算できる。

\[\begin{align*}
A^{\top} A & = \left( \begin{array}{cc} 1 & 1 & 2 \\ 2 & 4 & 5 \end{array} \right) \left( \begin{array}{cc} 1 & 2  \\ 1 & 4 \\ 2 & 5 \end{array} \right)
\\ & = \left( \begin{array}{cc} 1 + 1 + 4 & 2 + 4 + 10 \\ 2 + 4 + 10 & 4 + 16 + 25 \end{array} \right)
\\ & = \left( \begin{array}{cc} 6 & 16 \\ 16 & 45 \end{array} \right)
\end{align*}\]

\[\begin{align*}
(A^{\top} A)^{-1} & = \frac{1}{|A|} \left( \begin{array}{cc} 45 & -16 \\ -16 & 6 \end{array} \right)
\\ & = \frac{1}{270-256} \left( \begin{array}{cc} 45 & -16 \\ -16 & 6 \end{array} \right)
\\ & = \frac{1}{14} \left( \begin{array}{cc} 45 & -16 \\ -16 & 6 \end{array} \right)
\end{align*}\]と計算できるので、擬似逆行列 \( A^+ \) を\(\[\begin{align*}
A^+ & = (A^{\top} A)^{-1} A^{\top}
\\ & = \frac{1}{14} \left( \begin{array}{cc} 45 & -16 \\ -16 & 6 \end{array} \right) \left( \begin{array}{cc} 1 & 1 & 2 \\ 2 & 4 & 5 \end{array} \right)
\\ & = \frac{1}{14} \left( \begin{array}{cc} 45 - 32 & 45 - 64 & 90 - 80 \\ -16+12 & -16 + 24 & -32 + 30 \end{array} \right)
\\ & = \frac{1}{14} \left( \begin{array}{cc} 13 & -19 & 10 \\ -4 & 8 & -2 \end{array} \right)
\end{align*}\]と計算できる。

(2) 擬似逆行列を用いた連立方程式の解の計算

まずは連立方程式を行列に書き換え、\( A \vec{x} = \vec{b} \) の形にする。\[
\left( \begin{array}{cc} 1 & 2  \\ 1 & 4 \\ 2 & 5 \end{array} \right) \left( \begin{array}{cc} x \\ y \end{array} \right) = \left( \begin{array}{cc} 2 \\ 0 \\ 3 \end{array} \right)
\]

このとき、解 \( \vec{b} \) は \( \vec{x} = A^+ \vec{b} \) で計算できる。

よって、\[\begin{align*}
\vec{x} & = A^+ \vec{b}
\\ & = \frac{1}{14} \left( \begin{array}{cc} 13 & -19 & 10 \\ -4 & 8 & -2 \end{array} \right) \left( \begin{array}{cc} 2 \\ 0 \\ 3 \end{array} \right)
\\ & = \frac{1}{14} \left( \begin{array}{cc} 26 + 0 + 30 \\ -8 + 0 - 6 \end{array} \right)
\\ & = \frac{1}{14} \left( \begin{array}{cc} 56 \\ -14 \end{array} \right)
\\ & = \left( \begin{array}{cc} 4 \\ -1 \end{array} \right)
\\ & = \left( \begin{array}{cc} x \\ y \end{array} \right)
\end{align*}\]となるため、\( x = 4 \), \( y = 1 \) と解を求められる。

8. さいごに

今回は、行列の掃き出し計算なしに連立方程式を計算する方法の1つである擬似逆行列について説明しました。

次回は、第4章で登場した「解がない連立方程式に対しても、それっぽい解を計算する」方法である、行列を用いた最小2乗法について説明していきます。

注釈

注釈
1 \( A \) を \( m \) 行 \( n \) 列とすると、\( A^{\top} \) を \( n \) 行 \( m \) 列となるため、\( A^{\top} A \) は \( n \) 行 \( n \) 列になりますね。
2 \( A \) と \( A^{\top} A \) ともに列数が \( n \) なので、2つの行列の核空間が等しくなることを示すことで2つの行列の階数が等しくなることを確認できます。
3 連立方程式の左辺(係数)は例題2と変えていないため、擬似逆行列は例題1, 2と同じです。

関連広告・スポンサードリンク

おすすめの記事