行列の定義

行列を生成するためには次のようにする。これは3×3行列でその成分が i2+jで与えられる行列を与える。

Table[i^2+j, {i,3},{j,3}]

この行列を配列した形にするためには次のようにする。 ここで%は前の結果を表す。

MatrixForm[%]

同様にして(i,j)成分がi-j, (i-j)2, i2+ j2 であるような行列は次で与えられる。

Table[i - j, {i,4},{j,4}]

MatrixForm[%]

Table[(i - j)^2 , {i,4},{j,4}]

MatrixForm[%]

Table[i^2 + j^2 , {i,4},{j,4}]

MatrixForm[%]

行列は次のように与えることもできる。ここで;をつけると行列が表示されないので注意する。 これは(i,j)成分がa[i,j]であるような行列を定義してそれを表示する。

Array[a,{3,3}]
MatrixForm[Array[a,{3,3}]]

対角行列は次のようにして与える。{ 1,2,3,4,5 }はこの順に対角成分を与える。 2行目は行列表示で表示させている。

DiagonalMatrix[{1,2,3,4,5}]
MatrixForm[%]

次は単位行列である。[5]は行列が5×5であることをあらわす。

IdentityMatrix[5]
MatrixForm[%]

上三角行列と下三角行列

次は下三角行列と上三角行列を表わす。{i,5}, {j,5}は行列の列と行がそれぞれ5であることをあらわす。
[i> = j,2,0] の2と0をかえると行列の成分が入れ替わる。これを確認してみよ。
ここでi > = j,2,0 はiがjより大きいかあるいは等しい時は2として、それ以外では0とすることを 意味する。不等号を入れ替えたりすれば上三角と下三角を入れ替えることができる。 また、数値は文字にしてもよい。確認せよ。

Table[If[i > = j,2,0],{i,5},{j,5}]
MatrixForm[ Table[If [i > = j,2,0],{i,5},{j,5}] ]

すなわち次のようにする。

Table[If[i < = j,2,0],{i,5},{j,5}]
MatrixForm[ Table[If [i < = j,2,0],{i,5},{j,5}] ]


3重対角行列を構築する。このためには次のようにする。 命令について説明しておくと、Switchは i-j を評価してその値が-1であればaを返し、0であればbを返し、 1であればcをかえす。それ以外では0を返す。値あるいは式を変えることにより 多くの行列を与えることができる。

Table[Switch[i-j, -1, a, 0, b, 1, c, _, 0], {i, 5}, {j, 5}]
MatrixForm[%}

たとえば次のようになる。

Table[Switch[i+j-5, -2, a^2, -1, a, 0, b, 1, c, _, 0], {i, 5}, {j, 5}]
MatrixForm[%]

乱数行列の構成は次のようになる。各成分には乱数が与えられる。

Table[Random[ ], {3}, {3}]
MatrixForm[%]

戻る


ベクトル

ベクトルの加法、減法

ベクトルを表わすには { a,b,c,d }のように表わす。ベクトルの加法、減法は 次のようにして計算する。計算のしかたは明らかであろう。

{1,2,3}+{2,-1,-2}
k{1,2,3}

次元

ベクトルの次元は次のようにして求まる。

Dimensions[{a,b,c,d}]
Dimensions[{-1,2,4,5,4,0,1}]


内積

内積は次のようにして計算する。ここで積は.点で表す。

{1,2,3}.{-1,2,-3}
{a,b,c}.{k,2 k,3 k}

ベクトルの対数をとったり、微分したりする時は次のようにする。 Dの中の括弧はベクトル関数をあらわし最後のxあるいはyは微分する変数をあらわす。 したがって、微分は偏微分の意味で取られる。

Log[{a,b,c}]
D[{1+2x,x^2,x^3+x^2},x]
D[{1+2x,x^2,x^3+x^2},y]
D[{1+2x y, x^2 y, x^3 y^2 + x^2}, y]

戻る


行列の積、2次形式

行列の積

行列の積は内積と同じ記号を用いる。積は右からも左からも計算できる。

