『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

階数・退化次数の定理

≪【前の記事】列空間と行空間

階数・退化次数の定理

次のような矩形行列 A の階数 (rank) を考えます。
 (1)A=[011511222244]
1 列目と 2 列目を加えると 3 列目になるので、3 列目を基底から除きます。
残りの列で行列式をつくると
 (2)|015112224|=0
となるので、この 3 つのベクトルも線形独立ではありません。1 列目と 2 列目が互いに平行でないのは明らかなので基底として採用します (A の階数は 2)。ab が張る空間を <a,b> のように表すことにすると、A の列空間は
 (3)C(A)=[012],[112]
となります。C(A) の次元は行列 A の階数と同義です:
 dimC(A)=rankA=2
次に A の行空間を考えます。A の 2 行目と 3 行目は平行なので、行空間は 1 行目と 2 行目のベクトルが張る空間です。
 (4)C(AT)=[0115],[1122]
C(AT) の次元は 2 であり、C(A) の次元と一致しています。証明は省略しますが、一般に列空間と行空間の次元が等しいことが知られています:
 (5)dimC(A)=dimC(AT)=rankA
次は A の核 (零空間) KerA を求めてみます。
行列 A を再掲します。
(1)A=[011511222244]
基本変形を施して、もう少し簡単な形にします。
3 行目から 2 行目の 2 倍を引くと、3 行目は全部 0 になります。
 (6)A=[011511220000]
次に 2 行目から 1 行目を引きます。
 (7)A=[011510130000]
Ax=0 より、
 (8)[011510130000][xyzw]=[000]
したがって、次の 2 式が得られます。
 (9)y+z+5w=0(10)x+z3w=0
求める x
 (11)x=[z+3wz5wzw]=z[1110]+w[3501]
となります。すなわち、A の核 (零空間) は
 (12)KerA=[1110],[3501]
となります。核の次元は 2 であり、A の列数 4 から A の階数 2 を引いた値となっています。一般に m×n の行列 A について、
 (13)dim(KerA)+rankA=n
が成り立つことが知られています。核の次元 dim(KerA) のことを退化次数 (nullity) とよぶことから、式 (13) は 階数・退化次数の定理 という名称が与えられています。A の転置行列 AT の列数は m となるので、階数・退化次数の定理により、
 (14)dim(KerAT)+rankAT=m
が成り立ちます。式 (5) より、転置によって行列の階数は変わらないので (rankAT=rankA)、(14) は
 (15)dim(KerAT)+rankA=m
のように書き直すことができます。(1) で定義された行列 A の転置行列に 階数・退化次数の定理 を適用すると、
 (16)dim(KerAT)+2=3
となるので、A の左零空間の次元は 1 となることがわかります。
 
(5), (13), (15) は部分空間の構造を示す重要な定理なので、以下にまとめておきます。
 (17)dimC(A)=rankA(18)dimC(AT)=rankA(19)dim(KerA)+rankA=n(20)dim(KerAT)+rankA=m
(1) で定義した行列 A について、階数・退化次数の定理 を確認するコードを載せておきます。

# python_rank_nullity_theorem

# In[1]

import numpy as np
from scipy import linalg

# 3×4の行列を定義
A = np.array([[0, 1, 1, 5],
              [1, 1, 2, 2],
              [2, 2, 4, 4]])

# Aの階数
rank_A = np.linalg.matrix_rank(A)

# Aの核
Ker_A = linalg.null_space(A)

# Aの左零空間
Ker_AT = linalg.null_space(A.T)

# 核の次元(退化次数)
dim_Ker_A = Ker_A.shape[1]

# 左零空間の次元
dim_Ker_AT = Ker_AT.shape[1]

print("階数 : {}".format(rank_A))
print("核の次元 : {}".format(dim_Ker_A))
print("左零空間の次元 : {}".format(dim_Ker_AT))
print("階数 + 核の次元 : {}".format(rank_A+dim_Ker_A))
print("階数 + 左零空間の次元 : {}".format(rank_A+dim_Ker_AT))

# 階数 : 2
# 核の次元 : 2
# 左零空間の次元 : 1
# 階数 + 核の次元 : 4
# 階数 + 左零空間の次元 : 3

≫【次の記事】直交補空間
≫ Pythonで学ぶ線形代数トップページ

コメント

  1. あとりえこばと より:

    【お知らせ】式番号がずれていたので直しておきました。

  2. HNaito より:

    下記は誤植と思われるので、ご確認ください。
    式 (6) の上の文章で、3 行目は全部消えます → 3 行目は全部 0 になります
    式 (11) のベクトルの 2行目で、-x-5w → -z-5w
    式 (13) の下の文章で、式 (11) は → 式 (13) は

    • あとりえこばと より:

      確かに「消える」という表現は良くないですね。
      直しておきました。
      お手数をおかけして申し訳ございません。m(_ _)m