2016.7.19 コンピュータ数学 MATLAB・Scilab の使い方 – 行列とベクトルの計算 – 本資料では,MATLAB,及び Scilab における行列・ベクトルの計算について説明します.MATLAB のコ ンソールは >>,Scilab のコンソールは --> と表示されます. また,計算した結果が 2.2204e-16 のように e を含んだ形で表示されることがありますが,これは 2.2204 × 10−16 を表しています.このような非常に小さい値は,0 とみなしてもらって構いません. 基本的な演算命令 1 1.1 演算子 MATLAB,Scilab では表 1 にある演算子を用いて,四則演算とべき乗を計 算できます. 表 1 MATLAB・Scilab の演算子. >> a = 1.4; >> b = 3.5; 演算 演算子 >> a + b 加算 + ans = 減算 - 乗算 * 除算 / べき乗 ^ 4.9000 >> a - b ans = -2.1000 >> a * b ans = 4.9000 >> a / b ans = 0.4000 >> a^2 ans = 1.2 1.9600 ベクトル・行列の定義と演算 ベクトルと行列の定義 1.2.1 MATLAB,Scilab ではベクトルと行列を簡単に定義することができます.例えば 3 次元ベクトル x として 1 x= 2 3 を定義するには, >> x = [1; 2; 3] x = 1 2 3 1 と入力します.x の成分 1, 2 の後にセミコロン ; が入っていますが,これは改行を表しています.セミコロ ンをつけないで入力すると, >> x = [1 2 3] x = 1 2 3 となり,x は 3 次元行ベクトルとして定義されます. 行列も同じように定義できます.例えば,3 行 3 列の行列 1 A= 4 7 2 5 8 3 6 9 を定義するには,以下のように入力します. >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 この行列は 1 行あたり 3 つの要素があるので,3 つの要素ごとにセミコロンをつけて改行します. 行列とベクトルの要素の参照方法 1.2.2 MATLAB,Scilab では,行列やベクトルの特定の要素を参照することができます.例えば上記の行列 A の 3 行 1 列目を参照したい場合は >> A(3,1) ans = 7 と入力すると,7 という要素が書き出されます.ベクトルの場合も同様に, >> x(2) ans = 2 で参照が可能です.x(2,1) としても同様の結果が得られます. 行列・ベクトルに関する演算 1.2.3 ◦ 行列・ベクトルの加算と減算 行列・ベクトルでの加減算を行うには,2 つの行列・ベクトルの行数と列数は等しくなければいけません. >> A = [1 2 3;4 5 6;7 8 9]; >> A = [1 2 3;4 5 6;7 8 9]; >> x = [1; 4; 6]; >> B = [1 3 5;7 9 2;4 6 8]; >> B = [1 3 5;7 9 2;4 6 8]; >> y = [1; 3; 5]; >> A + B >> A - B >> x + y ans = ans = ans = 2 5 8 0 -1 -2 2 11 14 8 -3 -4 4 7 11 14 17 3 2 1 11 図1 行列の加算. 図2 行列の減算. 2 図3 ベクトルの加算. ◦ 行列とベクトルに関する乗算 行列の乗算 A * B の計算では,行列 A の列数と行列 B の行数が等しくないといけません.A または B がベ クトルの場合も同様です.下記の一番右の例では,A の列数と B の行数が等しくないため,エラーメッセージ が表示されています(Scilab では,エラーメッセージの内容が若干異なります). >> A = [1 2 3;4 5 6;7 8 9]; >> A = [1 4 6; 2 7 9]; >> A = [1 2; 4 5; 7 8]; >> x = [3; 7; 5]; >> B = [1 3;5 6;7 8]; >> B = [1 3 5;7 9 2;4 6 8]; >> A * x >> A * B >> A * B ans = ans = エラー: 32 63 75 77 100 120 * 内部行列の次元は一致しなければ なりません。 122 図4 行列とベクトルの乗算. 図5 行列の乗算. 図6 行列の乗算が定義されない例. ◦ 行列のべき乗 行列でもスカラーと同じように,演算子^ を用いて行列のべき乗を計算することができます.但し,行列の べき乗は行数と列数が等しい正方行列の場合に限ります. >> A = [2 3 -1; 4 7 8;-5 9 6] >> A = [2 3 -1; 4 7 8;-5 9 6] >> A = [2 3 -1; 4 7 8;-5 9 6] A = >> A^2 >> A^3 ans = ans = 2 3 -1 21 18 16 34 333 219 4 7 8 -4 133 100 24 1819 1668 -5 9 6 -4 102 113 -165 1719 1498 図7 行列 A. 図8 行列 A の 2 乗 (A2 ). 図9 行列 A の 3 乗 (A3 ). ◦ 行列の転置 行列を転置させたい場合は,変数の後に ’ をつけます. >> A = [1 2 3; 4 5 6] >> x = [1; 2; 3]; A = >> y = [2; 5; 9]; 1 2 3 4 5 6 >> x’ * y ans = >> A’ 39 ans = 1 4 2 5 3 6 図 10 行列 A とその転置. 図 11 ベクトル x の転置とベクトル y の積(内積の計算). 3 数学で用いられる定数と関数 2 円周率 π は,MATLAB では pi,Scilab では %pi という変数で,あらかじめ登録されています.ですので, 円周率を自分で手入力する必要はありません.(もし円周率が登録されていない環境で円周率が必要になった 場合は,π = 4 arctan 1 という式を使って計算すると楽です.覚えておきましょう.) 数学で用いられる代表的な MATLAB,Scilab の組み込み関数を表 2 に示します.Mathematica と異なり, MATLAB,Scilab の組み込み関数は 関数名は全て小文字で,カッコは ( ) です.もしエラーが出た場 合は,カッコを確認してみましょう. 表 2 MATLAB・Scilab の組み込み関数. 関数 MATLAB・Scilab の組み込み関数 sin x sin(x) cos x cos(x) tan x tan(x) log x log(x) log10 x log10(x) x exp(x) e √ x sqrt(x) arcsin x asin(x) arccos x acos(x) arctan x atan(x) |x| (x の絶対値) abs(x) 行列に関する命令 3 3.1 値の代入などを行う命令 行列に値を代入する命令として,以下の命令が用意されています. • zeros:全ての要素の値が 0 の行列を設定する命令 m = 2; n = 3; A = A = zeros(m,n) =⇒ 0 0 0 0 0 0 • ones:全ての要素の値が 1 の行列を設定する命令 m = 3; n = 2; A = A = ones(m,n) =⇒ 1 1 1 1 1 1 • eye:対角要素が 1,その他の要素が 0 の行列を設定する命令(正方行列でなくてもよい) m = 3; n = 2; A = A = eye(m,n) =⇒ 1 0 0 1 0 0 4 • rand:行列要素を乱数で設定する命令 m = 2; n = 3; A = A = rand(m,n) =⇒ 0.7968 0.1588 0.8478 0.1138 0.3558 0.5828 • diag:対角要素だけを取り出す命令 m = 2; n = 3; ans = A = rand(m,n); =⇒ diag(A) 3.2 0.7968 0.3558 行列に関する演算を行う命令 MATLAB,Scilab には,行列の行列式,階数,逆行列を計算したり,連立一次方程式を解く命令などが用 意されています. • det:行列の行列式を求める命令(正方行列でなくてはいけません) m = 3; n = 3; ans = A = rand(m,n); =⇒ det(A) -0.0994 • rank:行列の階数を求める命令 m = 50; n = 100; ans = A = rand(m,n); =⇒ rank(A) 50 • inv:行列の逆行列を求める命令 A = [ 1 -1 0; -1 2 -1; 0 -1 2 ]; ans = =⇒ X = inv(A); 3 2 1 X 2 2 1 A*X 1 1 1 1 0 0 0 1 0 0 0 1 ans = • \(バックスラッシュ):連立一次方程式を解く命令 m = 3; n = 3; x = A = rand(m,n); =⇒ -10.1395 b = rand(m,1); x = A\b norm(b-A*x) 3.7206 -0.3592 ans = 7.3277e-16 連立一次方程式 Ax = b を解いて x を求め,∥b − Ax∥2 を計算しています.誤差の影響でこの値は完 全に 0 にはなりませんが,十分に良い x が求められていることを示しています.7.3277e-16 が出力結 果として表示されていますが,これは 7.3277 × 10−16 を表しています. 【補足】Mac OS X 環境におけるバックスラッシュの入力について Mac OS X 環境でバックスラッシュを入力するには,「option キー」を押しながら「Y =キー」を押します. 5 グラフの描画 4 MATLAB, Scilab でグラフの描画するには plot 関数を利用します.ここでは例として,4 つの点 A(0, 0), B(2, −1),C(4, 0),D(2, 1) を結んでできる菱形 ABCD を描画します.点 A, B, C, D の x 座標,y 座標を第 1 成分,第 2 成分にもつベクトル a, b, c, d をそれぞれ 0 2 4 2 a = 0 , b = −1 , c = 0 , d = 1 1 1 1 1 とします.菱形 ABCD を描画するには,以下のコードを実行します.MATLAB において,1 つのグラフに 複数の図形を描画するには hold on コマンドを実行します.Scilab では,最初から 1 つのグラフに複数の図 形を描画できる設定になっているので,このコマンドの実行は必要ありません. ¶ MATLAB・Scilab コード ³ 0; 1 ]; % 点 A に対応するベクトル. b = [ 2; -1; 1 ]; % 点 B に対応するベクトル. c = [ 4; 0; 1 ]; % 点 C に対応するベクトル. d = [ 2; 1; 1 ]; % 点 D に対応するベクトル. a = [ 0; X = [ a b c d a ]; % 点 A, B, C, D をまとめた行列. plot( X(1,:), X(2,:) ); hold on; % 菱形 ABCD の描画 % Scilab では不要.MATLAB で 1 つのグラフに複数の図形を描画するためのコマンド. a1 = [ -2; -3; 1 ]; b1 = [ 0; -4; 1 ]; c1 = [ 2; -3; 1 ]; d1 = [ 0; -2; 1 ]; X1 = [ a1 b1 c1 d1 a1 ]; plot( X1(1,:), X1(2,:) ); % 別の図形の描画 µ ´ 1 0.5 0 −0.5 −1 −1.5 −2 −2.5 −3 −3.5 −4 −2 図 12 MATLAB で描画したグラフ. −1.5 −1 −0.5 0 0.5 1 1.5 2 2.5 図 13 Scilab で描画したグラフ. 6 3 3.5 4
© Copyright 2024 ExpyDoc