{{1,2,3},{0,1,3},{1,2,3}}.{a,b,c}
{{1,2,3},{0,1,3},{1,2,3}}.{{a,b,c},{1,2,3},{-1,0,0}}
MatrixForm[%]
A = {{1,2},{2,3}}; v={x,y}
A.v
v.A

次の例を参照のこと。行列の積が文字を含む形で計算されている。

A ={{1,2,3},{0,1,3},{1,2,3}}; B={{a,b,b},{1,2,3},{-1,a,b}};
MatrixForm[A]
MatrixForm[B]
A.B
MatrixForm[%]

行列の積はもちろん正方行列でなくても有効である。次の例を参考のこと。 Transposeは転置行列をあらわす。行列の積が定義できるための条件を注意する。

A ={{1,2,3,0,-1},{0,1,3,0,0},{1,2,3,5,6}}; B={{a,b,b},{1,2,3},{-1,a,b}, {0,0,0},{1,2,-1}};
MatrixForm[A]
MatrixForm[B]
A.B
MatrixForm[%]

A ={{1,-2,0},{a,1,3},{1,0,3}}; B={{a,b,b},{1,2,3}};
MatrixForm[A]
MatrixForm[B]
A.Transpose[B]
MatrixForm[%]

A ={{1,2,3,4,5},{0,1,3,0,0}}; B={{a,b,b,1,1},{1,2,3,2,1},{-1,a,b,1,0}};
MatrixForm[A]
MatrixForm[B]
A.Transpose[B]
MatrixForm[%]

2次形式

これを用いて2次形式を次のように表わすことができる。

A = {{1,2},{2,3}}; v={x,y}
v.A.v
A = {{1,2},{2,-1}}; v={x,y}
v.A.v
Clear[A,v]

ここでClear[A,v]は変数A, vの定義を初期化する。つぎの用いかたを参考のこと。

A={{1,2},{2,-1}}
A
Clear[A]
A

もっと大きいサイズの行列に対しても2次形式を計算できる。 ここでSimplifyは表現を簡略化して最も簡単な表現にする。

A = {{1,2,4},{2,3,-1},{5,4,-1}}; v={x,y,z}
MatrixForm[A]
MatrixForm[v]
v.A.v
Simplify[v.A.v]
Clear[A,v]

戻る


逆行列、行列の転置、行列の関数

逆行列

逆行列は次のようにして計算される。Inverse[A]は逆行列をもとめる命令である。 %.Aは計算結果ともとの行列の積を求めている。この結果は単位行列になる。 Together[% ]は計算結果をまとめる。これを行列形に書くと求める結果である。

A = {{a,b},{c,d}}
Inverse[A]
MatrixForm[%]
Inverse[A].A
Together[%]
MatrixForm[%]

これをいくつかの例で確認する。

A ={{1,0,0},{0,2,-1},{0,-2,3}}
Inverse[A]
MatrixForm[%]

A ={{1,0,2},{0,2,-1},{1,-2,2}}
MatrixForm[A]
MatrixForm[%]

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}}
MatrixForm[%]

対角行列の逆行列は対角成分の逆数を並べた対角行列である。すなわち

A=DiagonalMatrix[{1,2,3,4,5}]
Inverse[A]
MatrixForm[%]

転置行列

行列の転置をするには次のようにする。

A ={{1,0,0},{0,2,-1},{0,-2,3}}
MatrixForm[A]
Transpose[A]
MatrixForm[Transpose[A]]

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}}
MatrixForm[Transpose[A]]

行列の積を繰り返し計算する。行列の指数関数

行列の積をくり返し、計算する時は次のようにする。

MatrixPower[A,3]
MatrixForm[MatrixPower[A,3]]
MatrixForm[MatrixPower[A,30]]

行列の指数関数を計算するためには次のようにする。 ここで2番目は指数関数の第6項までの和を求めている。第3番目の表現は mの1000万次のべきを求めています。

m={{0.4,0.6},{0.525,0.47}}
MatrixExp[m]
Sum[MatrixPower[m,i]/i!,{i,0,6}]
MatrixPower[m,10^7]

戻る


