next up previous contents index
次へ: 5 プログラミング 上へ: Scilab 入門 戻る: 3 Scilab の使い方の基礎   目次   索引

Subsections

4 プログラミングの基礎

4.1 簡単なプログラミングの例

ある値を保持するため変数が用いられる.変数はユーザが定義することができ る.変数には保持する内容により数値型,文字型,Boolean 型などがある.

変数 a に数値 1 を入力するには

--> a=1
とし,リターンキーを押せば良い.実行結果が
-->a=1
 a  =
 
    1.
と表示される. ここで=は数式の$ =$ と意味が違い,数値 1 を変数 a に 代入す操作を示し,代入演算子 と呼ばれる.

行末にセミコロン ; をつけると実行結果は表示されない.

-->a=1;
 
-->

一行に複数のコマンドを書くときはコンマ , かセミコロンで区切る. つぎの例のように,コンマの場合は実行結果が表示され,セミコロンの場合は 実行結果は表示されない.

-->a=1,b=2,c=a+b
 a  =
 
    1.  
 b  =
 
    2.  
 c  =
 
    3.  
 
-->a=1;b=2;c=a+b;
-->

変数の値を表示するときは変数名を入力する.

-->c
 c  =
 
    3.
上の例では c = が表示されている. 変数 c の値だけを表示したい場合は 関数 dispを用いて
-->disp(c)
 
    3.
とする.


4.2 コメント行

// で始まるコマンド行は Scilabに解釈されず,コメント行となる.


4.3 継続行

コマンドが長く複数行に継続する場合は,つぎのように ...を用いる.
-->a=(1+2+3+4+5+6+7+8+9+10 ...
-->)/2                        
 a  =
 
    27.5


4.4 変数名

変数と関数の名前は文字か特別な記号 '% ', ' _ ', '# ', ' ! ', ' $', ' ? ' で始める.二文字目以降は文字, 数字または ' _ ',' # ', ' ! ', ' $ ', ' ? 'の文字を用い る.大文字と小文字は区別される.したがって変数 a と変数 A は異なる変数である.なお,名前の字数は任意であるが, Scilab は初めの24文字のみを解釈する.


4.5 特殊変数

一般に,ユーザが定義する変数をユーザ変数,既に定義されている 変数をシステム変数という.Scilab システム変数である定義済み変数(定数) 名は,通常,% ではじまる. 定義済み変数を表 1に示す.

表 1: 特殊な変数
変数 意味
%i 虚数単位 $ \sqrt{-1}$
%pi 円周率 $ \pi=3.1415927\cdots$
%e ネピア数(自然対数の底), $ e=2.7182818\cdots$
%eps $ 1+$%eps$ =1$となる最も大きい値
%inf 無限大
%nan 値なし


補足:数式では $ 1+x=1$ であれば $ x=0$ であるが, 計算機には誤差があるので 1+x=1となるxが存在する. このxの最大値%epsが計算機の計算精度となる.

% で始まらない特殊変数に変数ansがある. 変数ans は特別な変数で,つぎのように値が代入されなかった直前の計 算結果を記憶している.

-->1+2;
 
-->ans
 ans  =
 
    3.

4.6 数値表示の変更

コマンドformat を用いると数値表示の形 式が変更ができる.ただ,Scilab 3.0 ではヘルプマニュアルどおりに動作しない.


4.7 複素数

複素数を定義するには %iを用いる. $ j$ を数式における虚数単位とする.変数 a$ 3+2j$ を代入するには

-->a=3 + 2*%i
 a  =
 
    3. + 2.i
とすればよい.


4.8 基本算術演算

スカラー変数の基本的な算術演算を表2にまとめる. (表2以外にも多くの算術演算が提供されている.)

表 2: 基本算術演算
数式 コマンド
$ a+b$ a+b
$ a-b$ a-b
$ a b$ a*b
$ a/b$ a/b
$ a^b$ a^b
abs 絶対値
ceil 小数点以下切上げ
floor 小数点以下切捨て
round 四捨五入
real 実数部
imag 虚数部
sin $ \sin$
cos $ \cos$
tan $ \tan$
log 自然対数


三角関数の角度の単位はラジアンである. abs ceil floor round real imag cos sin tan log

演算の評価順序は数式と同様である.

-->2+3*5
 ans  =
 
    17.
通常の数式のように() を利用することで,式を組合せることができる. このときより内側の()が先に評価される.
-->2^(1+2)
 ans  =
 
    8.
