Next: , Previous:   [Contents][Index]

23 Matrices and Linear Algebra


23.1 Introduction to Matrices and Linear Algebra


23.1.1 Dot

演算子.は、非可換乗算とスカラー積を表します。 オペランドが、1列行列または1行行列abの時、 式a.bは、sum (a[i]*b[i], i, 1, length(a))と同値です。 もしabが複素数でないなら、これはスカラー積であり、 abの内積すなわちドット積もコールされます。 abが複素数の時、スカラー積は conjugate(a).bとして定義されます; eigenパッケージのinnerproductは、複素スカラー積を供給します。

オペランドがもっと一般的な行列の時、 積は、abの行列積です。

bの行数は、aの列数と等しくなければいけなく、 結果は、aの行数と等しい行数と bの列数と等しい列数を持ちます。

.を算術演算子として 浮動小数点数の小数点と区別するために、 どちらかの側にスペースを残す必要があるかもしれません。 例えば、5.e35000.0ですが、5 . e35掛けるe3です。

.を含む式の整理を支配する いくつかのフラグがあります。 すなわち、dot0nscsimp, dot0simp, dot1simp, dotassoc, dotconstrules, dotdistrib, dotexptsimp, dotident, dotscrules


23.1.2 Vectors

vectは、ベクトル解析のための関数のパッケージです。 load ("vect")は、このパッケージをロードし、 demo ("vect")は、デモンストレーションを表示します。

ベクトル解析パッケージは、 グラディエント、ダイバージェンス、カール、ラプラシアン演算子と一緒に、 ドット積やクロス積を含むシンボリックな式を結合したり整理したりすることができます。 これらの演算子の和や積上の分配は、 任意の特定の直交座標系の成分への展開を含む、様々な他の展開と同様に、 いくつかのフラグで決定されます。 場のスカラーポテンシャルやベクトルポテンシャルを演繹するための関数もあります。

The vectパッケージは以下の関数を含みます: vectorsimp, scalefactors, express, potential, vectorpotential.

デフォルトでは、vectパッケージはドット演算子.を可換演算子とは宣言しません。 可換ドット演算子.を得るには、コマンドdeclare(".", commutative)を実行しなければいけません。


23.1.3 eigen

パッケージeigenは、 固有値や固有ベクトルのシンボリックな計算に充てられた いくつかの関数を含みます。 もしeigenvaluesまたはeigenvectorsの1つが呼び出されたなら、 Maximaは、パッケージを自動的にロードします。 パッケージはload ("eigen")として陽にロードすることもできます。

demo ("eigen")は、このパッケージの能力のデモンストレーションを表示します。 batch ("eigen")は、 連続する計算の間のユーザープロンプトなしに、 同じデモンストレーションを実行します。

eigenパッケージの関数は、 innerproduct, unitvector, columnvector, gramschmidt, eigenvalues, eigenvectors, uniteigenvectors, similaritytransformです。


23.2 Functions and Variables for Matrices and Linear Algebra

関数: addcol (M, list_1, ..., list_n)

1つまたは複数のリスト(または行列)が与える列を 行列Mに追加します。

関数: addrow (M, list_1, ..., list_n)

1つまたは複数のリスト(または行列)が与える行を 行列Mに追加します。

関数: adjoint (M)

行列Mの余因子行列を返します。 余因子行列は、Mの余因子の行列の転置です。

関数: augcoefmatrix ([eqn_1, …, eqn_m], [x_1, …, x_n])

線形方程式系eqn_1, …, eqn_mの 変数x_1, …, x_nに関する拡大係数行列を返します。 これは、 それぞれの方程式の定数項(x_1, …, x_nに依存しないそれらの項) に関して隣接した列を持つ係数行列です。

(%i1) m: [2*x - (a - 1)*y = 5*b, c + b*y + a*x = 0]$
(%i2) augcoefmatrix (m, [x, y]);
                       [ 2  1 - a  - 5 b ]
(%o2)                  [                 ]
                       [ a    b      c   ]
関数: cauchy_matrix ([x_1,x_2, …, x_m], [y_1,y_2, …, y_n])
関数: cauchy_matrix ([x_1,x_2, …, x_n])

要素a[i,j] = 1/(x_i+y_i)を持つ、 n掛けるmのCauchy行列を返します。 cauchy_matrixの第二引数はオプションです。 この場合、Cauchy行列の要素はa[i,j] = 1/(x_i+x_j)です。

注意: 文献によると、Cauchy行列は2つの形式で定義されたものが見られます。 2つ目の定義はa[i,j] = 1/(x_i-y_i)です。

例:

(%i1) cauchy_matrix([x1,x2],[y1,y2]);
                      [    1        1    ]
                      [ -------  ------- ]
                      [ y1 + x1  y2 + x1 ]
(%o1)                 [                  ]
                      [    1        1    ]
                      [ -------  ------- ]
                      [ y1 + x2  y2 + x2 ]

(%i2) cauchy_matrix([x1,x2]);
                      [   1         1    ]
                      [  ----    ------- ]
                      [  2 x1    x2 + x1 ]
(%o2)                 [                  ]
                      [    1       1     ]
                      [ -------   ----   ]
                      [ x2 + x1   2 x2   ]
関数: charpoly (M, x)

行列Mの変数xに関する特性多項式を返します。 すなわち、 determinant (M - diagmatrix (length (M), x))です。

(%i1) a: matrix ([3, 1], [2, 4]);
                            [ 3  1 ]
(%o1)                       [      ]
                            [ 2  4 ]
(%i2) expand (charpoly (a, lambda));
                           2
(%o2)                lambda  - 7 lambda + 10
(%i3) (programmode: true, solve (%));
(%o3)               [lambda = 5, lambda = 2]
(%i4) matrix ([x1], [x2]);
                             [ x1 ]
(%o4)                        [    ]
                             [ x2 ]
(%i5) ev (a . % - lambda*%, %th(2)[1]);
                          [ x2 - 2 x1 ]
