Scilab 入門 - scilab 情報ブログ · PDF file目次 1 Scilab とは 3 2 Scilab...
Transcript of Scilab 入門 - scilab 情報ブログ · PDF file目次 1 Scilab とは 3 2 Scilab...
Scilab 入門
大野修一
1995年 9月 4日
1
目 次
1 Scilab とは 3
2 Scilab のインストール 4
3 Scilab の使い方の基礎 5
3.1 メニューバー . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.1.1 Demos . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.1.2 Help Browser . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 コマンド行の編集と実行 . . . . . . . . . . . . . . . . . . . . . 93.3 Scilab の終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4 プログラミングの基礎 11
4.1 簡単なプログラミングの例 . . . . . . . . . . . . . . . . . . . . 114.2 コメント行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.3 継続行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.4 変数名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.5 特殊変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.6 数値表示の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . 134.7 複素数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.8 基本算術演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.9 行列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.9.1 行列要素の指定 . . . . . . . . . . . . . . . . . . . . . . 164.9.2 行列の大きさと要素数 . . . . . . . . . . . . . . . . . . 174.9.3 行列の転置,複素共役 . . . . . . . . . . . . . . . . . . 184.9.4 ブロック行列による定義 . . . . . . . . . . . . . . . . . 194.9.5 行列のサイズの変更 . . . . . . . . . . . . . . . . . . . 194.9.6 組込関数による行列の生成 . . . . . . . . . . . . . . . . 204.9.7 GUI による行列値設定 . . . . . . . . . . . . . . . . . . 22
4.10 変数の一覧と消去 . . . . . . . . . . . . . . . . . . . . . . . . . 224.11 変数のセーブとロード . . . . . . . . . . . . . . . . . . . . . . 234.12 セッション記録 . . . . . . . . . . . . . . . . . . . . . . . . . . 254.13 行列の演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.13.1 四則演算 . . . . . . . . . . . . . . . . . . . . . . . . . . 254.13.2 スカラー倍 . . . . . . . . . . . . . . . . . . . . . . . . 264.13.3 冪乗 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.13.4 ランク,行列式,トレース . . . . . . . . . . . . . . . . 264.13.5 逆行列,固有値,固有値分解 . . . . . . . . . . . . . . 274.13.6 その他の基本演算 . . . . . . . . . . . . . . . . . . . . . 284.13.7 行列の指数,三角関数,対数 . . . . . . . . . . . . . . 28
2
4.13.8 要素ごとの演算 . . . . . . . . . . . . . . . . . . . . . . 30
5 プログラミング 32
5.1 比較演算子と論理演算子 . . . . . . . . . . . . . . . . . . . . . 325.2 条件文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.2.1 if-then-else文 . . . . . . . . . . . . . . . . . . . . . . . 345.2.2 select-case文 . . . . . . . . . . . . . . . . . . . . . . . 35
5.3 ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.1 for ループ . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.2 while ループ . . . . . . . . . . . . . . . . . . . . . . . 375.3.3 breakと continue . . . . . . . . . . . . . . . . . . . . . 38
5.4 deff による関数定義 . . . . . . . . . . . . . . . . . . . . . . . 39
6 グラフィックス 41
6.1 二次元プロット . . . . . . . . . . . . . . . . . . . . . . . . . . 416.1.1 LineSpec . . . . . . . . . . . . . . . . . . . . . . . . . 426.1.2 タイトルと凡例 . . . . . . . . . . . . . . . . . . . . . . 436.1.3 GUIグラフィックエディタ . . . . . . . . . . . . . . . . 476.1.4 図の出力 . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7 関数 52
7.1 関数の構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527.2 SciPad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527.3 関数のロード . . . . . . . . . . . . . . . . . . . . . . . . . . . 537.4 グローバル変数とローカル変数 . . . . . . . . . . . . . . . . . 55
8 多項式と有理式 57
8.1 多項式の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . 578.2 多項式の根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588.3 多項式の演算と有理式 . . . . . . . . . . . . . . . . . . . . . . 588.4 有理式の微分 . . . . . . . . . . . . . . . . . . . . . . . . . . . 598.5 多項式と有理式の評価 . . . . . . . . . . . . . . . . . . . . . . 608.6 部分分数展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.7 多項式行列と有理式行列 . . . . . . . . . . . . . . . . . . . . . 618.8 多項式関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
9 線形システム 62
9.1 線形システムの定義 . . . . . . . . . . . . . . . . . . . . . . . 629.1.1 多項式による線形システムの定義 . . . . . . . . . . . . 629.1.2 状態空間表現によるシステムの定義 . . . . . . . . . . . 639.1.3 システム表現の変換 . . . . . . . . . . . . . . . . . . . 64
3
9.2 線形システムの極ゼロ点表示 . . . . . . . . . . . . . . . . . . . 669.3 線形システムの接続 . . . . . . . . . . . . . . . . . . . . . . . 669.4 線形システムの時間応答 . . . . . . . . . . . . . . . . . . . . . 679.5 ボード線図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4
1 Scilab とは
Scilab[1]はフランスの国立研究機関 INRIA(Institut nationale de Rechercheen Informatique et en Automatique)[2]とENPC (Ecole nationale des pontset chaussees)[3] でシステム制御や信号処理向けに開発された数値計算ソフトウェアである.現在は,高機能数値計算ソフトウェアを目指し Scilab Consor-tium が開発を行っている.Scilab はオープンソースでありライセンスにのっとれば自由に配布できる.Scilabは有用な数値計算アルゴリズムの多くを実装しており,それらを組合せることで複雑な計算が可能である.また,プロ
グラミング環境も提供されており,ユーザが独自の数値計算プログラムを作
成することができる.
5
2 Scilab のインストール
Scilab Consortium のWeb サイト http://scilabsoft.inria.fr/ から,
各種プラットホーム用のバイナリファイルとソースファイルをダウンロード
できる.バイナリファイルであれば上記 Web サイトの指示に従えば簡単にインストールできる.
6
3 Scilab の使い方の基礎
筆者は主に Linux を使用しているので, Linux 上の Scilab を用いて説明する.Windows 上の Scilab もほぼ同様である.なお,数式と Scilabのコマンドを区別するため,数式はローマン体で, Scilab コマンドをタイプライタ体で記述する.(たとえば,数式 A + B,コマンド A+B.)プログラムメニュー に Scilabが登録されていればそれを指定することで
Scilab が起動する.また,kterm などの端末で scilab とタイプすると (パスが適切に設定されていれば)Scilab が起動する (図 1).
図 1: Scilab 起動画面
3.1 メニューバー
上部にあるメニューバーの概要はつぎのとおりである.
• File
– File Operations: 関数やデータをロードしたり,スクリプトファイルを実行
– Kill: Scilabシェルスクリプトを中断
– Quit: Scilabを終了
• Control
– Resume: 休止状態 pauseからの実行の再開
7
– Abort: 一回(もしくは複数回)の pauseの後,実行を中断しトッ
プレベルのプロンプトに復帰
– Stop: 実行を中断し pauseモードに入る
• Demos: 対話型としてデモを実行
• Graphic Window : アクティブなグラフィックウィンドウを選択
• Help
– Help Brouser : Help Brouser の起動
– Apropos : キーワード検索後の Help Brouser の起動
– Configure : Help Brouser の選択
• Editor : Editor SciPad の起動 (日本語は使用できない)
図 2: Demos 選択画面
3.1.1 Demos
Scilab でどのようなことができるか Demos を選択し,デモンストレーションを見ることをお勧めする.Demos を選択すると図 2のようにデモの一覧が示される.項目をマウスで選択すると対応するデモが実行される.
8
3.1.2 Help Browser
Help Brouser を起動すると図 3のようにヘルプの一覧が示される.項目を選択するとその項目に関する一覧が表示される.また,左上の虫眼鏡のアイ
コンをクリックするとヘルプのなかから単語検索を行うことができる.図 4は単語 matrix で検索した結果を示している.
図 3: Help Browser
後述するようにコマンドラインからも Help Brouser を起動することができる.
注意:ヘルプの言語は英語かフランス語だけである.
注意:コマンドのプログラムが変更されているのにヘルプが書換えられてい
ないため,ヘルプの内容が古くなりコマンドがヘルプ通りに動作しないこと
がある.
9
図 4: Help Browser
10
3.2 コマンド行の編集と実行
図 1にある Scilab 起動後にでてくる-->が Scilab プロンプトである.プロンプトは入力待ちを意味している.プロンプトのあとにコマンドをタイプす
ることでコマンドを入力することができる.また,カットアンドペーストで
コマンドを入力することもでき,複数コマンドからなるスクリプトファイル
や関数を実行することもできる.
カーソルは方向指示キー (←↑↓→)や CONTROLキーを使って移動できる.
CONTROLキーによるカーソルの移動はUnix における標準エディタであるEmacsに準じている.以下,(Ctrl-<chr>は,CONTROLキーを押しながらキャラクタ<chr>を押すことを意味する).コマンド行の編集に利用できるキー割当てを以下にまとめる.
• Ctrl-p あるいは ↑ ひとつ前の実行済コマンド行を出す
• Ctrl-n あるいは ↓ 次のコマンド行を出す
• Ctrl-b あるいは ← 一文字前に移動する
• Ctrl-f あるいは → 一文字後に移動する
• Delete 前の文字を消す
• Ctrl-h 前の文字を消す
• Ctrl-d 一文字消す (カーソルで)
• Ctrl-a そのラインの先頭に移動する
• Ctrl-e そのラインの後尾に移動する
• Ctrl-k そのラインのカーソルがある位置より後ろを消す
• Ctrl-u 現在の行をキャンセルする
• Ctrl-y 一つ前に消した文を戻す
• !prev prevから始まる最後のコマンド行を呼び出す
• Ctrl-c Scilabを中断し改行後一時停止する.Control/stopボタンをクリックすることは Ctrl-cを入力することと同じである.
Cntrl のつぎの文字はその動作を意味する英単語の頭文字となっている.たとえば p は previous,n は next,b は backward, f は forward に対応している.
以前に実行したコマンドの一部を変更して実行する場合,Ctrl-p (↑) で以前に実行したコマンドを出し,それを修正すればよい.
11
コマンド行の終りにリターンキーを入力すると,入力したコマンドが実行
される.たとえば,コマンド行に help keyword と入力するとHelp Brouserが起動し keywordに関連する項目を調べることができる.
-->help control
なお,Scilab で利用できる言語は英語とフランス語だけである.通常,英語がデフォルトになっている.
3.3 Scilab の終了
メインメニューの File の quit を選択するか,コマンド行で
-->quit
と入力すると,Scilab が終了する.
12
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;
-->
変数の値を表示するときは変数名を入力する.
13
-->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に示す.
14
変数 意味
%i 虚数単位√−1
%pi 円周率 π = 3.1415927 · · ·%e ネピア数 (自然対数の底),e = 2.7182818 · · ·%eps 1 + %eps = 1となる最も大きい値
%inf 無限大
%nan 値なし
表 1: 特殊な変数
補足:数式では 1 + x = 1 であれば x = 0 であるが,計算機には誤差があるので 1+x=1となる xが存在する.この xの最大値%epsが計算機の計算精度
となる.
% で始まらない特殊変数に変数 ansがある.変数 ans は特別な変数で,つ
ぎのように値が代入されなかった直前の計算結果を記憶している.
-->1+2;
-->ans
ans =
3.
4.6 数値表示の変更
コマンド format を用いると数値表示の形式が変更ができる.ただ,Scilab3.0 ではヘルプマニュアルどおりに動作しない.
4.7 複素数
複素数を定義するには %iを用いる.j を数式における虚数単位とする.変
数 a に 3 + 2j を代入するには
-->a=3 + 2*%i
a =
3. + 2.i
とすればよい.
15
4.8 基本算術演算
スカラー変数の基本的な算術演算を表 2にまとめる.(表 2以外にも多くの算術演算が提供されている.) 三角関数の角度の単位はラジアンである.abs
数式 コマンド
a + b a+b
a− b a-b
ab a*b
a/b a/b
ab a^b
abs 絶対値
ceil 小数点以下切上げ
floor 小数点以下切捨て
round 四捨五入
real 実数部
imag 虚数部
sin sin
cos cos
tan tan
log 自然対数
表 2: 基本算術演算
ceil floor round real imag cos sin tan log
演算の評価順序は数式と同様である.
-->2+3*5
ans =
17.
通常の数式のように () を利用することで,式を組合せることができる.このときより内側の ()が先に評価される.
-->2^(1+2)
ans =
8.
したがって,演算順序を明示したい場合も () を利用すればよい.
-->(2+3)*5
16
ans =
25.
4.9 行列
Scilabは複数のデータの集りをひとつの行列 (あるいは配列)として扱うことができる.2次元行列を例に行列の定義と操作方法を述べる.ベクトルは 2次元行列の特別な場合として容易に理解できる.2次元以上の多次元行列も利用できるが,説明は省略する.
行列の定義は [で始まり,]で終る.各行の要素はカンマ(または空白)に
より分けられる.また,セミコロンと改行は行の終りを示す.
つぎの行列
A =
1 2 34 5 67 8 9
(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. !
で定義できる.
空白文字に関する注意
空白文字は行列要素の区切りに用いることができるが,以下の例のような
空白の位置により行列要素の区切りとなる場合とならない場合があるので注
17
意が必要である.曖昧性を避けたければ区切り文字としてコンマを利用すれ
ばよい.
-->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列は
18
-->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 =
19
! 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 !
20
4.9.4 ブロック行列による定義
複数のベクトルや行列からひとつの行列を定義することもできる.
X =
[1 23 4
], y =
[5 6
], z = 10
から
B =
[X y′
y z
]を作成するには
-->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× n行列に変更するには matrix(A,m,n) とす
る.サイズの変更は列をスタックしたmn× 1ベクトルの m 要素毎が変更後
の行列の列となる.
つぎの例は行列 B の 1行と 2行からなる 2× 3 行列 C を作成し,行列 Cの
サイズを 3× 2に変換した行列 Dを求めている.
-->C=B(1:2,:)
C =
! 1. 2. 5. !
! 3. 4. 6. !
-->D=matrix(C,3,2)
D =
! 1. 4. !
! 3. 5. !
! 2. 6. !
21
行列の行や列を消去しサイズを小さくするには空行列 [] を用いればよい.
たとえば行列 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’)
22
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. !
23
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
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 変数の並びとすると変数が消去される.
24
-->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
4.11 変数のセーブとロード
Scilab の変数をファイルにセーブしておくと,作業を中断し Scilab を終了した後,ファイルの内容をロードすることで作業を再開することができる.
25
変数のセーブは 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
26
4.12 セッション記録
Scilab のセッション,複数のコマンド実行とそれら結果,をテキストファイルに記録することができる.このセッション記録は後の作業,データ編集
やプログラミング等,に利用することができる.
セッション記録は diaryを用いて以下の書式で行うことができる.
diary(’ファイル名’)
セッション記録を中断するには
diary(0)
を入力する.
4.13 行列の演算
本節では数値行列の演算について述べる.演算に用いる行列,演算子,関
数は,(ふたつの行列の和であれば,ふたつの行列が同じサイズであるなど),当然,数式として意味があるものでなければならない.
4.13.1 四則演算
加算,減算,乗算はスカラー変数と同様に,それぞれ演算子+, -, * で求まる.
行列 A の逆行列が存在するとき A−1B は A\B で,BA−1 は A/B で求め
ることができる.つぎの例は
A =
[1 23 4
], B =
[5 67 8
](2)
に対し,A−1B と BA−1 を計算している.
-->A=[1 2;3 4];B=[5 6;7 8];
-->A\B
ans =
! - 3. - 4. !
! 4. 5. !
-->A/B
ans =
27
! 3. - 2. !
! 2. - 1. !
行列 A の逆行列が存在せず b がベクトルのとき A/b は b−Ac の距離が最小
となる c,つまり,線形方程式 Ac = b の最小二乗解
c = arg minc||b−Ac||2
を与える.ただし,||v|| はベクトルの 2ノルム ||v|| =√
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 ランク,行列式,トレース
行列のランク,行列式,トレースは,それぞれ rank,det,traceで求め
ることができる.
-->rank(A)
ans =
2.
28
-->det(A)
ans =
- 2.
-->trace(A)
ans =
5.
4.13.5 逆行列,固有値,固有値分解
つぎの正方行列
A =
[1 23 4
]を考える.
以下のように 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 !
29
行列 A が,固有ベクトルからなる行列 V と対応する固有値を対角成分に持
つ対角行列Dにより
A = V DV −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以外にも多くの演算関数が準備されているので,ヘルプを参照すること.
4.13.7 行列の指数,三角関数,対数
正方行列 Aの指数は
eA = I + A +12A2 + · · ·
で定義される.また,Aの対数X = log Aは
eX = A
30
コマンド 意味
+ 加算
- 減算
* 乗算
\ 左からの除算
/ 右からの除算
^ 羃乗
rank ランク
det 行列式
trace トレース
cond 条件数
inv 逆行列
spec 固有値と固有ベクトル
svd 特異値分解
sum 要素の和
sort 要素のソート
max 要素の最大値
min 要素の最小値
表 3: 行列演算
を満す行列として定義される.
行列の指数を用いて正方行列 Aの三角関数は
cos(A) =12
(ejA + e−jA
)sin(A) =
12
(ejA − e−jA
)で定義される.
これらの演算は,expm,logm,cosm,sinmで計算することができる.
つぎの例は正方行列
P =
[2 11 2
]の eP,log(P ),cos(A),sin(A)を計算している.
-->P=[2 1;1 2];
-->expm(P)
ans =
! 11.401909 8.6836275 !
31
! 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 が同じサイズのとき要素毎の掛け算を
C(m,n) = A(m,n) ∗B(m,n)
要素毎の左からと右からの割り算を
C(m,n) = B(m,n)/A(m,n) (3)
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. !
32
-->A.\B
ans =
! 5. 3. !
! 2.3333333 2. !
-->A./B
ans =
! 0.2 0.3333333 !
! 0.4285714 0.5 !
同様に行列 A の要素毎の羃乗は演算子 .^で求めることができる.表 2 のabs,ceil,floor,round,real,imagのようにスカラー値に定義される
関数を行列に適用した場合,要素毎の演算結果が得られる.
33
== 等しい
< より小さい
> より大きい
<= 以上
>= 以下
<> or ~= 等しくない
表 4: 比較演算子
& 論理積
| 論理和
~ 論理否定
表 5: 論理演算子
5 プログラミング
Scilabは条件文,場合分け,ループを含むプログラム環境を提供しており,ユーザは Scilabの関数などを用いてスクリプトや関数を作成し,実行することができる.本節では,Scilabのプログラミングにおける基本を説明する.
5.1 比較演算子と論理演算子
Scilabではデータオブジェクトの値の比較を行うための 5つの比較演算子を利用できる.表 4に比較演算子とその意味を示している.比較演算子は論理式を記述するために使われる.
一般に,論理式が成立するとき値を真 (True),成立しないとき偽 (False)とする.このように真偽の 2値をとる型を Boolean 型という.Scilab では真の値は %t, 偽の値は %fである.つぎのように,画面にはそれぞれ T ,F と表示される.
-->1 < 2
ans =
T
-->1 > 2
ans =
F
34
コマンドへの入力は%t(あるいは%T)と%f (あるいは%F)を用いる.
-->a=%t
a =
T
なお,%tと%fは数値としては 1 と 0 となる.
-->2*%t
ans =
2.
論理演算子,&,|,~を用いるとより複雑な論理式を書くことができる.&
は論理積であり a&b において aと bが T のときのみ T でそれ以外は Fとなる.|は論理和で a| b において aと bのいずれかが T とき Tで,両方 Fのとき Fとなる.~ は論理否定で, ~aにおいて a が T なら F,a が F なら Tとなる (表 5).たとえば
-->(1 < 2) & (3 > 4)
ans =
F
-->(1 < 2) | (3 > 4)
ans =
T
となる.
演算子の演算順序の決まりを優先順位という.比較演算子は論理演算子よ
り優先順位が高いので (1 < 2) & (3 > 4) は 1 < 2 & 3 > 4 と等価であ
る.しかし,曖昧性を避け () で演算順序を明示するほうがよい.^,*,/,\,+,-の算術演算子は,比較演算子,論理演算子より優先順位
が高く,算術演算子どおしの演算順序は数式と同じである.
つぎのように論理積は論理和より優先順位が高い.
-->1|1&0
ans =
T
(1&0 が先に評価され 0, つぎに 1|0 が評価され 0となる.)論理演算子のなかで,論理否定が最も高い優先順位を持つ.
35
-->~ 1 & 0
ans =
F
-->~ (1 & 0)
ans =
T
最も優先順位が低い演算子は変数に値を代入する代入演算子=である.表 6に主な演算子の優先順序を示す.
^ 高
*,/,\ ↑+,-
比較演算子
~
&
| ↓= 低
表 6: 優先順位
5.2 条件文
Scilabには二つの形式の条件文,if-then-elseと select-caseが存在する.
5.2.1 if-then-else文
if-then-elseは 3つ書式を持つ.つぎの書式の場合,式を評価し,もし真なら thenと endの間のコマンド
を実行する.
if 式 then
コマンド
end
なお,コマンドは複数行であってもよい.
つぎの書式であれば,式が真であれば thenと elseの間のコマンドを実行
し,偽なら elseと endの間のコマンドを実行する.
36
if 式 then
コマンド
else
コマンド
end
つぎの書式は elseif以外は上の書式と同じである.elseifの後にある式を
評価し,もし真ならつぎの elseif(または else)までのコマンドを実行する.
if 式 then
コマンド
elseif 式 then
コマンド
elseif 式 then
コマンド
:
else
コマンド
end
以下に if 文のプログラム例を与える.
--> x=1;
--> if x>0 then,y=-x,else,y=x,end
y =
- 1.
--> x=-1;
--> if x>0 then,y=-x,else,y=x,end
y =
- 1.
5.2.2 select-case文
select-case文はつぎの書式を持つ.
switch 式
case 値
コマンド
case 値
37
コマンド
else
コマンド
end
式を case の後ろにある値と比較し,等しくなる最初の場合の命令を実行する.どの条件にも当てはまらない場合は else以下の命令を実行する.
つぎのプログラムは変数 nの値を用いて処理の場合分けを行っている.
-->n=round(2*rand(1,1));
-->select n
-->case 0 then
-->result=’win’;
-->case 1 then
-->result=’draw’;
-->else
-->result=’loss’;
-->end
-->result
result =
draw
ここで,randは 0から1までの一様変数を発生するので,n=round(2*rand(1,1))は約 1/4 の確率で 0または 2,約 1/2 の確率で 1 となる.
5.3 ループ
Scilabでは二つのタイプのループ (繰り返し),forループと whileループ
が利用できる.
5.3.1 for ループ
forループはつぎの書式を持つ.
for 制御変数 = 制御変数に値を代入するベクトル do
コマンド
end
38
ただし,doは省略できる.
forループは,ベクトルのはじめ要素を制御変数に代入し,doから endま
でのコマンドを実行する.つぎに,ベクトルの 2番目の要素を制御変数に代入し,doから endまでのコマンドを実行する.この操作をベクトルの値の最
後の要素まで繰り返す.したがって,(ループを途中で抜けない限り)繰り返しの回数は length(制御変数に値を代入するベクトル) となる.
以下に forループの例を挙げる.
--> x=1;for k=1:4,x=x*k,end
x =
1.
x =
2.
x =
6.
x =
24.
5.3.2 while ループ
whileループは以下の書式を持ち条件式を満たす限り doから endの間の
コマンドを繰り返し実行する.
while 条件式 do
コマンド
end
なお,doは省略可能である.
つぎの例は x<14 が成り立つ限り x=2*x の計算を繰り返している.
--> x=1; while x<14,x=2*x,end
x =
2.
x =
4.
x =
39
8.
x =
16.
5.3.3 breakと continue
forループや whileループからは breakコマンドで抜け出せる.通常,if文を利用しある条件が成立した場合ループを抜けることが多い.
以下の例ではループのなかの if文が成立したときループを終了している.
-->a=0;for i=1:5:100,a=a+1;if i > 10 then break,end; end
-->a
a =
3.
複数のループがあるとき break は一番外側のループから抜け,一番外側の
ループのつぎに制御を移す.
一方,continueは continue以降のループ内のコマンドをスキップしその
ループの始めに制御を戻す.つぎの例ではループのなかの条件式が成立した
とき,k の表示をスキップしループの始めに実行が移している.
-->for k=1:10;if k>2&k<=8 then disp(’hello’),continue,end,k,end
k =
1.
k =
2.
hello
hello
hello
hello
40
hello
hello
k =
9.
k =
10.
5.4 deff による関数定義
Scilab では deff を用いてユーザが関数をオンライン定義できる.deffの
書式はつぎのとおりである.
deff(’[出力変数の並び]=関数名 (入力変数の並び)’,’コマンド’)
複数行コマンドを書きたい場合は
deff(’[出力変数の並び]=関数名 (入力変数の並び)’,[’コマンド’;’コ
マンド’])
のように,複数の ’コマンド’(文字列)からなる行列 (配列)を使用する.たとえば y = x2 はつぎのように定義できる.
-->deff(’y=mysquared(x)’,’y=x^2’)
つぎのように,deffを用いて作成した関数は Scilab 標準関数と同様に利用することができる.
-->mysquared(1:5)
ans =
! 1. 4. 9. 16. 25. !
複素数 z を極座標 (r, θ)(z = rejθ)に変換する関数
-->deff(’[r,t]=mypolar(z)’,[’r=abs(z)’;’t=atan(real(z)/imag(z))’])
を定義すると,つぎのように実行できる.
-->[r,t]=mypolar(1+%i)
t =
41
0.7853982
r =
1.4142136
deff は比較的短い行数の関数を定義するのに便利である.長い行数の関数
は,通常,ファイルに記述する.ファイルを用いた関数義は 7 節で述べる.
42
6 グラフィックス
Scilabは作図のため数多くのコマンドがあり,そのため使いづらい面もあった.Scilab 3.1 以降では matlab R©の作図コマンドと似たコマンドが導入されるとともに GUI で図を編集できることになり,より使い易い環境を提供している.ここでは,二次元プロット用の関数 plot を中心に説明を行う.
6.1 二次元プロット
plotで基本的な二次元の図を作成することができる.plotの書式は
plot(y,<LineSpec>,<GlobalProperty>)
plot(x,y,<LineSpec>,<GlobalProperty>)
plot(x1,y1,<LineSpec1>,xN,yN,<LineSpecN>,<GlobalProperty1>,..<GlobalPropertyN>)
である.<LineSpec>,<GlobalProperty> はオプションである.x,y ともに実数ベクトルあるいは実数行列である.
y がベクトル (行列)のとき plot(y) は 1:size(y,’*’) に対する y の (各列ベクトルの)値をプロットする.
-->y=0:2:10;
-->plot(y);
とすれば図 7が描画される.
0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.00
1
2
3
4
5
6
7
8
9
10
図 7:
43
作図した図を clfで消去しなければ,次の図が上書きされる.
-->clf()
図 8は以下を実行した結果を示している.
-->plot(eye(3,3))
0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.00.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
図 8:
x と y がベクトル (行列)のとき x の (列の)要素に対応する y の (列の)要素をプロットする.このとき x と yは同じ行数を持っていなければならない.図 9はつぎを実行して得られた図である.
-->x=[0:0.1:2*%pi]’;
-->clf()
-->plot(x,sin(x))
6.1.1 LineSpec
オプション LineSpecによりプロットの線の種類,色,マークの形状を指定することができる.表 7,表 8,表 9 にそれぞれの識別子をまとめている.指定したい 3つの識別子を組合せ,クォーテーションでまとめる.なお,識別子の順序は任意である.つぎのように ’--r*’ とすれば,赤い破線で*つきの
グラフとなる (図 10).
44
0 1 2 3 4 5 6 7−1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
図 9:
識別子 線の種類
-
-- 破線
: 点線
-. 破点線
表 7: 線の種類
-->clf()
-->plot(x,sin(x),’--ro’)
6.1.2 タイトルと凡例
xtitle
xtitle(’図のタイトル’,’X 軸のタイトル’,’Y 軸のタイトル’)
とすることで,図のタイトル,X 軸のタイトル,Y 軸のタイトルを描くことができる.
凡例は legend
legend([’文字列 1’;...;’文字列 N’],位置)
45
識別子 色
r 赤
g 緑
b 青
c シアン
m マジェンタ
y 黄色
k 黒
w 白
表 8: 色の種類
で描くことができる.ここで n 番目の文字列は n 番目に描かれた曲線に対応
している.凡例の出力位置は 1から 5までの数字で指定する.表 10に数値と位置の対応関係を示している.
タイトルと凡例を付加するプログラム例を以下に示す.
-->clf();
-->t=0:%pi/20:2*%pi;
-->plot(t,sin(t),’ro-.’,t,cos(t),’b+’,t,abs(sin(t)),’--mo’);
-->xtitle(’Figure’,’Time’, ’Amplitude’);
-->legend([’sin(t)’;’cos(t)’;’|sin(t)|’],3);
46
識別子 形
+ +
o ◦* *
. .
x x
s �d ♦^ Mv O> B< Cp ?
表 9: マーカの種類
数値 位置
1 右上 (デフォルト)
2 左上
3 左下
4 右下
5 マウスで任意の位置を指定
表 10: 凡例の位置
47
0 1 2 3 4 5 6 7−1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
図 10:
Figure
Time
Amplitude
0 1 2 3 4 5 6 7−1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
sin(t)
cos(t)
|sin(t)|
図 11:
48
6.1.3 GUIグラフィックエディタ
グラフはオブジェクトとして構成されておりオブジェクトの各要素をコマ
ンドラインで指定することで,グラフの体裁を変更することができる.また,
Scilab 3.1 以降では,グラフの属性を GUIで修正・変更することができる.図 12のグラフィックウィンドウにおいて,Edit の Figure Properties を選択すると図 13のような画面が現われ,変更したい項目を選ぶことができる.
図 12:
この例では,Axes(2)を選択すると図 13のウィンドウが出てくる.X Axisでは,Label 名,Visibility (表示の有無),Color (色),Size (文字のサイズ),Font style 等が変更できる.
GUIグラフィックエディタを用いて図 11のタイトルを修正したものが図15である.
49
図 13:
50
図 14:
51
Figure
Time
Amplitude
0 1 2 3 4 5 6 7−1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
sin(t)
cos(t)
|sin(t)|
図 15:
52
6.1.4 図の出力
グラフィックウィンドウの Fileを選択すると,Clear,Select,Print,Export,Save,Load,Close の項目がある (図 16).Clear は図を消去するのに対し,Close はグラフィックウィンドウを閉じる.
Print は (プリンタが適切に設定されていれば)図をプリンタに出力する.Export は図を PostScript形式や Xfig 形式で出力する.Exportを選択すると図 16のようにウィンドウが出る.LATEXファイルに図を貼り付けたい場合は,Postscript-Latex を選択し,Type,Orientation,Fileneme を設定しOk を選択する.なお,出力されたファイルの拡張子は eps である.
Saveは図 (の作成手順)を Scilabの特殊形式のファイルにセーブする.セーブしたファイルを Load すると,セーブされた図が再描画される.
図 16:
53
7 関数
Deff により関数を定義できることは既に述べた.本節では,ファイルに関数を記述し,それを実行する方法を紹介する.条件分岐,ループ,Scilab標準関数等を用いた長い関数は,Deffよりファイルを利用したほうが都合がよい.ファイルはエディタを用いて作成する.Scilab にはエディタ SciPad が附属している.SciPadではなく他のエディタを利用してもよい.作成した関数は Scilab にロードすることで (関数に誤りがなければ) Scilab 標準関数と同じように使用することができる.
7.1 関数の構造
関数の構造は以下の形式に従わなければならない.
function [y1,...,yn]=foo(x1,...,xm)
.
.
.
endfunction
ここで fooは関数名で,x1,...xmは関数のm個の入力引数,y1,...ynは
関数からの n個の出力引数である.縦のドットは関数で実行されるコマンド
のリストを表している.出力引数がひとつの場合,は
function y=foo(x1,...,xm)
.
.
.
endfunction
と書ける.
7.2 SciPad
メインウィンドウの Editor を選択するか,コマンドラインで
-->scipad
と入力すると Scilab附属エディタ SciPad が起動する (図 17).つぎの k!を計算する関数を入力してみる.
54
図 17: SciPad
function [x]=fact(k)
k=int(k)
if k<1 then k=1,end
x=1;
for j=1:k,x=x*j;end
endfunction
SciPad のカーソル移動はコマンドラインの場合と同じである.プログラムを間違いなく入力できたらファイルにセーブする.メニューバー
の File の Save を選択するか Ctrl-s とするとファイルセーブの画面が現われる.ファイルの新規作成の場合,関数名と同じファイル名がデフォルトとな
る.ファイル名は関数名と同じである必要はないが,同じであるほうが間違
いが少なくなる.
ファイルの拡張子 sci が自動的に設定されている.Scilab 関数の拡張子はsci でなければならない.したがって,SciPad 以外のエディタを利用する場合,拡張子を sci にすることを忘れてはならない.図 18 に示すように SciPad は通常必要となるファイル操作機能を提供している.
7.3 関数のロード
作成した関数を Scilab で利用するには関数を Scilabにロードしなければならない.
55
図 18: SciPad
関数が fact.sciと言う名前のファイルにあるとする.この関数をロード
するには次のようにすればよい.
SciPad での関数のロードはメニューバーの Execute の Load into Scilabを指定するか,Ctrl-l とする.ファイルを変更しその変更を Scilab に反映するには,ファイルをセーブし再度関数をロードしなければならない.(同じ関数名を持つ関数をロードすると最新の関数が有効となる.)関数はコマンドラインからもロードできる.コマンドラインからのロード
は,主に,SciPad 以外のエディタを利用しているときに使用する.コマンドラインからのロードの書式は
exec(’ファイルへのパス/ファイル名.sci’,-1)
あるいは
getf(’ファイルへのパス/ファイル名.sci’)
である.ここでファイルが Scilabを起動したディレクトリにある場合や適切に設定された Scilab のパス変数に含まれるディレクトリにある場合は,ファイルへのパス/ は省略できる.
以下に関数のロード例を示す.ここで exists(’名前’) はその名前の変数
や関数が存在すれば 1,存在しなければ 0 を返す関数である.
--> exists(’fact’)
ans =
0.
56
--> exec(’../macros/fact.sci’,-1);
--> exists(’fact’)
ans =
1.
--> x=fact(5)
x =
120.
上の Scilabセッションのはじめのコマンド existsで factがないというこ
とがわかる.相対パス ../macros/ にあるファイル fact.sci が関数が exec
によりロードされる.つぎに,existsにより factがロードされていること
を確認し,関数 factを実行している.
7.4 グローバル変数とローカル変数
関数では関数を呼び出す環境と同じ変数名を持つ変数を定義することがで
きる.同じ変数名であっても,関数内の変数と関数を呼び出す環境の変数は
異なる実体を持つ.そのため,関数内の変数を変更しても関数を呼び出す環
境の変数は変化しない.
関数内で入力パラメータにない変数が定義されておらず,呼び出した環境
で同じ名前をもつ変数がある場合の値をとる.(resume を使用しない場合)関数内での変数の変更は呼び出した環境の変数を変更しないという意味でロー
カルを保つ.この特徴から,関数は入力や出力パラメータなしでも使用でき
る.例を用いてこの性質を説明する.
function [y1,y2]=f(x1,x2)
y1=x1+x2
y2=x1-x2
endfunction
この関数に入力引数,出力引数を与えると以下のようになる.
-->[y1,y2]=f(1,1)
y2 =
0.
y1 =
2.
57
関数の出力引数は 2個あるがそれを指定しない場合,はじめの引数のみが出力される.
-->f(1,1)
ans =
2.
入力引数をひとつだけ指定,呼出し環境で x2 が定義されていない場合つぎ
のようにエラーとなる.
-->f(1)
y1=x1+x2;
!--error 4
undefined variable : x2
at line 2 of function f
呼出し環境で x2 を定義すると以下のように実行できる.
-->x2=1;
-->[y1,y2]=f(1)
y2 =
0.
y1 =
2.
-->f(1)
ans =
2.
58
8 多項式と有理式
Scilabでは記号変数 (シンボル変数)を用いて多項式と有理式を定義できる.また,多項式と有理式の演算が可能である.
8.1 多項式の定義
多項式の定義は poly を使用する.polyによる多項式は,根による定義,
係数による定義,行列の特性方程式による定義がある.はじめのふたつの書
式は
poly(多項式の根からなるベクトル, ’記号変数’)
poly(多項式の係数からなるベクトル, ’記号変数’,’coeff’)
である.なお,多項式係数ベクトルは多項式の低次の係数から順に並べる.
記号変数を x とし,多項式 2− 3x + x2 = (x− 1)(x− 2) を定義してみよう.根が 1,2 であるので,根による多項式の定義は
-->p1=poly([1 2],’x’)
p1 =
2
2 - 3x + x
となる.一方,多項式の係数による定義は
-->p1=poly([2 -3 1],’x’,’coeff’)
p1 =
2
2 - 3x + x
である.
poly の引数が行列の場合の書式は
poly(行列, ’記号変数’)
である.このとき引数で与えた行列の記号変数に関する特性方程式を与える.
以下の例は特性方程式 |xI −A| を求めている.
-->A=[1 2;3 4]
A =
! 1. 2. !
59
! 3. 4. !
-->p2=poly(A,’x’)
ans =
2
- 2 - 5x + x
8.2 多項式の根
多項式の根は roots で計算できる.
-->roots(p1)
ans =
! 1. !
! 2. !
8.3 多項式の演算と有理式
記号変数を
-->x=poly(0,’x’)
で定義する.この定義以降は変数 x は記号変数として扱われる.記号変数と
通常の四則演算子を用いて多項式を定義することもできる.たとえば,多項
式 1 + 2x は
-->p3=1+2*x
p3 =
1 + 2x
で定義できる.
多項式と多項式の加算,減算,乗算,除算は通常の演算と同様に定義されて
いる.たとえば,つぎのように多項式を多項式で割ると有理式が定義できる.
-->q=p3/p1
q =
1 + 2x
----------
2
2 - 3x + x
60
このとき qは有理式 q = (1 + 2x)/(2− 3x + x2) となる.なお,つぎの例のように,有理式はデフォルトで約分される.
-->q=(x-1)/p1
q =
1
-----
- 2 + x
数式と違い計算機には数値誤差がある.この誤差のため様々な問題が発生す
る.たとえば有理式の分母の根が 1 で分子の根が 1.000001 のとき約分すべきであろうか.どの程度で同じであれば約分するのかは simpで定義できる.
詳細は simpペルプを参照すること.
有理式の分母は denomあるいは有理式名 (’den’) で取り出せる.
-->denom(q)
ans =
2
2 - 3x + x
-->q(’den’)
ans =
2
2 - 3x + x
有理式の分子は numerあるいは有理式名 (’num’) で取り出せる.
-->numer(q)
ans =
1 + 2x
-->q(’num’)
ans =
1 + 2x
8.4 有理式の微分
derivatは,多項式や有理式の導関数を返す.
61
-->derivat(q)
ans =
- 1
---------
2
4 - 4x + x
8.5 多項式と有理式の評価
hornerは,多項式や有理式に数値,あるいは,多項式・有理式,を代入し
た結果を求める.
-->horner(q,4)
ans =
1.5
-->horner(q,x-1)
ans =
1
-----
- 3 + x
-->horner(q,1/x-1)
ans =
x
-----
1 - 3x
8.6 部分分数展開
pfssは,有理式の部分分数展開を与える.ただし,結果は sの有理式とし
て表示される.
-->x=poly(0,’x’);
-->h=1/(x+1)/(x+2);
62
-->pfss(h)
ans =
ans(1)
1
-----
1 + s
ans(2)
- 1
-----
2 + s
8.7 多項式行列と有理式行列
行列の要素を多項式あるいは有理式で定義すると,多項式行列あるいは有
理式行列が定義できる.ほとんどの場合,多項式あるいは有理式と同様の演
算が可能である.
8.8 多項式関数
Scilabは多項式のための多くの関数を持っている.ペルプの項目Polynomial
Calculationsでそれらを調べることができる.
63
9 線形システム
Scilab では線形時不変システム (以下線形システム)が定義でき,線形システムの演算,評価,設計のための多くの関数が準備されている.本節では,
Scilabにおける線形システムの基本的操作を説明する.詳しくはペルプの項目 Generl System and Controlを参照すること.
9.1 線形システムの定義
線形システムは syslinを用いて定義する.
9.1.1 多項式による線形システムの定義
伝達関数を有理式で表現し線形システムを定義する.伝達関数が有理式 H
の線形システム S1は
S1=syslin(’文字’,H)
で定義される.ここで線形システムが連続時間システムの場合文字に cを,
離散時間システムの場合文字に dを代入する.c は continuous time の d は
discrete time の頭文字に対応している.つぎの伝達関数を持つ連続時間線形システムを考える.
H(s) =1 + 2s
2 + 3s + s2(5)
伝達関数は有理式なので
-->s=poly(0,’s’);
-->H=(1+2*s)/(2+3*s+s^2)
H =
1 + 2s
----------
2
2 + 3s + s
で伝達関数 Hを定義する.ここで Hは有理式であることに注意する.
伝達関数 Hを持つ連続時間線形システム S1は
-->S1=syslin(’c’,H)
S1 =
64
1 + 2s
----------
2
2 + 3s + s
で定義できる.
線形システムは syslin(’文字’,分子多項式,分母多項式)で定義することもできる.
-->syslin(’c’,1+2*s,2+3*s+s^2)
ans =
1 + 2s
----------
2
2 + 3s + s
有理式と同様に線形システムの分母多項式 (分子多項式) は denom(線形シ
ステム名)あるいは線形システム名 (’num’) (numer(線形システム名)ある
いは線形システム名 (’num’)) で取り出せる.
9.1.2 状態空間表現によるシステムの定義
syslin は,状態空間表現 (A, b, c, d) を用いて線形システムを定義することもできる.状態空間表現
A =
[0 1−1 −2
], b =
[01
], c =
[2 1
], d = 0 (6)
を持つ連続時間線形システムを考えよう.この連続時間線形システムは
-->A=[0 1;-1 -2];b=[0;1];c=[1,1];d=0;
-->S2=syslin(’c’,A,b,c,d)
S2(1) (state-space system:)
!lss A B C D X0 dt !
S2(2) = A matrix =
! 0. 1. !
! - 1. - 2. !
65
S2(3) = B matrix =
! 0. !
! 1. !
S2(4) = C matrix =
! 1. 1. !
S2(5) = D matrix =
0.
で定義できる.
状態空間表現で定義されたシステム S2 の (A, b, c, d)はコマンド abcd で
-->[A,b,c,d]=abcd(S2)
d =
0.
c =
! 2. 1. !
b =
! 0. !
! 1. !
A =
! 0. 1. !
! - 1. - 2. !
とすると取り出せる.また,S2.A,S2.B,S2.C,S2.D,あるいは,S2(’A’),
S2(’B’),S2(’C’),S2(’D’)とすると,それぞれ A, b, c,d の値を得るこ
とができる.
9.1.3 システム表現の変換
線形システムは伝達関数表現あるいは状態空間表現される.これらふたつ
の表現を互いに変換することができる.
66
tf2ss は,伝達関数表現された線形システムを状態空間表現の線形システ
ムに変換する.先に伝達関数表現で定義した S1 はつぎのように状態空間表
現の線形システムに変換できる.
-->tf2ss(S1)
ans =
ans(1) (state-space system:)
!lss A B C D X0 dt !
ans(2) = A matrix =
! - 2.8 - 0.6 !
! 2.4 - 0.2 !
ans(3) = B matrix =
! - 1.5491933 !
! 0.7745967 !
ans(4) = C matrix =
! - 1.2909944 - 1.923E-16 !
ans(5) = D matrix =
0.
ここで,伝達関数の次数は分子多項式の次数と等しいか,または大きくなけ
ればならない (つまり,プロパーでなければならない).一方,状態空間表現された線形システムから伝達関数表現の線形システム
は,ss2tf より求めることができる.状態空間表現で定義した S2 はつぎの
ように伝達関数表現の線形システムに変換できる.
-->ss2tf(S2)
ans =
2 + s
---------
67
2
1 + 2s + s
9.2 線形システムの極ゼロ点表示
ZerosΟ Poles×
transmission zeros and poles
real axis
imag. axis
−2.5 −2.0 −1.5 −1.0 −0.5 0.0 0.5 1.0 1.5−1.5
−1.0
−0.5
0.0
0.5
1.0
1.5
図 19: 極ゼロ点表示
plzr は線形システムの極 (分母多項式の根) とゼロ点 (分子多項式の根) を図示する.図 19は以下のコマンドを実行した結果得られた表示である.
plzr(S1)
ここで極は× でゼロ点 ◦ で示されている.(なお,バグのため左下に Pole とZeros が重なって表示されている.)
9.3 線形システムの接続
定義済みのふたつ以上の線形システムを,演算子 *で直列接続,演算子 +
で並列接続,演算子 /.でフィードバック接続することができる (図 20,図21,図 22).つぎの例は,線形システム S1 と S2を直列接続,並列接続,フィードバッ
ク接続した線形システムを求めている.(スペースを節約するため伝達関数表現で表示している.)
68
-->ss2tf(S1*S2)
ans =
2
1 + 2s - 2.293E-15s
-------------------
2 3
2 + 5s + 4s + s
-->ss2tf(S1+S2)
ans =
3
-----
2 + s
-->ss2tf(S1/.S2)
ans =
2
1 + 3s + 2s
---------------
2 3
3 + 7s + 4s + s
なお,上の 2.293E-15 は数値 2.293 · 10−15 であり計算誤差である.
- S1- S2
-
図 20: 直列接続 S1*S2
9.4 線形システムの時間応答
連続時間線形システムの時間応答は csim で計算できる.csimの書式はつ
ぎのとおりである.
[y [,x]]=csim(u,t,sl,[x0 [,tol]])
69
-
S1
S2
?
6e+ -
図 21: 並列接続 S1+S2
- e+ S1
S2
-
�
6
図 22: フィードバック接続 S1/.S2
引数 uは入力ベクトルあるいは文字列 ’impuls’ または ’step’,tは時間範囲
と時間ステップをあらわすベクトル,slがシステムである.文字列 ’impuls’あるいは ’step’を指定した場合,時間 t に対応する線形システムのインパル
ス応答あるいはステップ応答が求まる.x0と tolはオプションでそれぞれ状
態の初期値と誤差に関するベクトルである.戻り値 y が線形システムの出力
である.オプション xは状態ベクトルである.
線形システム S1 に対し.時間刻み 0.1 で時間 tが 0から 4までの,インパルス応答,ステップ応答をプロットするプログラムを以下に示す.
-->t=0:0.1:4;
-->plot(t,csim(’impuls’,t,S1),’ro-.’,t,csim(’step’,t,S1),’--bx’)
-->xtitle(’Response’,’Time’, ’Amplitude’);
-->legend([’impulse’;’step’],1);
つぎのプログラムは線形システム S1 の cos(t) に対する応答を求めプロットしている (図.
-->t=0:0.1:10;
-->u=cos(t);
-->y=csim(u,t,S1);
-->plot(t,y,’ro-.’,t,u,’--bx’)
-->xtitle(’Response’,’Time’, ’Amplitude’);
-->legend([’output’;’imput’],1);
70
Response
Time
Amplitude
0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0−0.2
0.0
0.2
0.4
0.6
0.8
1.0
1.2
1.4
1.6impulse
step
図 23: インパルス応答,ステップ応答
9.5 ボード線図
ボード線図は bodeで描くことができる.
-->clf()
-->bode(S1)
図 25は線形システム S1のボード線図である.
71
Response
Time
Amplitude
0 1 2 3 4 5 6 7 8 9 10−1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0output
imput
図 24: 線形システムの時間応答
Magnitude
Hz
db
−310
−210
−110
010
110
210
310
−70
−60
−50
−40
−30
−20
−10
−0
Phase
Hz
degrees
−310
−210
−110
010
110
210
310
−90
−80
−70
−60
−50
−40
−30
−20
−10
0
10
図 25: ボード線図
72
参考文献
[1] http://scilabsoft.inria.fr/
[2] http://www.inria.fr/
[3] http://www.enpc.fr/
[4] Claude Gomez (Editor), Engineering and Scientific Computing withScilab, Birkhauser, 1999.
73
索 引abcd, 48abs, 11ans, 10
bode, 53Boolean, 25break, 29browsevar, 18
ceil, 11clear, 18clf, 31Color, 35continue, 29cos, 11cosm, 23csim, 51
deff, 30Demos, 5denom, 44, 48derivat, 45det, 21diag, 17diary, 20disp, 9
Editor, 39editvar, 17endfunction, 39exec, 41Execute, 41exists, 41expm, 23Export, 38eye, 16
Figure Properties, 35floor, 11
Font style, 35for, 28format, 11function, 39
getf, 41
Help Browser, 6honer, 45
imag, 11inv, 21
Label, 35legend, 33length, 14Load, 38load, 19Load into Scilab, 41logm, 23
matrix, 15
numer, 45, 48
ones, 16
pfss, 46plot, 30plzr, 49poly, 43Print, 38
rand, 28rank, 21real, 11roots, 44round, 11
Save, 38
74
save, 19SciPad, 39SciPad , 39select-case, 26simp, 44log, 11sin, 11tan, 11sinm, 23Size, 35size, 14spec, 21ss2tf, 49syslin, 47, 48
tf2ss, 49trace, 21
while, 28who_user, 18who, 18
xtitle, 33
zeros, 16
空行列, 16
記号変数, 43行列, 12
の大きさ, 14の逆行列, 21の行列式, 21の固有値, 21の固有値分解, 21のサイズ変更, 15の三角関数, 22の指数, 22の四則演算, 20のスカラー倍, 20の対数, 22転置, 14
のトレース, 21複素共役, 14の冪乗, 21の要素ごとの演算, 24の要素数, 14のランク, 21
グラフィックエディタ, 35
継続行, 10
コマンド行, 8コメント行, 10
最小二乗解, 20
条件文, 26状態空間表現, 48
線形システム, 47のインパルス応答, 51の極, 49の極ゼロ点表示, 49の時間応答, 51の状態ベクトル, 51の初期値, 51のステップ応答, 51のゼロ点, 49の直列接続, 50のフィードバック接続, 50の並列接続, 50
タイトル, 33代入演算子, 9多項式, 43
デモ, 5伝達関数, 47
特殊変数, 10円周率, 10虚数単位, 10計算精度, 10
75
ネピア数, 10無限大, 10
凡例, 33
比較演算子, 24
複素数, 11分子多項式, 48分母多項式, 48
ヘルプ, 6変数名, 10
ボード線図, 53
優先順位, 26有理式, 43
の微分, 45の評価, 45の部分分数展開, 46の分子, 45の分母, 44
離散時間システム, 47
ループ, 28
連続時間システム, 47
論理演算子, 25論理式, 24
76