概要#

連立1次方程式#

{a11x1+a12x2++a1mxm=y1a21x1+a22x2++a2mxm=y2an1x1+an2x2++anmxm=yn

のような連立一次方程式は、

A=(a11a12a1ma21a22a2man1an2anm),x=(x1x2xm),y=(y1y2yn)

を用いて

Ax=y

と表すことができる。

もしAに逆行列が存在するなら

x=A1y

と解くことができる。

例題#

{x+y=52x+4y=14

を例に考えてみる。

中学数学的な素朴な解き方だと、式を定数倍したり、式同士を差し引いたりすることで変数を消していく。この方法は変数消去法と呼ばれる。

変数消去法
{(1)x+y=5(2)2x+4y=14

と番号をふる。

まず(1)を2倍して(2)から引き、(2)からxの項を消す

{(1)x+y=5(2')2y=4

(2’)を1/2倍すればy=2であることがわかる。

またy=2を(1)から引くと

{x=3y=2

となる

変数消去法は行列表記にすることもできる。

変数消去法(行列表記)
{x+y=52x+4y=14

を行列で表すと

(1124)(xy)=(514)

となり、少し移項してブロック行列で表すと

(1152414)(xy1)=(00)

となる。

(1152414)

は、まず1行目を2倍して2行目から引くと

(115024)

となる。続いて、(1,2)要素をゼロにしたいので次に2行目を1/2倍して

(115012)

2行目を1行目から引くと

(103012)

もとの式に戻すと

(103012)(xy1)=(x3y2)=(00)

より、x=3,y=2となる

まとめると、ブロック行列

(Ay)(x1)=0

を変形していって

(Iz)(x1)=0

という形にする。 xz=0となり、zのところに解が現れる。

変数消去法に限らず、行列で連立一次方程式を解くときはこのパターンになる。 また、変化があるのは(A|y)の部分だけなので、この部分だけを扱うことも多い。

ガウスの消去法(掃き出し法)#

ガウスの消去法(Gaussian elimination) あるいは 掃き出し法(row reduction) は正則行列による連立一次方程式を、ブロック行列表記にして解く方法。

変数消去法と同様に、

  1. 行のスカラー倍

  2. 行のスカラー倍を別の行に加算する

  3. 行の順番を入れ替える

といった操作を行うもので、

まずAの対角線より下の要素たちを0にしていき、その後対角線より上の要素たちを0にしていってIに到達する、という流れで計算していく

Aの対角線より下の要素たちを0にする操作を 前進消去 (Forward elimination)という

前進消去により

x1+a12x2++a1nxn=b1x2++a2nxn=b2xn=bn

の形にすると、解は次のように求まる

xn=bnxn1=bn1an1,nxnx1=b1(a12x2++a1nxn)
import numpy as np

# 拡大係数行列
A = np.array([
    [1, 1, 5],
    [2, 4, 14],
])
a = A[0, 0]
i = 1
j = 0

A[i, :] = A[i, :] - (A[i, j] / a)
A
array([[ 1,  1,  5],
       [ 0,  2, 12]])

解の種類#

n 変数の連立一次方程式 Ax=b とし、拡大係数行列を [Ab] で表す。

  • rankA=rank[Ab]=n ただ1つの解 x

  • rankA=rank[Ab]<n 不定解 x

    • n個の変数に対して手がかりが足りず、解が一意に定まらない

  • rankA<rank[Ab] 解なし

https://jfor.net/indefinite-solution/

Aが正則の場合#

もし逆行列が存在するなら

x=A1y

と解くことができる

定理

連立一次方程式Ax=bがあるとする。

もし|A|0なら、Ax=bはただ1つの解をもち、その解は

x=A1b

で与えられる。

証明

|A|0とすると、Aの逆行列A1が存在する。

連立一次方程式の両辺にA1をかけると

A1(Ax)=A1b

行列の積は結合法則を満たすから、上式の左辺は

(A1A)x=Ix=x

よって

x=A1b

逆行列の推定への応用#

逆行列の推定方法の一つに連立一次方程式を解く方法がある

n次元正方行列Aの逆行列は

AX=I

となるような正方行列Xであるため、n組の連立一次方程式Axi=ei(i=1,,n)を解く問題として扱うことができる

Aが正則でない(特異な)場合#

連立一次方程式の解の存在性と一意性の条件

  • 結果yから原因xを一意に特定できる(写像y=Axは単射)⇔「KerAが原点oのみ」⇔「KerAは0次元」⇔「rankA=n(ランクが定義域の次元と同じ)」

  • どんな結果yにも原因xが存在する(写像y=Axは全射)⇔「Aが行き先の空間(値域)に一致する」⇔「Am次元」⇔「rankA=m(ランクが値域の次元と同じ)」

クラーメルの公式#

クラーメルの公式

An次の正則行列であるとき、連立1次方程式

Ax=b

はただ1組の解をもち、その解は次のように与えられる

xj=Δj|A|(j=1,2,,n)

ここでΔjは行列Aの第j列をベクトルbで置き換えた行列式

証明

仮定より|A|0であるから、x=A1bという解がただひとつ存在する。

Aの列ベクトルをa1,,anとすると

b=Ax=(a1,,an)x=x1a1++xnan

Aの第j列をbで置き換えた行列の行列式を考える。

|a1bjan|

b=x1a1++xnanなので

|a1x1a1++xnanjan|

「1つの列をc倍すると行列式はc倍になる」という定理より

x1|a1a1an|+x2|a1a2an|++xj|a1ajan|++xn|a1anan|

j番目以外は2つの列が等しいため、「2つの列が等しい行列の行列式は0になる」という定理により0になり、j番目の項のみ残る

xj|a1ajan|=xj|A|

したがって、行列Aの第j列をbに入れ替えた行列の行列式はxj|A|と等しくなる

|a1ban|=xj|A|

この両辺を|A|で割るとクラーメルの公式になる

例:

{x1+2x2=104x1+x2=12

を解け。

係数行列をAとすると、その行列式は

|A|=|1241|=128=7

それぞれの列をb=(10,12)Tに置き換えた行列式は

Δ1=|102121|=1024=14Δ2=|110412|=1240=28

よって解は

x1=Δ1|A|=147=2x2=Δ2|A|=287=4

連立一次方程式の計算の高速化#

幅広い行列に使える方法#

  • 掃き出し法

  • 直接解法(LU分解して解く)

特定のタイプの行列に使える方法#

  • 対称正定値行列(例えば回帰モデルのXTX)だと、

    • コレスキー分解(LU分解の代わりにA=LLTに分解する)

    • 共役勾配法(f(x)=12xTAxbTxを最小化するxを求める形で反復計算して解く)

参考:

参考文献#