(%o5)                     [           ]
                          [ 2 x1 - x2 ]
(%i6) %[1, 1] = 0;
(%o6)                     x2 - 2 x1 = 0
(%i7) x2^2 + x1^2 = 1;
                            2     2
(%o7)                     x2  + x1  = 1
(%i8) solve ([%th(2), %], [x1, x2]);
                  1               2
(%o8) [[x1 = - -------, x2 = - -------], 
               sqrt(5)         sqrt(5)

                                             1             2
                                    [x1 = -------, x2 = -------]]
                                          sqrt(5)       sqrt(5)
関数: coefmatrix ([eqn_1, …, eqn_m], [x_1, …, x_n])

線形方程式系eqn_1, …, eqn_mの 変数x_1, …, x_nに関する係数行列を返します。

(%i1) coefmatrix([2*x-(a-1)*y+5*b = 0, b*y+a*x = 3], [x,y]);
                                 [ 2  1 - a ]
(%o1)                            [          ]
                                 [ a    b   ]
関数: col (M, i)

行列Mi番目の列を返します。 戻り値は行列です。

関数: columnvector (L)
関数: covect (L)

リストLの要素を含む1列length (L)行の行列を返します。

covectは、columnvectorと同義です。

load ("eigen")はこの関数をロードします。

もしこのパッケージの関数の出力の一部を行列計算で使いたいなら、これは役に立ちます。

例:

(%i1) load ("eigen")$
Warning - you are redefining the Macsyma function eigenvalues
Warning - you are redefining the Macsyma function eigenvectors
(%i2) columnvector ([aa, bb, cc, dd]);
                             [ aa ]
                             [    ]
                             [ bb ]
(%o2)                        [    ]
                             [ cc ]
                             [    ]
                             [ dd ]
関数: copymatrix (M)

行列Mのコピーを返します。 これは、Mを要素毎にコピーすることは別にして、コピーを作る唯一の方法です。