したがって,演算順序を明示したい場合も() を利用すればよい.
-->(2+3)*5
 ans  =
 
    25.


4.9 行列

Scilabは複数のデータの集りをひとつの行列(あるいは配列)として扱うことが できる.2次元行列を例に行列の定義と操作方法を述べる.ベクトルは2次元行列の 特別な場合として容易に理解できる.2次元以上の多次元行列も利用できるが, 説明は省略する.

行列の定義は[で始まり,]で終る. 各行の要素はカンマ(または空白)により分けられる. また,セミコロンと改行は行の終りを示す.

つぎの行列

$\displaystyle A= \begin{bmatrix}1&2&3\cr 4&5&6\cr 7&8&9 \end{bmatrix}$ (1)

-->A=[1,2,3;4,5,6;7,8,9] 
 A  =
 
!   1.    2.    3. !
!   4.    5.    6. !
!   7.    8.    9. !
あるいは
-->A=[1 2 3
-->4 5 6
-->7 8 9]
 A  =
 
!   1.    2.    3. !
!   4.    5.    6. !
!   7.    8.    9. !
で定義できる.

空白文字に関する注意

空白文字は行列要素の区切りに用いることができるが, 以下の例のような空白の位置により行列要素の区切りとなる場合と ならない場合があるので注意が必要である.曖昧性を避けたければ区切り文字とし てコンマを利用すればよい.
-->v=[1 +3]
 v  =
 
!   1.    3. !
 
-->w=[1 + 3]
 w  =
 
!   1.    3. !
 
-->w=[1+ 3] 
 w  =
 
    4. 
 
-->u=[1, + 8- 7]
 u  =
 
!   1.    1. !

4.9.1 行列要素の指定

行列 $ A$$ (m,n)$ 要素は,A(m,n) で指定することができる.

-->A(1,2)
 ans  =
 
    2.

行や列にm:nを指定すると$ m$ 番目の行(列)から$ n$ 番目の行(列)の範 囲を指定することになる.たとえば,A の2列の1行と2行の取り出 すには

-->A(1:2,2)
 ans  =
 
!   2. !
!   5. !
とする.同様に,2行の2列と2列は
-->A(2,2:3)
 ans  =
 
!   5.    6. !
で取り出せる.

コロンだけを行あるいは列の指定に用いた場合,全ての行あるいは全ての列を 指定することになる. A の1列と2行を指定するには,それぞれ

-->A(:,1)
 ans  =
 
!   1. !
!   4. !
!   7. !
 
-->A(2,:)
 ans  =
 
!   4.    5.    6. !
とすればよい.

$ は行列の最後の要素を示す特殊記号である. したがって,A($)は,つぎのように行列 Aの最後の要素となる.

     -->disp(A($))
         9.

初期値$ x$,最終値$ y$で一定値$ d$毎に要素が変化するベクトルは, x:d:y で定義できる.

--> v=5:-.5:3
 v         =
 
!   5.    4.5    4.    3.5    3. !
なお,増分$ d$ の定義がないときの増加単位は1である.


4.9.2 行列の大きさと要素数

size(A) は行列 A のサイズを求める.
-->size(A)
 ans  =

!   3.    3. !
size(A,'r')size(A,'c')はそれぞれ 行列 A の行数,列数を返す.

一方,length(A) は行列 A の要素数を与える.

-->length(A)
 ans  =

    9.
size(A,'*')も同様に行列 A の要素数を与える.


4.9.3 行列の転置,複素共役

行列 A が実数値行列のとき,A' は行列 A の転置行列を与える. 行列 A が複素行列の場合は,A' は行列 A の複素共役転置行列を与 える.複素行列Aの複素共役はconj(A)で,転置はA.'で求 めることができる.以下に例を与える.
-->z=[1+%i,1-%i]
 z  =
 
!   1. + i      1. - i   !
 
-->z'
 ans  =
 
!   1. - i   !
!   1. + i   !
 
-->conj(z)
 ans  =
 
!   1. - i      1. + i   !
 
-->z.'    
 ans  =
 
!   1. + i   !
!   1. - i   !

4.9.4 ブロック行列による定義

複数のベクトルや行列からひとつの行列を定義することもできる.

$\displaystyle X=
\begin{bmatrix}
1&2\cr 3&4
\end{bmatrix},
y=
\begin{bmatrix}
5&6
\end{bmatrix}, z=10
$

から