行列式、クラーメルの公式、固有多項式、ケーリーハミルトンの定理

行列式は正方行列に対して定義される。 行列式の計算は次のようにすればよい。まず2次の行列式を計算する。

行列式

A={{a,b},{c,d}}
MatrixForm[A]
Det[A]

次の行列は回転に対応した行列である。これは直交行列という。すなわち それ自身の転置行列は逆行列である。

A={{Cos[x], - Sin[x] },{Sin [x], Cos [x]}}
MatrixForm[A]

この行列は直交行列である。行列式の値は1か-1である。Simplify[%, Trig -> True]は三角関数の変形を おこなって簡単な表示を求める。

MatrixForm[Transpose[A]]
Transpose[A].A
MatrixForm[%]
Simplify[%%, Trig -> True]
MatrixForm[%]
Det[A]
Simplify[%, Trig -> True]

つぎに、3次の行列式を計算する。最初は一般的な公式である。 つぎに具体的な例を計算する。

A= Array[a,{3,3}]
MatrixForm[A]
Det[A]

A={{1,0,-1},{-1,2,4},{4,a,c}}
MatrixForm[A]
Det[A]

4次の行列式を計算する。

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}}
MatrixForm[A]
Det[A]

行列式の積

行列式の積に関しては|AB|=|A||B|である。これを例で確認する。

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}}
B ={{4,0,2,1},{3,2,1,0},{1,-2,3,-2},{0,1,2,1}}
MatrixForm[A]
MatrixForm[B]
Det[A]
Det[B]
Det[A.B]
Det[A]*Det[B]

Vandermondeの行列式

Vandermondeの行列式を計算する。順に計算する。

A = { {1,1},{a,b} }
MatrixForm[%]
Det[A]
Simplify[%]

A = { {1,1,1},{a,b,c},{a^2,b^2,c^2}}
MatrixForm[%]
Det[A]
Simplify[%]

A = { {1,1,1,1},{a,b,c,d},{a^2,b^2,c^2,d^2},{a^3,b^3,c^3,d^3}}
MatrixForm[%]
Det[A]
Simplify[%]

A = { {1,1,1,1,1},{a,b,c,d,e},{a^2,b^2,c^2,d^2,e^2},{a^3,b^3,c^3,d^3,e^3},{a^4,b^4,c^4,d^4,e^4} }
MatrixForm[%]
Det[A]
Simplify[%]

巡回行列式

A = { {a,b,c,d,e},{e,a,b,c,d},{d,e,a,b,c},{c,d,e,a,b},{b,c,d,e,a} }
MatrixForm[%]
Det[A]
Factor[%, Extension -> {Sqrt[-1]}]

固有多項式

固有多項式を計算する。

A={{a,b},{c,d}}
MatrixForm[A]
Det[A - x IdentityMatrix[2]]

固有多項式は -b c + a d - a x - d x + x2である。 ケーリーハミルトンの定理を確認する。

(-b c + a d) IdentityMatrix[2] - a A - d A + A.A
MatrixForm[%]

別の例を計算する。
A={{Cos[x], - Sin[x] },{Sin [x], Cos [x]}}
MatrixForm[A]
Det[A - x IdentityMatrix[2]]
Simplify[%, Trig -> True]

固有多項式は1 + x2 - 2 x Cos[x] である。ケーリーハミルトンの定理を確認する。

IdentityMatrix[2] - 2 Cos[x] A + A.A
MatrixForm[%]
Simplify[%, Trig -> True]

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}}
MatrixForm[A]
Det[A - x IdentityMatrix[4]]

固有多項式は14 - 38 x + 33 x2 - 10 x3 + x4である。 ケーリーハミルトンの定理を確認する。

14 IdentityMatrix[4] - 38 A + 33 A.A - 10 A.A.A + A.A.A.A
MatrixForm[%]

クラーメルの公式

クラーメルの公式は非特異な係数行列をもつ連立一次方程式の解を与える公式である。 すなわち、係数行列の行列式が0でない場合の解の公式を与える。 これを具体的にあたえる。

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}};
X ={x,y,z,w};
B={a,b,c,d};
MatrixForm[A]
MatrixForm[X]
MatrixForm[A.X]

