行列式の定義
前回記事で扱った $v_1w_2-v_2w_1$ は線型代数において重要な意味をもつ量であり、
\[\mathrm{det}(\boldsymbol{v},\boldsymbol{w})=\begin{vmatrix}v_1 & w_1\\v_2 & w_2\end{vmatrix}\tag{2}\]
のように書いて 行列式 (determinant) とよびます。計算するときは対角要素の積をつくってから差をとります。大事なことなので繰り返し述べますが、$\mathrm{det}(\boldsymbol{v},\boldsymbol{w})\neq 0$ のとき、$\boldsymbol{v}$ と $\boldsymbol{w}$ は線型独立であり、この 2 つのベクトルで平面を張ることができます。
線型独立と行列式の関係を幾何学的に考えてみます。
$\mathrm{det}(\boldsymbol{v},\boldsymbol{w})$ は $\boldsymbol{v}$ と $\boldsymbol{w}$ を辺とする平行四辺形の面積を表すことが知られています。
しかし、$\boldsymbol{v}$ と $\boldsymbol{w}$ が線型従属(平行)であるときは、この平行四辺形は潰れてしまって面積は $0$ になってしまいます。したがって、$\boldsymbol{v}$ と $\boldsymbol{w}$ が線型独立であることは、$\mathrm{det}(\boldsymbol{v},\boldsymbol{w})$ が $0$ 以外の値をもつことに対応します。
scipy.linalg.det()
行列式は scipy.linalg.det() を使って計算できます。
# python_determinant_1
# In[1]
import numpy as np
from scipy.linalg import det
# 配列を定義
x = np.array([[ 5, 2],
[-3, 4]])
# 行列式を計算
det_x = det(x)
print(det_x)
26.0
サラスの方法
線型独立と行列式の関係は 3 次元ベクトルにも拡張できます。
3 次元空間における行列式は以下の式で与えられます。
\[\begin{align*}\mathrm{det}(\boldsymbol{u},\boldsymbol{v},\boldsymbol{w})&=\begin{vmatrix}u_1 & v_1 & w_1\\u_2 & v_2 & w_2\\u_3 & v_3 & w_3\end{vmatrix}\\[6pt]&=u_1v_2w_3+u_2v_3w_1+u_3v_1w_2-u_1v_3w_2-u_2v_1w_3-u_2v_1w_3\end{align*}\]
こんな式を覚えられるわけないので、以下の図に示すように行列式のを二つ重ねて、対角線上の積をつくって合計します。
ただし、左上から右下にとる積はプラス、右上から左下にとる積はマイナスの符号をつけて計算します。この計算法を サラスの方法 (Sarrus' rule) とよびます。
3次元ベクトルの線形結合
3 次元のベクトルで作られる行列式は、3 つのベクトルが作る立体の体積を表します。
3 つのベクトルが同じ平面内にあるとき (線型従属の関係にあるとき) には、立体は潰れてしまって体積は $0$ になります。
$\boldsymbol{u},\ \boldsymbol{v},\ \boldsymbol{w}$ で空間を張ることができる (線形独立の関係にある) のは、行列式の値が $0$ 以外の値をとるときです。
行列式の計算手順
実際に行列式を計算するときは、サラスの方法を使う前に、明らかに行列式が $0$ にならないかを確認します。たとえば、
\[\mathrm{det}A=\begin{vmatrix}2 & 4 & 5\\1 & 2 & 5\\4 & 8 & 3\end{vmatrix}\]
という行列式は、2 列目のベクトルが 1 列目のベクトルの 2 倍になっています。つまり平行なベクトルが含まれているので、この行列式は計算するまでもなく $\mathrm{det}A=0$ だとわかります。
あるベクトルの成分に共通の約数があれば行列式の外に出します(詳しくは次回記事 行列式の線型性 で扱います)。すなわち成分の最大公約数を見つけます。たとえば、
\[\mathrm{det}B=\begin{vmatrix}1 & 5 & 12\\7 & 0 & 16\\9 & 5 & 8\end{vmatrix}\]
の 2 列目の最大公約数は $5$, 3 列目の成分の最大公約数は $4$ なので、この行列式は
\[\mathrm{det}B=4\cdot 5\begin{vmatrix}1 & 1 & 3\\7 & 0 & 4\\9 & 1 & 2\end{vmatrix}=20\times 39=780\]
のように計算できます。
n次元ベクトルの線形結合
2 次元と 3 次元で展開された議論はそのまま $n$ 次元空間に拡張されます。
$n$ 組の $n$ 次元ベクトルが $n$ 次元空間を張るための条件は、互いに線型独立の関係にあること、すなわち、$n$ 組の $n$ 次元ベクトルから作られた行列式が $0$ 以外の値をとることです。
次元が増えると、もはや紙の上での計算では手に負えなくなるので、コンピュータの力を借りることになります。scipy.linalg.det() を使って、10 次元の行列式の値を計算してみましょう。各成分は np.random.randint() を使って 0 ~ 9 の範囲で無作為に決定します。
# python_determinant_2
# In[1]
import numpy as np
from scipy.linalg import det
# 乱数シードを設定
np.random.seed(10)
# 10次元ベクトルを10個格納した2次元配列
# [[5 0 3 3 7 9 3 5 2 4]
# [7 6 8 8 1 6 7 7 8 1]
# [5 9 8 9 4 3 0 3 5 0]
# [2 3 8 1 3 3 3 7 0 1]
# [9 9 0 4 7 3 2 7 2 0]
# [0 4 5 5 6 8 4 1 4 9]
# [8 1 1 7 9 9 3 6 7 2]
# [0 3 5 9 4 4 6 4 4 3]
# [4 4 8 4 3 7 5 5 0 1]
# [5 9 3 0 5 0 1 2 4 2]]
x = np.random.randint(0, 10, (10, 10))
# 行列式の値を計算
det_x = det(x)
print("{:.3e}".format(det_x))
5.825e+07
$5.825\times 10^7$ という大きな桁の数が表示されました。
言うまでもなく、上のコードで設定したベクトルは互いに線型独立です。
次元が大きい場合、ランダムに成分を決めても、線型従属なベクトルの組は滅多に出現しないようです。行列式の値はプラス側にもマイナス側にも大きく振れます。上のコードで seed を 10 に設定すると $-2.982\times 10^8$ となります。
同じように、3 次元で 0 ~ 9 の範囲のランダム成分をもつ行列式を 10 万個つくって、そのうち何個が 0 になるか調べてみました。
# In[2]
# 乱数シードを設定
np.random.seed(0)
# カウント数の初期値
ct = 0
# 無作為な3次元行列式を10万個作成して値を計算
for k in range(10**5):
x = np.random.randint(0, 10, (3, 3))
if det(x) == 0:
ct += 1
print("行列式が0になった個数:{}".format(ct))
行列式が0になった個数:1785
結果は 1785 個です。seed を変えて計算しても、概ね 1700 個前後でした。おおよそ 100 個のうち 2 個程度が線型従属の関係にあるベクトルの組となります。
行列式の展開
行列式を計算する別の手段として、行展開(または列展開)があります。たとえば、3 次元行列式は以下のように展開できることが知られています。
\[\begin{align*}\begin{vmatrix}u_1 & v_1 & w_1\\u_2 & v_2 & w_2\\u_3 & v_3 & w_3\end{vmatrix}&=u_1\begin{vmatrix}v_2 & w_2 \\ v_3 & w_3\end{vmatrix}-v_1\begin{vmatrix}u_2 & w_2 \\ u_3 & w_3\end{vmatrix}+w_1\begin{vmatrix}u_2 & v_2 \\ u_3 & v_3\end{vmatrix}\end{align*}\]
各項は次のような手順で作られます。
符号は +, -, + のように交互に並べます。上の例では 1 行目を使いましたが、係数はどの行または列を選んでも構いません。大きなサイズの行列式についても、同じように次元を 1 つ下げた行列式を使って展開できるので、展開を繰り返すことによって最終的には 2 次元行列式の計算に帰着できます。
ChatGPTが行列式について講義します
生徒: 先生、行列式って何ですか?聞いたことはありますが、具体的にどういうものなのかわかりません。
先生: それは良い質問ですね。行列式は、行列に対して与えられる数値の一種です。行列は、数字を格子状に並べたもので、縦には行、横には列があります。行列式は、その行列の特徴や性質を表すために使われます。
生徒: なるほど、行列の特徴や性質を表すために使われるんですね。行列式ってどのように計算するんですか?
先生: 行列式の計算方法は、いくつかのステップで行われます。まず、与えられた行列の要素を使って特定の計算を行い、その結果を使って最終的な行列式の値を求めます。
生徒: 具体的な計算方法を教えていただけますか?
先生: もちろんです。まず、与えられた行列の大きさ(例えば、2×2行列や3×3行列など)に応じて計算手順が異なります。ここでは、2×2行列の場合を例に説明します。2×2行列の場合、行列式の計算は次のように行います。まず、上の行の左上と下の行の右下の要素を掛け合わせます。それから、上の行の右上と下の行の左下の要素を掛け合わせます。最後に、これらの結果を引き算して行列式の値が得られます。
生徒: なるほど、それで行列式の値が求められるんですね。でも、どうしてその計算方法で行列式の値がわかるんですか?
先生: それは、行列式が行列の性質や特徴を表すための指標となっているからです。行列の性質によって、行列式の値が正の値、負の値、またはゼロになることがあります。行列式の値がゼロになる場合、その行列は逆行列を持たないことを意味します。
生徒: なるほど、行列式の値が特定の性質や特徴を表しているんですね。それで、行列式を使う具体的な例はありますか?
先生: 行列式は、数学のさまざまな分野で広く活用されています。連立方程式の解を求める際に行列式を使うことがあります。
例えば、2つの方程式があり、以下のように表されているとします。
a₁x + b₁y = c₁
a₂x + b₂y = c₂
この場合、係数行列として以下のような2×2行列を考えます。
[ a₁ b₁ ]
[ a₂ b₂ ]
そして、右辺の定数項を並べた列ベクトルを作ります。
[ c₁ ]
[ c₂ ]
このとき、係数行列の行列式がゼロでない場合、連立方程式は唯一の解を持つことがわかります。行列式がゼロになる場合、連立方程式は解を持たないか、無数の解を持つ可能性があります。
生徒: なるほど、行列式がゼロでない場合は連立方程式が唯一の解を持つんですね。他にも行列式の使い方はありますか?
先生: はい、行列式は他にもさまざまな応用があります。例えば、ベクトルの線形独立性の判定や、行列の逆行列の存在判定、固有値や固有ベクトルの計算などでも行列式が使われます。また、行列式は幾何学的な意味合いも持っています。2次元の場合、行列式は平行四辺形の面積や、2つのベクトルが作る平行四辺形の符号付き面積を表します。3次元の場合では、行列式は平行六面体の体積や、3つのベクトルが作る平行六面体の符号付き体積を表します。
生徒: なるほど、行列式は様々な応用や幾何学的な意味を持っているんですね。勉強する価値がありそうです。
先生: そうですね。行列式は線形代数の基本的な概念の一つであり、数学や科学のさまざまな分野で活用されています。理解しておくと、さまざまな問題に対して有用な道具となるでしょう。
生徒: 先生、ありがとうございました。行列式について理解できました。これから勉強してみます。
先生: どういたしまして。頑張ってくださいね。もし質問や疑問があればいつでも聞いてください。
ChatGPTがサラスの方法を解説します
サラスの方法(Sarrus’ rule)は、3×3行列の行列式を計算する方法の一つです。この方法は、特に3次正方行列の行列式を求める場合に使用されます。以下に、サラスの方法の手順を説明します。
1. 与えられた3×3行列を以下のように書きます(行列Aとします):
| a₁ b₁ c₁ |
| a₂ b₂ c₂ |
| a₃ b₃ c₃ |
2. 行列Aの右側に元の2つの列を再度書きます:
| a₁ b₁ c₁ | a₁ b₁ c₁ |
| a₂ b₂ c₂ | a₂ b₂ c₂ |
| a₃ b₃ c₃ | a₃ b₃ c₃ |
3. 右下から左上に向かって斜めに線を引き、引いた斜線上の要素を掛け合わせます。計算結果をプラスにします。
4. 右上から左下に向かって斜めに線を引き、引いた斜線上の要素を掛け合わせます。計算結果をマイナスにします。
5. 斜めに引いた線上の計算結果を足し合わせます。これが3×3行列の行列式の値になります。