m2: m1のように、1つの行列のもう1つへの割り当てはm1をコピーしない ことに注意してください。 An assignment 割り当てm2 [i,j]: xまたはsetelmx (x, i, j, m2は、 m1 [i,j]も変更します。 Creating a copy with copymatrixを使ってコピーを生成し、割り当てを使うことは、 別個の変更されたコピーを生成します。

関数: determinant (M)

Mの行列式をガウスの消去法と似た方法で計算します。

結果の形式は、スイッチratmxの設定に依ります。

スイッチratmxsparseがともにtrueの時コールされる 粗な行列式を計算するための特殊なルーチンがあります。

オプション変数: detout

デフォルト値: false

detouttrueの時、 逆行列が計算された行列の行列式は、逆行列から因子として外に出されます。

このスイッチが効果を持つには、 doallmxopsdoscmxopsは、falseでなければいけません。 (それらの記述を参照してください。) evは他の2つを正しく設定するので、 代わりに、このスイッチをevに与えるという方法もあります。

例:

(%i1) m: matrix ([a, b], [c, d]);
                            [ a  b ]
(%o1)                       [      ]
                            [ c  d ]
(%i2) detout: true$
(%i3) doallmxops: false$
(%i4) doscmxops: false$
(%i5) invert (m);
                          [  d   - b ]
                          [          ]
                          [ - c   a  ]
(%o5)                     ------------
                           a d - b c
関数: diagmatrix (n, x)

対角要素すべてがxに等しい、 サイズがn掛けるnの対角線行列を返します。 diagmatrix (n, 1)は、 (ident (n)と同じように)単位行列を返します。

nは、整数に評価されなければいけなく、そうでなければ、 diagmatrixはエラーメッセージを出力します。

xは、別の行列を含む、任意の種類の式を取り得ます もしxが行列なら、それはコピーされません; 対角要素すべては、同じインスタンスxを参照します。

オプション変数: doallmxops

デフォルト値: true

doallmxopstrueの時、 行列に関係する演算すべてが実行されます。 falseの時、 then the setting of the 個々のdotスイッチの設定が、どの演算を実行するか決めます。

オプション変数: domxexpt

デフォルト値: true

domxexpttrueの時、 行列の指数関数, exp (M) ただしMは行列, は、要素[i,jexp (m[i,j])に等しい行列として解釈されます。

そうでなければ、exp (M)は、exp (ev(M)に評価されます。

domxexptは、 形式base^powerの式すべてに影響します。 ここで、baseはスカラーまたは定数と仮定された式、 powerは、リストまたは行列です。

例:

(%i1) m: matrix ([1, %i], [a+b, %pi]);
                         [   1    %i  ]
(%o1)                    [            ]
                         [ b + a  %pi ]
(%i2) domxexpt: false$
(%i3) (1 - c)^m;
                             [   1    %i  ]
                             [            ]
                             [ b + a  %pi ]
(%o3)                 (1 - c)
(%i4) domxexpt: true$
(%i5) (1 - c)^m;
                  [                      %i  ]
                  [    1 - c      (1 - c)    ]
(%o5)             [                          ]
                  [        b + a         %pi ]
                  [ (1 - c)       (1 - c)    ]
オプション変数: domxmxops

デフォルト値: true

domxmxopstrueの時、 行列-行列演算、行列-リスト演算すべてが実行されます (しかし、スカラー-行列演算は実行されません); もしこのスイッチがfalseなら、 演算は実行されません。

オプション変数: domxnctimes

デフォルト値: false

domxnctimestrueの時、 行列の非可換積が実行されます。

オプション変数: dontfactor

デフォルト値: []

ある変数に関する因数分解が起こらないよう、 dontfactorをその変数のリストに設定することができます。 (リストは初期には空です。) 標準有理式(CRE)形で仮定される変数順序に従って、 dontfactorリスト上のそれらよりも重要でない変数に関しても 因数分解は、 行われなくなります。

オプション変数: doscmxops

デフォルト値: false

doscmxopstrueの時、 スカラー-行列演算が実行されます。

オプション変数: doscmxplus

デフォルト値: false

doscmxplustrueの時、 スカラー-行列演算は、行列の結果をもたらします。 このスイッチは、doallmxopsの下に包括されません。

オプション変数: dot0nscsimp

デフォルト値: true

dot0nscsimptrueの時、 ゼロと非スカラー項の非可換積は、可換積に整理されます。

オプション変数: dot0simp

デフォルト値: true

dot0simptrueの時、 ゼロとスカラー項の非可換積は、 可換積に整理されます。

オプション変数: dot1simp

デフォルト値: true

dot1simptrueの時、 1ともう1つの項の非可換積は、可換積に整理されます。

オプション変数: dotassoc

デフォルト値: true

dotassoctrueの時、 式(A.B).CA.(B.C)に整理されます。

オプション変数: dotconstrules

デフォルト値: true

dotconstrulestrueの時、 定数ともう1つの項の非可換積は、可換積に整理されます。 このフラグをオンにすることは、事実上、 dot1simpはもちろん、dot0simp, dot0nscsimpもオンにします。

オプション変数: dotdistrib

デフォルト値: false

dotdistribtrueの時、 式A.(B + C)A.B + A.Cに整理されます。

オプション変数: dotexptsimp

デフォルト値: true

dotexptsimptrueの時、 式A.AA^^2に整理されます。

オプション変数: dotident

デフォルト値: 1

dotidentX^^0が返す値です。

オプション変数: dotscrules

デフォルト値: false

dotscrulestrueの時、 式A.SCまたはSC.Aは、SC*Aに整理され、 A.(SC*B)SC*(A.B)に整理されます。

関数: echelon (M)

ガウスの消去法で生成される、行列Mの階段形を返します。 階段形は、Mから初等行演算によって計算され、 それぞれの行の最初の非ゼロ要素が1で、 その要素の下の列要素がすべてゼロであるような行列です。

triangularizeもガウスの消去法を実行しますが、 それぞれの行の先頭の非ゼロ要素を規格化しません。

lu_factorcholeskyは、他の、三角行列をもたらす関数です。

(%i1) M: matrix ([3, 7, aa, bb], [-1, 8, 5, 2], [9, 2, 11, 4]);
                       [  3   7  aa  bb ]
                       [                ]
(%o1)                  [ - 1  8  5   2  ]
                       [                ]
                       [  9   2  11  4  ]
(%i2) echelon (M);
                  [ 1  - 8  - 5      - 2     ]
                  [                          ]
                  [         28       11      ]
                  [ 0   1   --       --      ]
(%o2)             [         37       37      ]
                  [                          ]
                  [              37 bb - 119 ]
                  [ 0   0    1   ----------- ]
                  [              37 aa - 313 ]
関数: eigenvalues (M)
関数: eivals (M)

行列Mの固有値を含む2つのリストのリストを返します。 戻り値の最初の部分リストは、行列の固有値のリストで、 二番目の部分リストは、対応する順序で固有値の重複度のリストです。

eivalsは、eigenvaluesと同義です。

eigenvaluesは、 行列の特性多項式の根を見つけるために、 関数solveをコールします。 時々、 solveは、多項式の根を見つけられないかもしれません; その場合、このパッケージの (innerproduct, unitvector, columnvector, gramschmidtを除いた)いくつかの他の関数はうまく動かないでしょう。

いくつかの場合、solveが見つける固有値は、 複雑な式かもしれません。 (これは、 solveが 実数とわかっている固有値について 見てもすぐにはわからない実数式を返す時、起こることがあります。) 他のいくつかの関数を使って固有値を整理することが可能なことがあります。

パッケージeigen.macは、 eigenvalueseigenvectorsが参照された時、 自動的にロードされます。 もしeigen.macがまだロードされていないなら、 load ("eigen")はそれをロードします。 ロードした後は、パッケージの中の関数と変数すべてが利用可能です。

関数: eigenvectors (M)
関数: eivects (M)

行列Mの固有ベクトルを計算します。 戻り値は、2つの要素のリストです。 最初のものは、Mの固有値のリストと固有値の重複度のリストです。 二番目のものは、固有ベクトルのリストのリストです。 固有値それぞれに対して固有ベクトルのリストが1つあります。 リストそれぞれの中には、固有ベクトルが1つの時も複数のときもあります。

eivectsは、eigenvectorsと同義です。

パッケージeigen.macは、 eigenvalueseigenvectorsが参照された時、 自動的にロードされます。 もしeigen.macがまだロードされていないなら、 load ("eigen")はそれをロードします。 ロードした後は、パッケージの中の関数と変数すべてが利用可能です。

この関数に影響するフラグは以下の通りです:

nondiagonalizableは、 eigenvectorsが戻った後、行列が対角化不可能か可能かに依って truefalseに設定されます。

hermitianmatrixtrueの時、 エルミート行列の縮退した固有ベクトルが、グラム-シュミットアルゴリズムを使って直交化されるようにします。

knowneigvalstrueの時、 causes the eigenパッケージが、 行列の固有値がユーザーに知られていて、グローバル名listeigvalsの下記憶されていることを仮定するようにします。 listeigvalsは、 出力eigenvaluesに似たリストに設定されなければいけません。

ここで、関数algsysが固有ベクトルについて解くために使われます。 もし固有値がごちゃごちゃしているなら、 algsysは、時々、解を見つけられないかもしれません。 いくつかの場合、 最初にeigenvaluesコマンドを使って固有値を見つけ、 それらをもっと簡潔な何かに換算するために他の関数を使うことによって、 固有値を整理することが可能かもしれません。 整理に続いて、 trueに設定されたknowneigvalsフラグとともに 再びeigenvectorsをコールすることができます。

eigenvaluesも参照してください。

例:

固有値1つにただ1つの固有ベクトルを持つ行列。

(%i1) M1 : matrix ([11, -1], [1, 7]);
                           [ 11  - 1 ]
(%o1)                      [         ]
                           [ 1    7  ]
(%i2) [vals, vecs] : eigenvectors (M1);
(%o2) [[[9 - sqrt(3), sqrt(3) + 9], [1, 1]], 
                        [[[1, sqrt(3) + 2]], [[1, 2 - sqrt(3)]]]]
(%i3) for i thru length (vals[1]) do disp (val[i] = vals[1][i],
  mult[i] = vals[2][i], vec[i] = vecs[i]);
                       val  = 9 - sqrt(3)
                          1

                            mult  = 1
                                1

                    vec  = [[1, sqrt(3) + 2]]
                       1

                       val  = sqrt(3) + 9
                          2

                            mult  = 1
                                2

                    vec  = [[1, 2 - sqrt(3)]]
                       2

(%o3)                         done

1つの固有値(ここでは2)に2つの固有ベクトルを持つ行列。

(%i1) M1 : matrix ([0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 2, 0], 
                   [0, 0, 0, 2]);
                         [ 0  1  0  0 ]
                         [            ]
                         [ 0  0  0  0 ]
(%o1)                    [            ]
                         [ 0  0  2  0 ]
                         [            ]
                         [ 0  0  0  2 ]
(%i2) [vals, vecs] : eigenvectors (M1);
(%o2) [[[0, 2], [2, 2]], [[[1, 0, 0, 0]],
                                   [[0, 0, 1, 0], [0, 0, 0, 1]]]]
(%i3) for i thru length (vals[1]) do disp (val[i] = vals[1][i],
  mult[i] = vals[2][i], vec[i] = vecs[i]);
                            val  = 0
                               1

                            mult  = 2
                                1

                      vec  = [[1, 0, 0, 0]]
                         1

                            val  = 2
                               2

                            mult  = 2
                                2

               vec  = [[0, 0, 1, 0], [0, 0, 0, 1]]
                  2

(%o3)                         done
関数: ematrix (m, n, x, i, j)

値がx[i, j]要素を除いて、すべての要素がゼロの mn列行列を返します。

関数: entermatrix (m, n)

対話的に要素を読み、mn列行列を返します。

もしnmと等しいなら、 Maximaは、行列のタイプ(対角、対称、反対称、一般)の入力を促し、 それぞれの要素の入力を促します。 応答それぞれは、セミコロン;かドル記号$で終了させます。

もしnmと等しくなければ、 Maximaは、それぞれの要素の入力を促します。

要素は、任意の式を取り得、また、その式は評価されます。 entermatrixは引数を評価します。

(%i1) n: 3$
(%i2) m: entermatrix (n, n)$

Is the matrix  1. Diagonal  2. Symmetric  3. Antisymmetric 
4. General
Answer 1, 2, 3 or 4 : 
1$
Row 1 Column 1: 
(a+b)^n$
Row 2 Column 2: 
(a+b)^(n+1)$
Row 3 Column 3: 
(a+b)^(n+2)$

Matrix entered.
(%i3) m;
                [        3                     ]
                [ (b + a)      0         0     ]
                [                              ]
(%o3)           [                  4           ]
                [    0      (b + a)      0     ]
                [                              ]
                [                            5 ]
                [    0         0      (b + a)  ]
関数: genmatrix (a, i_2, j_2, i_1, j_1)
関数: genmatrix (a, i_2, j_2, i_1)
関数: genmatrix (a, i_2, j_2)

aから生成される行列を返します。 返される行列は、要素a[i_1,j_1]を 左上の要素として取り、 a[i_2,j_2]を 右下の要素として取ります。 ここで、aは、 (make_arrayではなくarrayが生成する)宣言配列か、 未宣言配列か、配列関数か、2つの引数を持つラムダ式のいずれかです。 (配列関数は、他の関数のように、:=defineで生成されますが、 引数は括弧の代わりにカギ括弧でくくられます。)

もしj_1が省略されたら、 それは、i_1と等しいと仮定されます。 もしj_1i_1両方が省略されたら、 両方とも1と等しいと仮定されます。

もし配列の選択された要素i,jが未定義なら、 行列は、シンボル要素a[i,j]を含みます。

例:

(%i1) h [i, j] := 1 / (i + j - 1);
                                    1
(%o1)                  h     := ---------
                        i, j    i + j - 1
(%i2) genmatrix (h, 3, 3);
                           [    1  1 ]
                           [ 1  -  - ]
                           [    2  3 ]
                           [         ]
                           [ 1  1  1 ]
(%o2)                      [ -  -  - ]
                           [ 2  3  4 ]
                           [         ]
                           [ 1  1  1 ]
                           [ -  -  - ]
                           [ 3  4  5 ]
(%i3) array (a, fixnum, 2, 2);
(%o3)                           a
(%i4) a [1, 1] : %e;
(%o4)                          %e
(%i5) a [2, 2] : %pi;
(%o5)                          %pi
(%i6) genmatrix (a, 2, 2);
                           [ %e   0  ]
(%o6)                      [         ]
                           [ 0   %pi ]
(%i7) genmatrix (lambda ([i, j], j - i), 3, 3);
                         [  0    1   2 ]
                         [             ]
(%o7)                    [ - 1   0   1 ]
                         [             ]
                         [ - 2  - 1  0 ]
(%i8) genmatrix (B, 2, 2);
                        [ B      B     ]
                        [  1, 1   1, 2 ]
(%o8)                   [              ]
                        [ B      B     ]
                        [  2, 1   2, 2 ]
関数: gramschmidt (x)
関数: gramschmidt (x, F)

xに対してグラム-シュミット直交化アルゴリズムを実行します。 xは、行列かリストのリストのいずれかです。 gramschmidtxを変更しません。 もし引数にあれば、gramschmidtFを内積として使います。 そうでなければ、内積は関数innerproductです。

もしxが行列なら、 アルゴリズムは xの行に適用されます。 もしxがリストのリストなら、 アルゴリズムは部分リストに適用されます。 部分リストは、要素数が同じでなければいけません。 いずれの場合も、 戻り値は、リストのリストです。 この部分リストは互いに直交し、xと同じ空間を埋めます。 もし、xの全範囲の次元が行や部分リストの数よりちいさいなら、 戻り値の部分リストのいくつかはゼロです。

中間結果を整理するために、アルゴリズムのそれぞれの段階でfactorがコールされます。 結果として、戻り値は、素因数分解された整数を含みます。

load("eigen")はこの関数をロードします。

例:

デフォルトの内積関数を使ったグラム-シュミットアルゴリズム。

(%i1) load ("eigen")$
(%i2) x: matrix ([1, 2, 3], [9, 18, 30], [12, 48, 60]);
                         [ 1   2   3  ]
                         [            ]
(%o2)                    [ 9   18  30 ]
                         [            ]
                         [ 12  48  60 ]
(%i3) y: gramschmidt (x);
                       2      2            4     3
                      3      3   3 5      2  3  2  3
(%o3)  [[1, 2, 3], [- ---, - --, ---], [- ----, ----, 0]]
                      2 7    7   2 7       5     5
(%i4) map (innerproduct, [y[1], y[2], y[3]], [y[2], y[3], y[1]]);
(%o4)                       [0, 0, 0]

指定した内積関数を使ったグラム-シュミットアルゴリズム。

(%i1) load ("eigen")$
(%i2) ip (f, g) := integrate (f * g, u, a, b);
(%o2)          ip(f, g) := integrate(f g, u, a, b)
(%i3) y : gramschmidt([1, sin(u), cos(u)], ip), a= -%pi/2, b=%pi/2;
                               %pi cos(u) - 2
(%o3)              [1, sin(u), --------------]
                                    %pi
(%i4) map (ip, [y[1], y[2], y[3]], [y[2], y[3], y[1]]), 
                                                a= -%pi/2, b=%pi/2;
(%o4)                       [0, 0, 0]
関数: ident (n)

nn列の単位行列を返します。

関数: innerproduct (x, y)
関数: inprod (x, y)

xyの(スカラー積やドット積とも呼ばれる)内積を返します。 xyは、等しい長さのリストか、ともに等しい長さの1列行列か1行行列です。 戻り値は、conjugate (x) . yです。 ここで、.は非可換乗算演算子です。

load ("eigen")はこの関数をロードします。

inprodは、innerproductと同義です。

関数: invert (M)

行列Mの逆行列を返します。 逆行列は随伴法で計算されます。

これは、ユーザーが 要素が多倍長浮動小数点の行列や 要素が浮動小数点係数多項式の行列の逆行列を、 CRE形に変換することなしに計算することを可能にします。

余因子は、determinant関数で計算されるので、 もしratmxfalseなら、 要素の表現を変えることなしに、逆行列が計算されます。

現在の実装は、高次の行列には非効率的です。

detouttrueの時、 行列式は、逆行列から係数として外に出されます。

逆行列の要素は自動的には展開されません。 もしMが多項式の要素を持つなら、 expand (invert (m)), detoutが、見た目がよりよい出力を生成することができます。 もし全体を行列式で割られたものが望ましいなら、 xthru (%)で達成することができます。 また、代わりに最初から以下のようにしても達成できます。

expand (adjoint (m)) / expand (determinant (m))
invert (m) := adjoint (m) / determinant (m)

行列の逆を計算する別の方法について^^ (非可換べき乗)を参照してください。

関数: list_matrix_entries (M)

行列Mの要素を含むリストを返します。

例:

(%i1) list_matrix_entries(matrix([a,b],[c,d]));
(%o1)                     [a, b, c, d]
オプション変数: lmxchar

デフォルト値: [

lmxcharは、行列の左区切り記号として表示される文字です。 rmxcharも参照してください。

例:

(%i1) lmxchar: "|"$
(%i2) matrix ([a, b, c], [d, e, f], [g, h, i]);
                           | a  b  c ]
                           |         ]
(%o2)                      | d  e  f ]
                           |         ]
                           | g  h  i ]