係数は非特異である。実際行列式を計算すると

Det[A]

は14である。クラーメルの公式を計算するためにはつぎの4つの行列式を計算する。

A1 = {{a,0,2,4},{b,2,-1,0},{c,-2,2,-2},{d,0,2,5}};
A2 = {{1,a,2,4},{0,b,-1,0},{1,c,2,-2},{0,d,2,5}};
A3 = {{1,0,a,4},{0,2,b,0},{1,-2,c,-2},{0,0,d,5}};
A4 = {{1,0,2,a},{0,2,-1,b},{1,-2,2,c},{0,0,2,d}};
MatrixForm[A1]
MatrixForm[A2]
MatrixForm[A3]
MatrixForm[A4]

従って、解は次で与えられる。

(x,y,z,w) =
Det[A1]/Det[A]
Det[A2]/Det[A]
Det[A3]/Det[A]
Det[A4]/Det[A]

これが解であることを確かめる。A.Xは方程式の左辺をあたえる。下の命令は 左辺にx,y,z,wの値を代入することを意味する。

A.X /. {x ->Det[A1]/Det[A], y ->Det[A2]/Det[A], z->Det[A3]/Det[A], w->Det[A4]/Det[A]}
Simplify[%]

別の例を計算してみる。

A ={{1,0,2,4,1},{0,2,-1,0,-1},{1,-2,2,-2,0},{0,0,2,5,0},{1,-1,0,1,-1}};
X ={x,y,z,u,v};
B={a,b,c,d,e};
MatrixForm[A]
MatrixForm[X]
MatrixForm[A.X]

係数は非特異である。実際行列式を計算すると

Det[A]

は-61である。クラーメルの公式を計算するためにはつぎの5つの行列式を計算する。

A1 = {{a,0,2,4,1},{b,2,-1,0,-1},{c,-2,2,-2,0},{d,0,2,5,0},{e,-1,0,1,-1}};
A2 = {{1,a,2,4,1},{0,b,-1,0,-1},{1,c,2,-2,0},{0,d,2,5,0},{1,e,0,1,-1}};
A3 = {{1,0,a,4,1},{0,2,b,0,-1},{1,-2,c,-2,0},{0,0,d,5,0},{1,-1,e,1,-1}};
A4 = {{1,0,2,a,1},{0,2,-1,b,-1},{1,-2,2,c,0},{0,0,2,d,0},{1,-1,0,e,-1}};
A5 = {{1,0,2,4,a},{0,2,-1,0,b},{1,-2,2,-2,c},{0,0,2,5,d},{1,-1,0,1,e}};
MatrixForm[A1]
MatrixForm[A2]
MatrixForm[A3]
MatrixForm[A4]
MatrixForm[A5]

従って、解は次で与えられる。

(x,y,z,u,v) =
Det[A1]/Det[A]
Det[A2]/Det[A]
Det[A3]/Det[A]
Det[A4]/Det[A]
Det[A5]/Det[A]

これが解であることを確かめる。A.Xは方程式の左辺をあたえる。下の命令は 左辺にx,y,z,u,vの値を代入することを意味する。

A.X /. {x ->Det[A1]/Det[A], y ->Det[A2]/Det[A], z->Det[A3]/Det[A], u->Det[A4]/Det[A], v->Det[A5]/Det[A]}
Simplify[%]

連立一次時方程式の解を求めるにはあとで述べるようにべつのもっと効率的な方法もある。 戻る


固有値、固有ベクトル、行列の対角化

固有値、固有ベクトル

固有値、固有ベクトルの計算は直接手計算で求めるのは大変であるが、mathematicaでは 次のようにして簡単に計算できる。 最初は固有値、固有ベクトルを正確に求める。固有値の計算はEigenvalues[A]を 用いる。固有ベクトルはEigenvectors[A], 固有値と固有ベクトルを同時に求めたい時は Eigensystem[A]を用いる。
必ずしも正確な値でなくてもよいときは、N[A]で近似値を求める。Chop[%]は 近似値の零に近い数値を切り捨てる時に用いる。