$\displaystyle B=
\begin{bmatrix}
X&y'\cr y&z
\end{bmatrix}$

を作成するには
-->X=[1,2;3,4];y=[5,6];z=10;
-->B=[X,y';y,z]
 B  =

!   1.    2.    5.  !
!   3.    4.    6.  !
!   5.    6.    10. !
とすれば良い.


4.9.5 行列のサイズの変更

$ mn$ 要素を持つ行列 $ A$$ m\times n$行列に変更するには matrix(A,m,n) とする.サイズの変更は列をスタックした $ mn \times 1$ベクトルの $ m$ 要素毎が変更後の行列の列となる.

つぎの例は行列 B の1行と2行からなる$ 2\times3$ 行列C を 作成し,行列Cのサイズを$ 3\times2$に変換した行列Dを求めている.

-->C=B(1:2,:)
 C  =

!   1.    2.    5. !
!   3.    4.    6. !

-->D=matrix(C,3,2)
 D  =

!   1.    4. !
!   3.    5. !
!   2.    6. !

行列の行や列を消去しサイズを小さくするには空行列 [] を用いればよい.たとえば行列 B の2行を消去 するには

-->B(2,:)=[]
 B  =
 
!   1.    2.    5.  !
!   5.    6.    10. !
とする.

4.9.6 組込関数による行列の生成

ones にベクトルの引数を与えるとそれと同じ次元で要素が全て1の行列が 作成される.一方,zeros にベクトルの引数を与えるとそれと同じ次元で要素が全て0の行列が 作成される.

--> ones(1:4)
 ans       =
 
!   1.    1.    1.    1. !
 
-->zeros(1:5)
 ans  =
 
!   0.    0.    0.    0.    0. !
onesあるいはzerosの引数が行列の場合, その行列と同じサイズで要素が 1 あるいは 0 の行列が求まる.
--> v=[1 5 6]
 v         =
 
!   1.    5.    6. !
 
--> ones(v)
 ans       =
 
!   1.    1.    1. !
 
--> ones(v')
 ans       =
 
!   1. !
!   1. !
!   1. !
 
-->zeros(v)
 ans  =
 
!   0.    0.    0. !

eyeは引数が ベクトルのとき引数と同じ次元の単位行列を, 引数が行列のときその行列と同じ次元の単位行列を求める.

-->eye(2,2)
 ans  =
 
!   1.    0. !
!   0.    1. !
 
-->eye(ones(2,2))
 ans  =
 
!   1.    0. !
!   0.    1. !

diagは引数がベクトルの場合, 引数ベクトルを対角に持つ対角行列が生成する.引数が行列の場合, 引数行列の対角成分を抜き出す.

-->diag([1,2])  
 ans  =
 
!   1.    0. !
!   0.    2. !

-->A=[1,2,3;4,5,6;7,8,9];diag(A)
 ans  =
 
!   1. !
!   5. !
!   9. !

4.9.7 GUI による行列値設定

Scilab では定義済みの行列などの値をGUIで設定することができる. (行列のサイズは変更できない.) たとえば行列 B の値を設定したい場合 editvarを用いて
-->editvar B
 
 Please wait...
とすると,図 5のGUIエディタ Edit Var が起動する. 一番左の数字は行番号,一番上の数字が列番号を示している. 修正したい要素へマウスあるいはカーソルキーで移動し値を代入したのち, Update to Scilab をクリックすると修正が終了する. Quit をクリックするとVariable Browserが終了する.
図 5: Edit Var
\scalebox{0.6}{\includegraphics{picture/editvar}}

4.10 変数の一覧と消去

利用している変数の一覧は whoで調べることが できる.つぎのように,定義済みのユーザ変数は who_userにより一覧が出力される.
-->who_user 
 User variables are:
 
 B         z         y         X         a         help      editvar
 browsevar           startup_path        modelica_libs
 
 using 2180 elements out of 4984500

clear 変数の並びとすると 変数が消去される.

-->clear a z
 
-->who_user 
 User variables are:
 
 B         y         X         help      editvar   browsevar
 startup_path        modelica_libs
 
 using 2166 elements out of 4984504

注意:変数の並びを省略し単にclear とすると全ての ユーザ変数が消去されるので注意すること.

ユーザ変数の一覧は GUI のVariable Browser でも見ることができる. browsevarを用いて

-->browsevar()
 
--> 
 Please wait...
とすると,図 6の Variable Browser が起動する. 変数を選択し左下のアイコンの一番左をクリックすると Edit Var が起動する. 左から2番目のアイコンを指定すると変数が消去される. 左から3番目のアイコンは Scilabシェルと同期するために使用する. 左から4番目のアイコンは,Variable Browser の動作を規定するオプションを 指定できる.
図 6: Variable Browser
\scalebox{0.6}{\includegraphics{picture/browsevar}}

4.11 変数のセーブとロード

Scilab の変数をファイルにセーブしておくと,作業を中断しScilab を終了した後, ファイルの内容をロードすることで作業を再開することができる.

変数のセーブはsaveを用いて

  save('ファイル名')
とする.このとき指定したファイルに変数がセーブされる. 特定の変数だけをセーブしたい場合は
  save('ファイル名',変数1,...,変数N)
とする.

一方,変数のロードはloadにより, つぎのように行う.

  load('ファイル名')
ファイルにある特定の変数だけをロードしたい場合は
  load('ファイル名','変数1',...,'変数N')
とする.save と異なり変数をクォーテーションで囲まなければならない.

以下にセーブとロードのプログラム例を与える.

-->clear 
 
-->a=eye(2,2);b=ones(a);
 
-->who_user
 User variables are:
 
 b         a
 
 using 12 elements out of 4992788
 
-->save('val.dat',a,b);
 
-->clear a b
 
-->who_user
 
-->load('val.dat','a','b');
 
-->who_user
 User variables are:
 
 b         a
 
 using 12 elements out of 4992788

4.12 セッション記録

Scilab のセッション,複数のコマンド実行とそれら結果,を テキストファイルに記録することができる. このセッション記録は後の作業,データ編集やプログラミング等,に利用する ことができる.

セッション記録はdiaryを用いて 以下の書式で行うことができる.

  diary('ファイル名')
セッション記録を中断するには
  diary(0)
を入力する.


4.13 行列の演算

本節では数値行列の演算について述べる. 演算に用いる行列,演算子,関数は,(ふたつの行列の和であれば,ふたつの 行列が同じサイズであるなど),当然,数式として意味があるものでなければ ならない.


4.13.1 四則演算

加算,減算,乗算はスカラー変数と同様に,それぞれ演算子+, -, * で求まる.

行列 $ A$ の逆行列が存在するとき $ A^{-1}B$A\B で, $ BA^{-1}$A/B で求めることができる. つぎの例は

$\displaystyle A= \begin{bmatrix}1 & 2\\ 3 &4 \end{bmatrix} , B= \begin{bmatrix}5 & 6\\ 7 &8 \end{bmatrix}$ (2)

に対し,$ A^{-1}B$$ BA^{-1}$を計算している.
-->A=[1 2;3 4];B=[5 6;7 8];
 
-->A\B
 ans  =
 
! - 3.  - 4. !
!   4.    5. !
 
-->A/B
 ans  =
 
!   3.  - 2. !
!   2.  - 1. !
行列 $ A$ の逆行列が存在せず $ b$ がベクトルのとき A/b$ b-Ac$ の距離が最小となる$ c$,つまり, 線形方程式 $ Ac=b$ の最小二乗解

$\displaystyle c=\arg \min_{c} \vert\vert b-Ac\vert\vert^2
$

を与える. ただし,$ \vert\vert v\vert\vert$ はベクトルの2ノルム $ \vert\vert v\vert\vert=\sqrt{v'*v}$を示す.


4.13.2 スカラー倍

行列のスカラー倍はつぎのようにできる.

-->2*A
 ans  =
 
!   2.    4. !
!   6.    8. !


4.13.3 冪乗

行列の羃乗は ^ を利用する.

-->A^2    
 ans  =
 
!   7.     10. !
!   15.    22. !


4.13.4 ランク,行列式,トレース

行列のランク,行列式,トレースは,それぞれ rankdettraceで求めることができる.
-->rank(A)
 ans  =
 
    2.  
 
-->det(A) 
 ans  =
 
  - 2.  
 
-->trace(A)
 ans  =
 
    5.


4.13.5 逆行列,固有値,固有値分解

つぎの正方行列

$\displaystyle A=
\begin{bmatrix}
1& 2\\ 3 &4
\end{bmatrix}$

を考える.

以下のようにinvを用いて行列の逆行列を求める ことができる.

-->A=[1 2;3 4]; 
 
-->inv(A)
 ans  =
 
! - 2.     1.  !
!   1.5  - 0.5 !
当然
-->inv(A)*A
 ans  =
 
!   1.    0. !
!   0.    1. !
が成り立つ.

specで正方行列の固有値計算と固有値分解を 行うことができる.デフォルトでspecは行列の固有値を与える.

-->spec(A)
 ans  =
 
!   5.3722813 !
! - 0.3722813 !
行列 $ A$ が,固有ベクトルからなる行列$ V$と対応する固有値を対角成分に持 つ対角行列$ D$により

$\displaystyle A=V D V^{-1}
$

と固有値分解できるとする. つぎのように,specの戻り値をふたつ指定すると,前者に固有ベクトル からなる行列が後者に固有値を対角成分に持つ対角行列が返される.
-->A=[1 2;3 4]; 
 
-->[V,D]=spec(A)
 D  =
 
!   5.3722813    0         !
!   0          - 0.3722813 !
 V  =
 
!   0.4159736  - 0.8245648 !
!   0.9093767    0.5657675 !
 
-->V*D/V        
 ans  =
 
!   1.    2. !
!   3.    4. !

4.13.6 その他の基本演算

これまで紹介した数値行列に対する演算とその他の基本演算を表 3をまとめる.なお,表 3以外にも多くの演 算関数が準備されているので,ヘルプを参照すること.

表 3: 行列演算
コマンド 意味
+ 加算
- 減算
* 乗算
\ 左からの除算
/ 右からの除算
^ 羃乗
rank ランク
det 行列式
trace トレース
cond 条件数
inv 逆行列
spec 固有値と固有ベクトル
svd 特異値分解
sum 要素の和
sort 要素のソート
max 要素の最大値
min 要素の最小値



4.13.7 行列の指数,三角関数,対数

正方行列 $ A$の指数は

$\displaystyle e^{A}=I+A+\frac{1}{2}A^2+\cdots
$

で定義される. また,$ A$の対数$ X=\log A$

$\displaystyle e^{X}=A
$

を満す行列として定義される.

行列の指数を用いて正方行列 $ A$の三角関数は

$\displaystyle \cos(A)=\frac{1}{2}
\left(
e^{jA}+e^{-jA}
\right)
$

$\displaystyle \sin(A)=\frac{1}{2}
\left(
e^{jA}-e^{-jA}
\right)
$

で定義される.

これらの演算は, expmlogmcosmsinmで計算することができる.

つぎの例は正方行列

$\displaystyle P=
\begin{bmatrix}
2& 1\\ 1 &2
\end{bmatrix}$

$ e^P$$ \log(P)$$ \cos(A)$$ \sin(A)$を計算している.
-->P=[2 1;1 2]; 
 
-->expm(P)      
 ans  =
 
!   11.401909    8.6836275 !
!   8.6836275    11.401909 !
 
-->logm(expm(P))
 ans  =
 
!   2.    1. !
!   1.    2. !
 
-->cosm(P)
 ans  =
 
! - 0.2248451  - 0.7651474 !
! - 0.7651474  - 0.2248451 !
 
-->sinm(P) 
 ans  =
 
!   0.4912955  - 0.3501755 !
! - 0.3501755    0.4912955 !


4.13.8 要素ごとの演算

行列 $ A$$ B$が同じサイズのとき要素毎の掛け算を

$\displaystyle C(m,n)=A(m,n)*B(m,n)
$

要素毎の左からと右からの割り算を

$\displaystyle C(m,n)=B(m,n)/A(m,n)$ (3)

$\displaystyle C(m,n)=A(m,n)/B(m,n)$ (4)

で定義する. 以下のように,これらの計算は演算子 .*.\./で行な うことができる.
-->A=[1 2;3 4];B=[5 6;7 8];
 
-->A.*B
 ans  =
 
!   5.     12. !
!   21.    32. !
 
-->A.\B
 ans  =
 
!   5.           3. !
!   2.3333333    2. !
 
-->A./B
 ans  =
 
!   0.2          0.3333333 !
!   0.4285714    0.5       !
同様に行列 $ A$ の要素毎の羃乗は演算子 .^で求めることができる. 表 2absceilfloorroundrealimagのようにスカラー値に定義される関数を行列に適用し た場合,要素毎の演算結果が得られる.


next up previous contents index
次へ: 5 プログラミング 上へ: Scilab 入門 戻る: 3 Scilab の使い方の基礎   目次   索引
SHUICHI OHNO 平成17年9月4日