関数: matrix (row_1, ..., row_n)

row_1, ..., row_nを持つ長方形行列を返します。 行それぞれは、式のリストです。 すべての行は同じ長さでなければいけません。

オペランドが、2つの行列、スカラーと行列、行列とスカラーのいずれかの時、 演算+ (足し算), - (引き算), * (掛け算), / (割り算)は要素毎に実行されます。 もしオペランドが、スカラーと行列、行列とスカラーのいずれかなら、 演算^ (べき乗, **と同値)は、要素毎に実行されますが、 もしオペランドが2つの行列なら要素毎には実行されません。 . (非可換乗算)を含むすべての演算は、通常、完全に実行されます。

行列の掛け算は、非可換乗算演算子.で表されます。 対応する非可換べき乗演算子は^^です。 行列 Aに関して、 A.A = A^^2であり、 もし存在するなら、A^^-1Aの逆行列です。

ドット演算や行列-リスト演算を含む式の整理を制御するためのスイッチがあります。 それらは、 doallmxops, domxexpt domxmxops, doscmxops, doscmxplusです。

行列に関係する付加的なオプションがあります。 それらは以下の通りです: lmxchar, rmxchar, ratmx, listarith, detout, scalarmatrix, sparse

行列を引数として取ったり、行列を戻り値としてもたらしたりするたくさんの関数があります。 eigenvalues, eigenvectors, determinant, charpoly, genmatrix, addcol, addrow, copymatrix, transpose, echelon, rankを参照してください。