A ={{1,0,2,4},{0,2,-1,0},{1,-2,2,-2},{0,0,2,5}};
Eigenvalues[A]
Eigenvectors[A]
Eigensystem[A]
Eigenvalues[N[A]]
Eigenvectors[N[A]]
Chop[%]
Eigensystem[N[A]]
Chop[%]

固有値の正則な変換に関する不変性

次の行列の固有値は2,4,6である。

A = {{3, -1,0},{-1,3,0},{0,0,6}};
MatrixForm[%]
Eigenvalues[A]

固有値は任意の正則な行列による変換で不変である。実際、次の行列を考える。 行列式は-24であり、正則である。この行列でAを変換する。 次に、変換された行列の固有値を求める。固有値は変わらない。

P = {{1,-1,3},{-5,2,1}, {3,0,1}};
Det[P]
Inverse[P].A.P
MatrixForm[%]
Eigenvalues[%%]

対角化

異なる固有値を持つ行列は正則行列で対角化できる。次の例をみる。

A = {{3, -1,0},{-1,3,0},{0,0,6}};
MatrixForm[%]
P = Eigenvectors[A]
Inverse[P].A.P
MatrixForm[%]

次の回転の行列に対して、固有値と固有ベクトルを求める。 つぎに固有ベクトルを用いて変換すると対角化できる。

A ={{Cos[x], -Sin[x]},{Sin[x],Cos[x]}};
MatrixForm[%]
Eigenvalues[A]
P = Eigenvectors[A]
Eigensystem[A]

Inverse[P].A.P
Simplify[%]
MatrixForm[%]

対称行列の固有値

よく知られているように、対称行列の固有値は実数である。これを例で確認しよう。 対称行列の固有値は2次形式の標準形の決定において重要な役割を果たす。

A ={{1, 2, -1},{2,-1,1},{-1,0,2}};
MatrixForm[%]
Eigenvalues[A]
Eigenvectors[A]
Eigensystem[A]

戻る


連立方程式を解く

連立方程式を解くには次のように幾つかの方法がある。 これらを使い分けるとよい。まず係数行列mを定義する。次に2元連立一次方程式を定義する。 次にこれを解く。

m = {{1,5},{2,3}}
m.{x,y}=={a,b}
Solve[%,{x,y}]

解の表示が得られたであろうか。それでは次のように入力してみよう。 連立一次方程式を解くには次のような方法もある。ここでは(a,b) =(2,4)とし、 係数行列mはそのままとしてみる。
つぎに一般形の解をもとめる。最後には授業でやったように、mの逆行列をかける。 これでおなじ解が求まることを確認せよ。

LinearSolve[m,{2,4}]
LinearSolve[m,{a,b}]
Inverse[m].{a,b}


さて、mの形をもっと一般にして解を求めてみよう。まず係数行列の設定を 初期化し、新しい設定をする。次に方程式を解く。

Clear [m]
m={{1,2,3,4},{2,4,5,0},{1,0,1,0},{-1,0,2,1}}
LinearSolve[m,{-1,2,a,b}]
Together[%]


ここでTogether[%]は項を整理する。もっと一般の場合にも次のようにできる。

LinearSolve[m,{a,b,a,b}]
Together[%]


一般に未知数の数と方程式の数が等しい 連立一次方程式が与えられた勝手な右辺のベクトルにたいして、解を持つためには その行列式が0でないことが必要十分である。今の場合行列式は次のように計算できる。

Det[m]

行列式が零の場合にどうなるかやってみよう。

Clear[m]
m={{1,2},{1,2}}
Det[m]
LinearSolve[m,{2,3}]


解を求めることができなかったことがわかるとおもう。 連立一次方程式において今まで係数行列は数値であったが、これが文字あるいは関数を含む場合にも 解を求めることができる。

m={{Sin[t],Cos[t]},{Sin[t]^2, Cos[t]^2}}
LinearSolve[m,{1,2}]
Simplify[%]
Det[m]
Factor[%]


ここで最後の Simplify[%]は表現を簡単にする。 またFactor[%]は表現を因数分解する。

