Scilab とは
Scilab は「サイラボ」と読む。Scilab はオープンソースの数値計算システムである。 商用の数式処理システム MATLAB との類似機能をもつ。制御システムの設計に使われることも多い。 私は、主に数値解析の観点から調べていこうと思う。
Scilab で確かめた本
Scilab ヘルプ (2026年)
2026-02-12 現在最新のバージョンは、Scilab Version 2026.0.1 である。このバージョンのヘルプは、Scilabヘルプ (help.scilab.org) であり、
大分類は次のとおりだ。
- Scilab
- 微分方程式
- Elementary functions
- Linear Algebra
- Interpolation
- CACSD
- Polynomials
- Signal Processing
- FFTW
- Special Functions
- Statistics
- Sparses Matrix
- UMFPACK Interface
- Optimization and Simulation
- XML Management
- HDF5 files
- Files : Input/Output functions
- Input/Output functions
- Graphics
- Graphics export
- GUI
- Data Structures
- Parameters
- Strings
- Sound file handling
- Time and Date
- Output Functions
- Xcos
- Spreadsheet
- Console
- History Manager
- Matlab binary files I/O
- Code Matlab => Scilab
- Functions
- Development Tools
- Demo Tools
- Dynamic/incremental Link
- Windows tools
- Atoms
- Tcl/Tk Interface
- Script editor
- UI Data
- Online help management
- Modules Manager
- Scilab MPI
- Localization
- API Scilab
- call_scilab API
- JVM
- Java from Scilab
- Java Interface
- Preferences
- Coverage
- Lint tool(Slint)
- Web Tools
線形代数
大分類 Linear Algebra (線形代数)の下位分類である中分類および小分類は次のようになっている。カッコ内は私の注釈だ。バージョン 2025.0.0 との違いはわからない。
- Eigenvalue and Singular Value
- balanc — 行列またはペンシルの平衡化
- bdiag — ブロック対角化, 一般化固有ベクトル
- eigs — 行列の最大固有値と固有ベクトルを計算
- pbig — 固有投影
- projspec — スペクトル演算子
- psmall — スペクトル投影
- spec — 行列とペンシルの固有値
- sva — 特異値近似
- svd — 特異値分解
- Factorization
- chol — コレスキー分解
- fullrf — フルランク分解
- fullrfk — A^kのフルランク分解
- hess — ヘッセンベルク形式
- lu — ピボット選択付きのLU 分解
- polar — 正方行列の極分解
- qr — QR 分解
- rankqr — QR分解に基づく階数
- schur — 行列およびペンシルの[ソートされた] Schur 分解
- sqroot — W*W' エルミート分解
- Kernel
- colcomp — 列圧縮,カーネル,ヌル空間
- im_inv — 原像
- kernel — カーネル, ヌル空間
- range — A^kの範囲
- rowcomp — 行圧縮, 範囲
- Linear Equations
- aff2ab — 線形 (アフィン)関数を A,b に変換
- inv — 逆行列
- linsolve — 線形方程式ソルバ
- lsq — norm(X)が最小の A*X=B の線形最小二乗解
- pinv — 擬似逆行列
- Markov Matrices
- classmarkov — マルコフ行列の再帰的かつ一時的なクラス
- eigenmarkov — 正規化された左および右マルコフ固有ベクトル
- genmarkov — 再帰的および一時的なクラスを有するランダムなマルコフ行列を生成する
- Matrix Analysis
- cond — 条件数
- det — determinant of a square matrix
- orth — 直交基底
- rank — 階数
- rcond — 条件数の逆数
- rref — LU分解により行エシュロン形式の行列を計算
- trace — トレース
- Matrix Pencil
- ereduc — QZ変換により列階段型行列を計算
- fstair — QZ変換により列階段型ペンシルを計算する
- glever — 行列ペンシルの逆
- kroneck — 行列ペンシルのクロネッカー形式
- lyap — リアプノフ方程式
- pen2ea — ペンシルからE,A に変換
- pencan — 行列ペンシルの正準形
- penlaur — 行列ペンシルのローラン係数
- quaskro — 準クロネッカー形式
- randpencil — ランダムなペンシル
- rowshuff — シャッフルアルゴリズム
- State-Space Matrices
- coff — レゾルベント (余因子法)
- nlev — Leverrierのアルゴリズム
- Subspaces
- spaninter — 共通部分空間
- spanplus — 部分空間の合計
- spantwo — 部分空間の合計および共通部分
- givens — ギブンス変換
- householder — Householder orthogonal reflexion matrix. Symetrical wrt a plane
- proj — 投影
Scilab ヘルプ (2025年)
2025-01-05 現在最新のバージョンは、Scilab Version 2025.0.0 である。このバージョンのヘルプは、Scilabヘルプ であり、 大分類は次のようになっている。カッコ内は私の注釈だ。バージョン 2023.1.0 との違いは調べていないのでわからない。
Linear Algebra (線形代数) の中分類は2026.01バージョンと同じなので省略する。
Scilab ヘルプ(2023年)
2023-07-26 現在最新のバージョンは、Scilab Version 2023.1.0 である。 このバージョンのヘルプは、Scilabヘルプ である。 バージョン 6.1.1 にあったARnoldi PACKage(大規模行列固有値問題を解くパッケージ、ARPACK)が本バージョンでは省かれている。 詳細は省略する。
Scilab ヘルプ(6.1.1 版)
最初にインストールしたのは Scilab Version 6.1.1 である。6.1.1 のヘルプは、 Scilabヘルプ (help.scilab.org) にある。幸いなことに、かなりの部分で日本語訳がある。ここでの紹介は省略する。
全部訳すつもりはなかったが、意地になって訳してしまった。Atom をアトムとしただけなど、 訳にもなっていないものもある。この大分類の下に、下位分類が何段階もある。
行列の操作は上記の Linear Algebra だけではなく、 Elementary Functions や CACSD にもあることに注意が必要だ。
初等関数 - 初等行列
フランク行列
Scilabヘルプ >> Elementary Functions >> elementarymatrices に、
testmatrix という関数がある。これは、「ヒルバート,フランクのような特殊行列を作成」
するものだ。[y] = testmatrix(name, n) という形式で、
name には 'magi', 'frk', 'hilb' しか選べない。'magi' は魔方陣を作る。
'frk' は Scilab のページによればフランク行列(Franck matrix)を返すのだが、
フランク行列は聞いたことがない。試してみよう。
--> testmatrix('frk',5)
ans =
5. 4. 3. 2. 1.
4. 4. 3. 2. 1.
0. 3. 3. 2. 1.
0. 0. 2. 2. 1.
0. 0. 0. 1. 1.
フランク行列とは、どうやら、次の式で表される`n` 次正方行列のことをいうらしい。
固有値と固有ベクトル
固有値・固有ベクトル・特異値分解
`n` 次の正方行列 `A` の固有値(eigenvalue) `lambda` と固有ベクトル(eigenvector) `x` は次の等式
まず、eigs について調べる。一般には `n` 次正方行列の固有値は全部で重複をこめて `n` 個ある。このうちの絶対値が最大となる固有値を eigs の最大固有値といっている。 実際には特に指定のない場合は絶対値の大きな順から最大計 6 個の固有値と固有ベクトルを求める。
一方で、spec について、ペンシルというのが聞き慣れないことばである。ペンシルとは行列束 (matrix pencil)のことである。伊理正夫「線形代数Ⅱ」p.279 から引用すると次のとおりである。
`K= CC` の上の同じ型 (`m times n` 型) の二つの行列 `A, B` に対して, 行列の族 `{muA - lambdaB | lambda, mu in CC; lamda = mu = 0` ではない `}`のことを `A` と `B` から作られる行列束(matrix pencil; pencil of matrices)と呼ぶ (後略)
なお、Scilab では `A - sB` の型の行列をペンシルと呼んでいる。
さて、今考えている行列 `A` の固有値と固有ベクトルを求めるにはどちらを使えばいいのだろうか。この答は、
https://help.scilab.org/docs/6.1.1/en_US/eigs.html にある次のコメントでわかる。これを抄訳する。
この eigs のページには参照「spec を見よ」とあるが、eigs と spec との違いがわからないかもしれない。 私の知る限り eigs は ARnoldi パッケージモジュール (ARPACK) を使っている。eigs は疎行列の扱いに優れるが、 spec は密行列を対象にしている。ARPACK は疎行列を扱う工夫がこらされていて、 行列の特性に応じたアルゴリズムをうまく選んでいる。 コメント求む。
核と像
kernel では核(カーネル・ヌル空間)が求められる。 なっとくする演習・行列ベクトルの演習問題 7.7[1](i) から引用する。
`A=((3,2,8),(-1,1,-1),(0,1,-1))` で定義される線形写像 `f_A:RR^3 -> RR^3` を考える。 `"Ker" f_A` と `"Im" f_A` の 1 組の基底を求めよ。
--> A=[ 3 2 8 -1 1 -1 0 1 1 ]; --> W=kernel(A); --> W W = -0.8164966 -0.4082483 0.4082483
こんな値が出てしまったがいいのだろうか。書籍の答は次のように出ている。
p.265 には紙面の都合で行ベクトルで表す
と出ている。
`lt (-2, 1, 1)gt`
よく見ると、書籍の答のベクトルを長さが 1 になるよう正規化したものが Scilab で得られたベクトルである。 ではこんどは像を求めてみよう。そう思ったが、像を求める関数が見当たらない。 私が調べた結果では、rowcomp という関数が使える。[W,rk]=rowcomp(A) は、 X の行ベクトルの最初の dim 行に像を表すベクトルを格納するという。
この Scilab では像 (image) ということばは出てこない。 代わりに 範囲 (range) ということばを使っているらしい。 ともかく、求めてみよう。 同書の解答では、`lt (3, -1, 1), (2, 1, 1) gt` なのだが、はたしてどうか。 数値計算の結果だからということだが、わからない。少し計算させてみた。
--> A=[ 3 2 8 -1 1 -1 0 1 1 ]; --> [X,dim]=range(A,1); X = -0.9850394 0.1161092 -0.1273424 -0.0335558 -0.854035 -0.5191322 -0.1690309 -0.5070926 0.8451543 dim = 2.
本当に、`((-0.9850394), (0.1161092), (-0.1273424))` と `((-0.0335558),( -0.854035),( -0.5191322))` が像なのだろうか。少し計算すると、 誤差の範囲内で、 `((-0.9850394), (0.1161092), (-0.1273424)) = -0.2434516 ((3),(-1),(0)) -0.1273424((2),(1),(1))` および `((-0.0335558),( -0.854035),(-0.5191322)) = 0.3349028((3),(-1),(0)) -0.5191322((2),(1),(1))` が成り立つから、きっと像なのだろう。それにしても、まったくどのようなアルゴリズムを使っているかわからないから困る。 少なくとも宿題の解答には使えないだろう。
なお、`A` が正方行列ならば、そしてたまたまここでは `A` が正方行列なのだが、range が使える。 [X,dim]=range(A,k) は、正方行列 `A^k` の像を、 X の行ベクトルの最初の dim 行に像を表すベクトルを格納するという。結果は同じだ。
行列のランク
`((1,1,2,1),(2,3,1,4),(2,5,-5,8))` のランクを求めてみた。(安藤四郎:これだけは知っておこう 線形代数 p.107 より)
--> rank([1,1,2,1;2,3,1,4;2,5,-5,8]) ans = 2.
数値微分
数値微分に関しては、 Differential Equations, Integration の numderivative を使う。diff も使える。 なお、記号微分は多項式に関しては使える。Polynomials にある derivat — 有理行列の微分を参照してほしい。 しかし、一般の超越関数が入る記号微分は見当たらない。
統計
大分類「統計」の下の小分類「Cumulated Distribution Functions(累積分布関数)」に、 cdft (ステューデントの `t` 分布)がある。これには、次のようなインターフェースがある。
[P,Q]=cdft("PQ",T,Df)
[T]=cdft("T",Df,P,Q)
[Df]=cdft("Df",P,Q,T)
自由度 `Df` の `t` 分布の確率密度関数 `t(x; Df)` とすると、P (または Q), T, Df の3変数は次の式を満たす:
`Q = int_-oo^T t(x; Df) dx , P = 1 - Q`
したがって、P (または Q), T, Df のうちの 2 つの値がわかれば、残りの 1 つの値がわかるということを意味する。 実際に、t 分布表の左上にある、`n = 1、alpha = 0.100` に相当する t = 6.314 を例にとろう。
まず、第1の式は、`t` 分布の値 `t` と自由度 `Df` がわかれば、下側確率 P と 上側確率 Q が求められることを意味する。 Scilab の入出力は次のようになる。
--> cdft("PQ",6.314,1)
ans =
0.9500019
--> [P,Q]=cdft("PQ",6.314,1)
P =
0.9500019
Q =
0.0499981
P = 0.90 ではなく、Q = 0.10 でもないのは、私が見た表が、`int_t^oo f(x;df)dx = alpha//2` となる `t` を求める表だからで、 表の値も Scilab の値も正しい。
次に第2の式は 上側確率 P 、下側確率 Q と自由度 `Df` がわかれば、`t` 分布の値 `t` がわかることを意味する。 Scilab の入出力は次のようになる。
--> cdft("T",1,0.95,0.05)
ans =
6.3137515
--> cdft("T",1,0.95)
cdft: 入力引数の数に誤りがあります: 4 個の引数を指定してください.
--> cdft("T",1,0.95,0.15)
cdft: P + Q ≠ 1
この場合、引数は 4 つ必要だ。どうせ Q = 1 - P だから第4 変数を省略してもいいだろう、 と考えて引数を 3 つにすると叱られる。また `P + Q != 1` となる P と Q を入れても叱られる。
最後に第3の式は 上側確率 P 、下側確率 Q と`t` 分布の値 `t` がわかれば、自由度 `Df` の値が求められることを意味する。 Scilab の入出力は次のようになる。
--> cdft("Df",0.95,0.05,6.314)
ans =
0.9999768
これで統計表の値を検算できるほか、自由度が非整数の場合の t 値から上側確率や下側確率を計算できるので、 Welch の t 検定ができるようになる。