例:

  • リストからの行列の組み立て。
(%i1) x: matrix ([17, 3], [-8, 11]);
                           [ 17   3  ]
(%o1)                      [         ]
                           [ - 8  11 ]
(%i2) y: matrix ([%pi, %e], [a, b]);
                           [ %pi  %e ]
(%o2)                      [         ]
                           [  a   b  ]
  • 足し算、要素毎に。
(%i3) x + y;
                      [ %pi + 17  %e + 3 ]
(%o3)                 [                  ]
                      [  a - 8    b + 11 ]
  • 引き算、要素毎に。
(%i4) x - y;
                      [ 17 - %pi  3 - %e ]
(%o4)                 [                  ]
                      [ - a - 8   11 - b ]
  • 掛け算。要素毎に。
(%i5) x * y;
                        [ 17 %pi  3 %e ]
(%o5)                   [              ]
                        [ - 8 a   11 b ]
  • 割り算。要素毎に。
(%i6) x / y;
                        [ 17       - 1 ]
                        [ ---  3 %e    ]
                        [ %pi          ]
(%o6)                   [              ]
                        [   8    11    ]
                        [ - -    --    ]
                        [   a    b     ]
  • 行列のスカラーべき、要素毎に。
(%i7) x ^ 3;
                         [ 4913    27  ]