戻る


行列の核および階数を求める

まず次のようにする。 NullSpace[m] はmの核を求める。これを生成する基底ベクトルを求める。

m={{1,2},{1,2}}
Det[m]
NullSpace[m]


別の例を試す。

Clear[m]
m={{1,2,3},{-2,-1,-3},{-1,1,0}}
NullSpace[m]
m={{Sin[t]^2,Cos[t]^2},{Sin[t]^2,1-Sin[t]^2}}
NullSpace[m]


次に階数を求める。ここでRank[m] =3- Length[NullSpace[m]] は mの表わす連立一次方程式の中で重複している方程式の数を表わす。 従って、これをmの列の数から引くと階数を与える。階数はmの中で独立な方程式の数といってもよい。

m={{1,2,3},{0,0,1}}
Rank[m]= 3 - Length[NullSpace[m]]

問題 これを用いて連立一次方程式の係数が

m= { {1,2,0,1,1 },{-1,0,1,2,0}, {0,0,1,0,1},{0,-1,0,1,0}}

の時、この中で独立な方程式の数を求めよ。
階数あるいは核は行列が文字を含んでいても求めることができる。 そのような例を次に与える。

m={{a,1,2,3},{-2,0,1,-1},{-1,0,0,a}}
NullSpace[m]
Together[%]


戻る
行列の分解(進んだ話題)

行列の分解 QR分解とSchur分解について。QR 分解は任意の行列をQ^* Rの形に表わします。 ここでQは直交行列でQ^*はエルミート共役を表わし、Rは上三角行列を表わす。 これは最小2乗法による適合に用いられる。
Schur分解は任意の行列を直交行列Qと上三角行列Rによって、QRQ^*の形にかきます。 Schur分解は行列の関数を評価する場合によく用いられます。
これらのことを踏まえて、以下で具体的な計算をしてみる。

ここで N[{{1,5},{-7,3}}] でNがあるのは数値行列であることをあらわす。 これを {{1,5},{-7,3}} とするとどうなるか試してみよ。 2番目の式ではqが直交行列であることを確かめている。 つぎの式ではこのときあらわれる端数を処理している。 最後にQR分解の定義にしたがって、分解する前の行列が得られることを確かめている。

{q,r}=QRDecomposition[ N[{{1,5},{-7,3}}]]
Transpose[q].q
Transpose[q].q //Chop
Transpose[q].r


同じ事をもう少し複雑な行列にたいして行なう。

{q,r}=QRDecomposition[ N[{{1,5,3},{-7,3,0},{0,2,0}}]]
Transpose[q].q //Chop
Transpose[q].r //Chop


次にSchur分解を行なう。 ここで行なっていることは前と同様であるので省略する。

{q,r}=SchurDecomposition[ N[{{1,5,3},{-7,3,0},{0,2,0}}]]
Transpose[q].q //Chop
q .r. Transpose[q] //Chop
{q,r}=SchurDecomposition[ N[{{1,5,3},{-7,3,0},{1,2,1}}]]
Transpose[q].q //Chop
q .r. Transpose[q] //Chop

戻る


テンソルについて(高度な話題)

テンソルはk次元の立方体に広がった行列のようなものと考えることができます。 すなわち穴も突起もないような立方体の各格子点に数値を対応させたものと考えることができます。 ここではテンソルの与えかたなどについてのみ述べます。

まず2 × 4 × 3テンソルについて述べます。 最初の2つはテンソルの定義のしかたを述べています。 3番目はこれを行列の形に表現しています。

t = Table[i+j+k, {i,2},{j,4},{k,3}]
Array[(#1+#2+#3) & , {2,4,3}]
MatrixForm[t]

次にテンソルの次元、およびその成分の指定のしかたについて、述べます。さらにテンソルの階数をもとめます。 テンソルの階数はその成分を指定するのに必要な指標の数です。成分の指定法はt[[2,3,2]]は テンソルの(2,3,4)成分を指定します。

Dimensions[t]
t[[1,3,2]]
t[[2,3,2]]
t[[2,4,1]]
TensorRank[t]

戻る