(%o7)                    [             ]
                         [ - 512  1331 ]
  • スカラー基数の行列べき、要素毎に。
(%i8) exp(y); 
                         [   %pi    %e ]
                         [ %e     %e   ]
(%o8)                    [             ]
                         [    a     b  ]
                         [  %e    %e   ]
  • 行列基数の行列べき。これは要素毎には実行されません。
(%i9) x ^ y;
                                [ %pi  %e ]
                                [         ]
                                [  a   b  ]
                     [ 17   3  ]
(%o9)                [         ]
                     [ - 8  11 ]
  • 非可換行列乗算。
(%i10) x . y;
                  [ 3 a + 17 %pi  3 b + 17 %e ]
(%o10)            [                           ]
                  [ 11 a - 8 %pi  11 b - 8 %e ]
(%i11) y . x;
                [ 17 %pi - 8 %e  3 %pi + 11 %e ]
(%o11)          [                              ]
                [  17 a - 8 b     11 b + 3 a   ]
  • 非可換行列べき乗 スカラー基数bの行列べきMは、要素毎に実行され、 b^^mb^mと同じです。
(%i12) x ^^ 3;
                        [  3833   1719 ]
(%o12)                  [              ]
                        [ - 4584  395  ]
(%i13) %e ^^ y;
                         [   %pi    %e ]
                         [ %e     %e   ]
(%o13)                   [             ]
                         [    a     b  ]
                         [  %e    %e   ]
  • 行列の-1指数の非可換べき乗は存在するなら、逆行列のことです。
(%i14) x ^^ -1;
                         [ 11      3  ]
                         [ ---  - --- ]
                         [ 211    211 ]
(%o14)                   [            ]
                         [  8    17   ]
                         [ ---   ---  ]
                         [ 211   211  ]
(%i15) x . (x ^^ -1);
                            [ 1  0 ]
(%o15)                      [      ]
                            [ 0  1 ]
関数: matrixmap (f, M)

f(M[i,j])に等しい要素i,jを持つ行列を返します。

map, fullmap, fullmapl, applyも参照してください。

関数: matrixp (expr)

もしexprが行列ならtrueを返し,そうでなければ、falseを返します。

オプション変数: matrix_element_add

デフォルト値: +

matrix_element_addは、 行列乗算の中で足し算の代わりに呼び出される演算です。 matrix_element_addは、 任意のn項演算子(すなわち、任意の数の引数を扱う関数)に割り当てられます。 割り当てられた値は、クォートマークでくくられた演算子の名前か、 関数名かラムダ式を取り得ます。

matrix_element_multmatrix_element_transposeも参照してください。

例:

(%i1) matrix_element_add: "*"$
(%i2) matrix_element_mult: "^"$
(%i3) aa: matrix ([a, b, c], [d, e, f]);
                           [ a  b  c ]
(%o3)                      [         ]
                           [ d  e  f ]
(%i4) bb: matrix ([u, v, w], [x, y, z]);
                           [ u  v  w ]
(%o4)                      [         ]
                           [ x  y  z ]
(%i5) aa . transpose (bb);
                     [  u  v  w   x  y  z ]
                     [ a  b  c   a  b  c  ]
(%o5)                [                    ]
                     [  u  v  w   x  y  z ]
                     [ d  e  f   d  e  f  ]
オプション変数: matrix_element_mult

デフォルト値: *

matrix_element_multは、 行列乗算の中で掛け算の代わりに呼び出される演算です。 matrix_element_multは、 任意の二項演算子に割り当てられます。 割り当てられた値は、クォートマークでくくられた演算子の名前か、関数名か、 ラムダ式を取り得ます。

ドット演算子.は、いくつかの文脈で役に立つ選択です。

matrix_element_addmatrix_element_transposeも参照してください。

例:

(%i1) matrix_element_add: lambda ([[x]], sqrt (apply ("+", x)))$
(%i2) matrix_element_mult: lambda ([x, y], (x - y)^2)$
(%i3) [a, b, c] . [x, y, z];
                          2          2          2
(%o3)         sqrt((c - z)  + (b - y)  + (a - x) )
(%i4) aa: matrix ([a, b, c], [d, e, f]);
                           [ a  b  c ]
(%o4)                      [         ]
                           [ d  e  f ]
(%i5) bb: matrix ([u, v, w], [x, y, z]);
                           [ u  v  w ]
(%o5)                      [         ]
                           [ x  y  z ]
(%i6) aa . transpose (bb);
               [             2          2          2  ]
               [ sqrt((c - w)  + (b - v)  + (a - u) ) ]
(%o6)  Col 1 = [                                      ]
               [             2          2          2  ]
               [ sqrt((f - w)  + (e - v)  + (d - u) ) ]

                         [             2          2          2  ]
                         [ sqrt((c - z)  + (b - y)  + (a - x) ) ]
                 Col 2 = [                                      ]
                         [             2          2          2  ]
                         [ sqrt((f - z)  + (e - y)  + (d - x) ) ]
オプション変数: matrix_element_transpose

デフォルト値: false

matrix_element_transposeは、 転置される時、行列のそれぞれの要素に適用される演算です。 matrix_element_multは、任意の単項演算子に割り当てられます。 割り当てられた値はクォートマークでくくられた演算子の名前か、 関数名か、ラムダ式を取り得ます。

matrix_element_transposetransposeに等しい時、 transpose関数が要素すべてに適用されます。 matrix_element_transposenonscalarsに等しい時、 transpose関数は非スカラー要素すべてに適用されます。 もしある要素がアトムなら、nonscalarsオプションは アトムが宣言された非スカラーの時だけtransposeを適用します。 一方、transposeオプションはいつもtransposeを適用します。

デフォルト値, false,はいかなる演算も適用しないことを意味します。

matrix_element_addmatrix_element_multも参照してください。

例:

(%i1) declare (a, nonscalar)$
(%i2) transpose ([a, b]);
                        [ transpose(a) ]
(%o2)                   [              ]
                        [      b       ]
(%i3) matrix_element_transpose: nonscalars$
(%i4) transpose ([a, b]);
                        [ transpose(a) ]
(%o4)                   [              ]
                        [      b       ]
(%i5) matrix_element_transpose: transpose$
(%i6) transpose ([a, b]);
                        [ transpose(a) ]
(%o6)                   [              ]
                        [ transpose(b) ]
(%i7) matrix_element_transpose: lambda ([x], realpart(x)
      - %i*imagpart(x))$
(%i8) m: matrix ([1 + 5*%i, 3 - 2*%i], [7*%i, 11]);
                     [ 5 %i + 1  3 - 2 %i ]
(%o8)                [                    ]
                     [   7 %i       11    ]
(%i9) transpose (m);
                      [ 1 - 5 %i  - 7 %i ]
(%o9)                 [                  ]
                      [ 2 %i + 3    11   ]
関数: mattrace (M)

正方行列Mの跡(すなわち、主対角上の要素の和)を返します。

mattraceは、ncharpoly―Maximaのcharpolyの代わり― によってコールされます。

load ("nchrpl")はこの関数をロードします。

関数: minor (M, i, j)

行列Mi, j小行列を返します。 すなわち、行iと列jを除いたMです。

関数: ncharpoly (M, x)

行列Mxに関する特性多項式を返します。 これはMaximaのcharpolyの代わりです。

ncharpolyは、与えられた行列のべきの跡を計算することで機能します。 それは、特性多項式の根のべきの和に等しいことが知られています。 それらの量から根の対称関数を計算することができます。 それらは、特性多項式の係数以上のなにものでもありません。 charpolyは、 x * ident [n] - aの行列式を形成することで機能します。 このように、 ncharpoly は完全に多項式算術を避けるので、 例えば、整数で埋められた大きな密な行列の場合、ncharpolyが勝ります。

load ("nchrpl")はこのファイルをロードします。

関数: newdet (M)

行列Mの行列式を ジョンソン-ジェントルマンのtree minorアルゴリズムを使って計算します。 newdetはCRE形式で結果を返します。

宣言: nonscalar

アトムをドット演算子に関してリストか行列のように振る舞うようにします。

関数: nonscalarp (expr)

もしexprが非スカラー、すなわち、 非スカラーとして宣言されたアトムかリスト、行列を含むなら、 trueを返します。

関数: permanent (M, n)

行列Mのパーマネントを計算します。 パーマネントは行列式のようですが、符号が変わりません。 permanentはCRE形式で結果を返します。

newdetも参照してください。

関数: rank (M)

行列Mのランクを計算します。 すなわち、Mの、最も大きな非特異な小行列式の次数です。

もしrankがゼロと同値の行列要素が確かにそうであることを決定することができないなら、 、間違った答えを返します。

オプション変数: ratmx

デフォルト値: false

ratmxfalseの時、 行列要素の表現で、行列式と行列の足し算、引き算、掛け算が実行され、 逆行列の結果は一般表現のまま残されます。

ratmxtrueの時、 上で述べた4つの演算は、CRE形式で実行され、 逆行列の結果もCRE形式になります。 これは、(ratfacの設定に依って) いつも望まれているわけではないですが、 要素が展開されるようになるかもしれないことに注意してください。

関数: row (M, i)

行列Mi番目の行を返します。 戻り値は行列です。

オプション変数: rmxchar

デフォルト値: ]

rmxcharは、行列の右辺に描かれる文字です。

lmxcharも参照してください。

オプション変数: scalarmatrixp

デフォルト値: true

scalarmatrixptrueの時、 1 x 1行列が行列のドット積を計算した結果として生成される時はいつでも、 スカラー、すなわち、行列の唯一の要素、に整理されます。

scalarmatrixpallの時、 すべての1 x 1行列はスカラーに整理されます。

scalarmatrixpfalseの時、 1 x 1行列はスカラーに整理されません。

関数: scalefactors (coordinatetransform)

ここで、 coordinatetransformは、形式 [[expression1, expression2, ...], indeterminate1, indeterminat2, ...] に評価されます。また、 indeterminate1, indeterminate2, などは曲線座標変数であり、 直交カーテシアン成分の集合は、 [expression1, expression2, ...]によって、曲線座標を使って与えられます。

coordinatesが ベクトル[indeterminate1, indeterminate2,...]に設定され、 dimensionがこのベクトルの長さに設定されます。 SF[1], SF[2], …, SF[DIMENSION]は、座標スケールファクタに設定され、 sfprodは、これらのスケールファクタの積に設定されます。 初期には、3次元直交カーテシアン座標に対応して、 coordinatesは[X, Y, Z]であり、 dimensionは3であり、SF[1]=SF[2]=SF[3]=SFPROD=1です。 式を現在の座標形の物理成分に展開するために、 形式?を利用する関数があります。

関数: setelmx (x, i, j, M)

xを行列Mの(i, j)番目の要素に割り当て、 変わった行列を返します。

M [i, j]: xは同じ効果を持ちますが、 Mの代わりにxを返します。

関数: similaritytransform (M)
関数: simtran (M)

similaritytransformは、 行列Mの相似変換を計算します。 uniteigenvectorsコマンドの出力であるリストを返します。 更に、もしフラグnondiagonalizablefalseなら、 2つのグローバル行列leftmatrixrightmatrixが計算されます。 これらの行列は、 leftmatrix . M . rightmatrixMの固有値を対角上に持つ対角行列となるという性質を持ちます。 もしnondiagonalizabletrueなら、 左右の行列は計算されません。

もしフラグhermitianmatrixtrueなら、 leftmatrixは、rightmatrixの転置の複素共役です。 そうでなければ、leftmatrixrightmatrixの逆行列です。

rightmatrixは、列がMの単位固有ベクトルである行列です。 他のフラグ(eigenvalueseigenvectorsを参照してください)は、 similaritytransformは、 rightmatrixを形成することができるようになるために、パッケージの中の他の関数をコールするので、 同じ効果を持ちます。

load ("eigen")はこの関数をロードします。

simtranは、similaritytransformと同義です。

オプション変数: sparse

デフォルト値: false

sparsetrueの時、 かつ、もしratmxtrueなら、 determinantは、粗な行列式を計算するために特別なルーチンを使います。

関数: submatrix (i_1, …, i_m, M, j_1, …, j_n)
関数: submatrix (i_1, …, i_m, M)
関数: submatrix (M, j_1, …, j_n)

i_1, …, i_mが取り除かれ、 列j_1, …, j_nが取り除かれた 行列Mから構成された新しい行列を返します。

関数: transpose (M)

Mの転置を返します。

もしMが行列なら、 戻り値は、N[i,j] = M[j,i]であるような別の行列Nです。

もしMがリストなら、 返し値は、N[i,1] = M[i]であるような、length (m)行1列の行列Nです。

そうでなければMはシンボルで、 戻り値は、名詞式'transpose (M)です。

関数: triangularize (M)

ガウスの消去法で生成されるような、行列Mの右上三角化行列を返します。 戻り値は、 それぞれの行の先頭の非ゼロ係数が1に規格化されないことを除いて、 echelonと同じです。

lu_factorcholeskyは、三角化行列をもらたす他の関数です。

(%i1) M: matrix ([3, 7, aa, bb], [-1, 8, 5, 2], [9, 2, 11, 4]);
                       [  3   7  aa  bb ]
                       [                ]
(%o1)                  [ - 1  8  5   2  ]
                       [                ]
                       [  9   2  11  4  ]
(%i2) triangularize (M);
             [ - 1   8         5            2      ]
             [                                     ]
(%o2)        [  0   - 74     - 56         - 22     ]
             [                                     ]
             [  0    0    626 - 74 aa  238 - 74 bb ]
関数: uniteigenvectors (M)
関数: ueivects (M)

行列Mの単位固有ベクトルを計算します。 戻り値は、リストのリストです。 最初の部分リストはeigenvaluesコマンドの出力であり、 他の部分リストは、固有値それぞれに対応する行列の単位固有ベクトルです。

eigenvectorsコマンドでの記述で言及されたフラグは、 これに関しても同じ効果を持ちます。

knowneigvectstrueの時、 eigenパッケージは、 行列の固有ベクトルがユーザーに知られていて、 グローバル名listeigvectsの下に記憶されていることを仮定します。 listeigvectsは、 eigenvectorsコマンドの出力に似たリストに設定されなければいけません。

もしknowneigvectstrueに設定されていて、 固有ベクトルのリストが与えれているなら、 フラグnondiagonalizableの設定は正しくないかもしれません。 もしこの場合に該当するなら、正しい値に設定してください。 作者は、ユーザーがしていることを知っていること、 固有値が適切な次元のベクトル空間を作り出さない行列を対角化しようとはしないことを 仮定しています。

load ("eigen")はこの関数をロードします。

ueivectsuniteigenvectorsと同義です。

関数: unitvector (x)
関数: uvect (x)

x/norm(x)を返します; これは、xと同じ向きの単位ベクトルです。

load ("eigen")はこの関数をロードします。

uvectは、unitvectorと同義です。

関数: vectorpotential (givencurl)

現在の座標系で与えられた回転ベクトルのベクトルポテンシャルを返します。 potentialzerolocpotentialに対して似たような役割を持ちますが、 等式の左辺側の次数は座標変数の巡回置換でなければいけません。

関数: vectorpotential (givencurl)

現在の座標系で、与えられた回転ベクトルのベクトルポテンシャルを返します。 potentialzerolocは、potentialと同様の役割を持ちますが、 等式の左辺の順序が座標の巡回置換でなければいけません。

関数: vectorsimp (expr)

以下のグローバルフラグに従って整理と展開を適用します:

expandall, expanddot, expanddotplus, expandcross, expandcrossplus, expandcrosscross, expandgrad, expandgradplus, expandgradprod, expanddiv, expanddivplus, expanddivprod, expandcurl, expandcurlplus, expandcurlcurl, expandlaplacian, expandlaplacianplus, expandlaplacianprod.

これらのフラグすべては、デフォルト値falseを持ちます。 plus接尾辞は、加算性や分配性の利用に関係します。 prod接尾辞は、任意の種類の積のオペランドに関する展開に関係します。

expandcrosscross

p ~ (q ~ r)(p . r)*q - (p . q)*rに整理します。

expandcurlcurl

curl curl pgrad div p + div grad pに整理します。

expandlaplaciantodivgrad

laplacian pdiv grad pに整理します。

expandcross

expandcrossplusexpandcrosscrossを有効にします。

expandplus

expanddotplus, expandcrossplus, expandgradplus, expanddivplus, expandcurlplus, expandlaplacianplusを有効にします。

expandprod

expandgradprod, expanddivprod, expandlaplacianprodを有効にします。

これらのフラグはすべてevflagとして宣言されています。

オプション変数: vect_cross

デフォルト値: false

vect_crosstrueの時、 ~がSHARE;VECTの中で定義されているところ (とにかく、VECT_CROSSがtrueに設定されているところ) でDIFF(X~Y,T)が機能するようにします。

関数: zeromatrix (m, n)

要素すべてがゼロのmn列行列を返します。


Next: , Previous:   [Contents][Index]