chdir("path") ワーキングディレクトリの変更 pwd ワーキングディレクトリの表示
%i 虚数単位 %pi 円周率 %e 自然対数の底 %inf 無限大 %eps 機械イプシロン %nan %inf-%inf
%s poly(0,'s') %z poly(0,'z') $ poly(0,'$')
%t 真 %f 偽
predefコマンドを使って $SCIHOME/.scilabに定数を定義することができる。
Vine-4.1のscilabではSCIHOMEは $HOME/.Scilab/scilab-3.1.1/ と定義されている。
/ 商(行列同士の場合は A/B=A*inv(B)となる。) ^ べき(行列の場合は行列のべき) \ 左からの割り算(スカラーの場合はA\B=(1/A)*B、行列の場合はA\B=inv(A)*B)
.* 成分同士の積 ./ 成分同士の商 .\ 成分同士の左からの割り算 .^ 成分個々のべき
== 等しい
より小さい
より大きい
= 以上
= 以下
> or ~= 等しくない
& 論理積 | 論理和
論理否定 %.構文
コマンドの区切りは改行かコンマかセミコロン セミコロンだと結果は表示されない。
exit : scilabを終了する quit : 1段階上のレベルへ移動する。トップレベルだとscilaboを終了する。
◎if文
if 式 then
コマンド; :
elseif 式 then
コマンド; :
else
コマンド; :
end
thenの代わりに改行かコンマでもよい。
◎select文
select 式 case 値 then
コマンド; :
case 値 then
コマンド; :
else
コマンド; :
end
thenの代わりに改行かコンマでもよい。
◎for文
for 制御変数 = 範囲式 do
コマンド; コマンド; :
end
doのかわりに改行かコンマでもよい。 範囲式は 1:10 とか 1:0.1:1 など。範囲式がリストの場合は 各要素についてループを実行し、行列の場合は各列ベクトルについて ループを実行する。
◎while文
while 条件式 do
コマンド コマンド; :
end
doのかわりに改行かコンマでも良い。
for文やwhile文から抜け出すにはbreakが使える。 continueはループ内のそれ以後の処理をスキップし、次のループまで飛ぶ。
input(message) キーボードから数値や変数名を入力 input(message,"string") キーボードから文字列を入力
◎ファイル入出力
fp=file('open',filename) ファイルオープン file('close',fp) ファイルクローズ
fscanf(fp,format,val,val,...)ファイル読み込み fprintf(fp,format,val,val,...)ファイル書き込み
fscanfMat(filename) 数値行列を一気に読み込む fprintfMat(filename,mat)数値行列を一気に書き込む
◎ディレクトリ取得
d=dir('.'); カレントディレクトリ取得
d.name ファイル名のリスト d.date 更新時間のリスト d.isdir ファイルがディレクトリかどうかのフラグのリスト
listfiles(path) : ファイル名のリストを返す。
これらの基本関数は行列に対しては要素毎の計算となる。
基本演算
abs - 絶対値, 大きさ ceil - 小数点切上げ conj - 複素共役 cumprod - 累積積 cumsum - 累積和 round - 丸め込み fix - ゼロの方向に丸める floor - 切り捨て frexp - 浮動小数点を2つの成分、指数と仮数に分解する int - 整数部分 real - 実数部 imag - 虚数部 imult - 虚数単位 i の掛け算 log - 自然対数 log10 - 対数 log1p - 1を加えられた引数の自然対数の計算 log2 - 底が2の対数 minus - (-) 減算演算子、符号変換 modulo - m を法とする余り pmodulo - m を法とする正の余り size - オブジェクトのサイズ sign - 符号関数 sqrt - 平方根
三角関数
sin - 正弦 sinh - 双曲線正弦 cos - 余弦関数 cosh - 双曲線余弦関数 acos - 要素毎の逆余弦 acosh - (要素毎の)逆双曲線余弦 asin - 逆正弦 asinh - 逆双曲線正弦 atan - 第2象限と第4象限の逆正接 atanh - 逆双曲線正接 cotg - 余接 (cotangent) coth - 双曲線余接 tan - 正接 tanh - 双曲線正接
その他の関数
amell - ヤコビアン楕円積分関数 besseli - 第一種修正ベッセル関数 (I sub alpha). besselj - 第一種ベッセル関数 (J sub alpha). besselk - 第二種修正ベッセル関数 (K sub alpha). bessely - 第二種ベッセル関数 (Y sub alpha). beta - ベータ関数 gamma - ガンマ関数 gammaln - ガンマ関数の対数 binomial - 二項分布確率 erf - 誤差関数 erfc - 相補誤差関数 erfcx - スケーリングされた相補誤差関数 calerf - 誤差関数の計算 dlgamma - gammaln 関数、ψ 関数の微分 legendre - 準ルジャンドル関数
普通の線形連立方程式 A*x=B は単に x=A\B で解が得られる。 ちなみにA\Bは列ベクトルを与え、B/Aは行ベクトルを与える。
roots(p) 多項式 p についてp=0の根を与える
solve - シンボルの線形システムソルバー
使い方 x=solve(A,b)
A : 文字の上三角行列 x,b : 文字の行列
このとき、solveはA*x=bの解を与える。
linsolve – 線形方程式を解く
使い方 [x0,kerA]=linsolve(A,b [,x0])
A : n x m の実行列 (場合によりスパース) b : n x 1 ベクトル (Aと同じ行次元) x0 : 実ベクトル kerA : m x k 実行列
linsolveはA*x+b=0の全ての解を計算する。 解は x=x0+kerA*w (wは任意)で与えられる。
(注) 普通の線形連立方程式 A*x=B は単に x=A\B でよい。
fsolve - n変数の非線形関数システムの零点を見つける
○使い方 [x [,v [,info]]]=fsolve(x0,fct [,fjac] [,tol])
○パラメータ x0 : 列ベクトル(関数引数の初期値) fct : 目的関数(関数もしくはリストあるいは列) fjac : fctの導関数(関数もしくはリストあるいは列) tol : 実数のスカラー。精度誤差 : アルゴリズムが x と解の相対誤差が
大きくとも tol になることを予測すると終了する ( tol=1.d-10 が初期値である )。
○戻り値 x : 実数ベクトル (関数引数の最後の値、およそ零) v : 実数ベクトル (x での関数の値) info : 終了情報
0 : ふさわしくない入力パラメータ 1 : アルゴリズムは x と解の相対誤差が多くとも tol であることを予測する。 2 : fcn に呼び出される数 3 : tol は非常に小さい。近似解xのこれ以上の改善は見込まれない。 4 : 繰り返しをしても進歩がない。
fsolveはfct(x)=0となるxをx0の近くに見つける。fjacはfctの導関数を指定する。
function [y]=myfunc(x)
y(1)=sin(x(1))+x(2); y(2)=x(1)-cos(x(2));
endfunction
fsolve([0.7;-0.7],myfunc)
x1:dx:x2 x1からx2までをdxステップで刻んだ配列
linspace(x1,x2,n) x1からx2をn点に等分割した配列を生成。
0から10まで1間隔ならlinspace(0,10,11)とする。
logspace(x1,x2,n) - 対数的に等間隔の配列を生成。
これらは全て行ベクトルとなる。
入力 [1,2,3; 3,4,5; 6,7,8]等
ゼロ行列 zeros(m,n) 全部1の行列 ones(m,n) nxnの単位行列 eye(n,n) [0,1)の乱数行列 rand(m,n,'uniform') 正規分布乱数行列 rand(m,n,'norm')
○行列Aと同じサイズの行列を作る場合
eye(A)やrand(A)などとすることができる。
○複数の行列から C=[A,B]などのようにして新しい行列を作ることができる。
(縦に並べるときはC=[A;B]とする)
◎ファイルから読み込み
fscanfMat("mat0.txt") 区切りはスペースでなくてはならない
mat0.txt -----------
#
# comment
# 1 2 3 4 5 6 7 8 9
◎ファイルへ書き込み
fprintfMat("mat1.txt",M [,format] )
formatはC言語のprintfの書式(デフォルトは"%f")
コロン(:)で範囲指定ができる。コロンのみだと行、あるいは列全体を示す。
A(m,n) m,n要素 A(m,:) m行 A(:,n) n列 A(m1:m2,n) n列のm1行からm2行まで。列の指定も同様 A(m1:m2,n1:n2) m1,m2,n1,n2で指定される範囲 A($) 行列の最後の要素 A(m,$) m行の最後の要素 A($,n) n列の最後の要素
和 A+B 積 A*B 商 A/B = A*inv(B) 商 A\B = inv(A)*B 行列のべき A^x
成分毎の積 A.*B 成分毎の商 A./B および A.\B 成分毎のべき A.^x
転置複素共役 A' 転置 A.' 複素共役 conj(A)
◎基本関数
size(A) 行列のサイズ[m,n]を与える。 size(A,'r'),size(A,'c')はそれぞれ行列 A の行数,列数を返す. length(A) 行列の全要素数(すなわちm*n) rank ランク det 行列式 trace トレース cond 条件数 inv 逆行列 svd 特異値分解 sum 要素の和 cumprod - 累積積 cumsum - 累積和 diag - 対角要素の挿入もしくは抽出 diff - 差分と離散微分 dsearch - 二分探索 gsort - 順序の並び替え intersect - 2つのベクトルの共通の値のベクトルを返す lex_sort - 辞書式の行列の行の並び替え max - 最大値 maxi - 最大値とそのインデックス min - 最小値 mini - 最小値とそのインデックス nnz - 行列の中の非零の要素の数 sort - 降順の並び替え
◎数学関数
expm - 行列指数関数(exp(A)は要素毎の指数) acoshm - 行列逆双曲線余弦 acosm - 行列逆余弦 asinhm - 行列逆双曲線正弦 asinm - 行列逆正弦 atanhm - 行列逆正接 atanm - 正方行列逆双曲線正接 coshm - 行列の双曲線余弦 cosm - 行列の余弦 cothm - 行列の双曲線余接 logm - 正方行列の対数 signm - 行列の符号関数 sinhm - 行列の双曲線正弦 sinm - 行列の正弦 sqrtm - 行列の平方根 tanhm - 行列の双曲線正接 tanm - 行列の正接
○固有値と固有ベクトル
evals=spec(A) は固有値の配列(列ベクトル)を与え、
[X,B]=spec(A) は固有ベクトルXと固有値を対角成分に持つ行列Bを与える。 %.多項式 ◎生成
poly(m,'x') 配列mを根にもつ多項式を生成する。
例えば poly([1,2],'x')は x^2-3x+2 を生成する。
一旦生成された多項式は演算をほどこしても多項式(有理式)のままだから、上の多項式は
x=poly(0,'x') p=x^2-3*x+2
としてもよい。
◎関数
roots 多項式の根を求める denom 有理式の分母 numer 有理式の分子 derivat 有理式の導関数 horner(p,q) 有理式pに値qを代入(qは有理式でもよい) %.ユーザー定義関数
PWDに関数ファイルmyfunc.sci等を作成し getf("myfunc.sci") とすれば,その後使うことができる.
myfunc.sci ----------------------------- function b=myfunc(Xmat,yvec)
b=inv(Xmat'*Xmat)*Xmat'*yvec;
endfunction
オンラインでやるなら deff("b=myfunc(x,y)","b=inv(Xmat'*Xmat)*Xmat'*yvec") などとする。
関数内の変数は全てローカル変数? そうでもない。既にシステムに存在する変数ならその値が初期値として使われる。 ただし、関数を抜ける際には元の値にリセットされる。(たぶん)
%.グラフ
clf グラフ消去
色と記号
1 : 黒 2 : 青 3 : 緑 4 : 水色 5 : 赤 %..2次元グラフ
plot2d( x, y [,options] )
x,yは同じ長さの配列。yが行列なら複数のグラフを重ねて描画する。 ただし、scilabのplotは前のグラフを消さないので、無理に行列を 作る必要はなく、単に続けて書けばいい。消すにはclf命令か、ウインドウ のメニューを使う。
○options style : 各曲線のスタイルをセットする.その値は整数(正あるいは負)の値をもった 実ベクトル. rect : 最小の境界要求をセットする.その値は4つの要素もった実ベクトルである: [xmin,ymin,xmax,ymax] . logflag : 軸のスケール(線形あるいは対数)をセットする. その値はとりうる値の文字列: "nn" , "nl" , "ln" , "ll" . frameflag : 最小の要求値から実際の座標の地域の計算を制御する.その値は0から8 の整数. axesflag : 軸をどのようにするか指定する.その値は0から5の整数. nax : 軸のラベルと目盛りの定義をセットする.その値は4つの整数をもつ実ベクトル [nx,Nx,ny,Ny] leg : 曲線のタイトルをセットする.その値は文字列である.
その他の2次元グラフとして
plot2d2 : ステップ関数として曲線をプロットする plot2d3 : 垂直バーで曲線をプロットする plot2d4 : 矢印で曲線をプロットする fplot2d : ある関数により定義された曲線をプロットする champ : 2次元のベクトル空間 champ1 : 2次元のベクトル空間(色の付いた矢印) fchamp : ある関数により定義された2次元のベクトル空間 contour2d : 2次元平面上への表面の等高線 fcontour2d : 2次元平面上への関数で定義された表面の等高線 grayplot : 色を使った表面の2次元プロット fgrayplot : 色を使った関数で定義された表面の2次元プロット Sgrayplot : 色を使った表面の滑らかな2次元プロット Sfgrayplot :関数で定義された表面の色を使った滑らかな2次元プロット xgrid : 2次元プロット上にグリッドを加える errbar : 2次元プロット上に縦のエラー・バーを加える histplot : ヒストグラムをプロットする Matplot : 色を使った行列の2次元プロット
がある %...例
plot2d(x,y,-9); scatter; plot2d(x,y,2); line;
plot2d(x,y,-9,logflag='nl'); log-linear
◎等高線の例
fname="C030SUM-spectra.dat"; dt=1.72*6; wl0=419.03; dwl=0.28549;
m=fscanfMat(fname); x=1239.85./(wl0-dwl*m(:,1)); y=dt*(0:size(m,'c')-2); z=m(:,2:$); clf; contour2d(x,y,z,20); %..3次元グラフ
plot3d : 3次元プロット plot3d1 : 等高線付きの3次元プロット fplot3d : ある関数により定義された3次元プロット fplot3d1 : ある関数により定義された等高線付きの3次元プロット param3d : 曲線をプロットする param3d1 : 曲線を数本プロットする contour : 3次元平面上への等高線 fcontour : 関数で定義された3次元表面上への等高線 hist3d : ヒストグラムの3次元表現 genfac3d : 3次元曲面の面を計算 eval3dp : 3次元パラメトリック曲面の面を計算 geom3d : 3次元プロット後2次元上に3次元からの投影 %.関数の最適化
%..lsq lsq – 線形最小二乗問題
○使い方 X=lsq(A,B)
○パラメータ A : 実または複素(m x n)行列
mはデータ点の数。nは最適化すべきパラメータの数
B : 実または複素(m x p)行列
pはデータ列の数
○戻り値 X : 実または複素 (n x p) 行列
X=lsq(A,B)は式A*X=Bに対して、ノルム最小となるようなXを 計算する。 例えば f=ax+by+cz+dという関数でデータ点fi(xi,yi,zi)を フィットする場合、Aは
[x1 y1 z1 1] [x2 y2 z2 1] [x3 y3 z3 1]
:
[xn yn zn 1]
となり、Xは
[ a ] [ b ] [ c ] [ d ]
Bは
[ f1 ] [ f2 ] [ f3 ]
:
[ fn ]
となる。
複数のデータ列を同時にフィットしたい場合はXもBも複数列とする。
例 x = (0:0.1:3)'; y = x.*x - x + 3 + (rand(x)-0.5); plot2d(x,y,-2)
A=[x.*x, x, ones(x)]; B=[y]; X=lsq(A,B); y1=X(1)*x.*x+X(2)*x+X(3); plot2d(x,y1,2)
%..lsqrsolve lsqrsolve - 非線形最小自乗法
○使い方 [p, v] = lsqrsolve(p0, f, m [,fjac])
○パラメータ f(p,m) : パラメータpについて各データ点での偏差(を配列として)を与える関数 p0 : 初期パラメータの入った列(縦)ベクトル m : データ点の個数
○オプション fjac : fの導関数
○戻り値 p : 最適化パラメータの列ベクトル v : 列ベクトル。xでの偏差の値。
lsqrsolveはLevenberg-Marquardt法によってsum(f(p,m).^2)を極小にするpを 与える。
(例) a=1;b=0;c=1; deff('y=FF(x)','y=a*exp(-((x-b)/c)^2)'); X=(-3:.1:3)'; Y=FF(X)+rand(X)-.5;
function e=f1(p,m)
a=p(1);b=p(2),c=p(3), e=Y-a*exp(-((X-b)/c)^2);
endfunction [p,v]=lsqrsolve([2;1;2],f1,size(X,1)); p Y2=p(1)*exp(-*1/p(3))^2); plot2d(X,Y,style=-3) plot2d(X,Y2,style=2) %..datafit datafit - 離散データへの関数フィッティング
○使い方 [p,err]=datafit( G, Z, p0 )
○パラメータ G : 関数記述子 (e=G(p,z), e: ne x 1, p: np x 1, z: nz x 1) Z : 行列 [z_1,z_2,...z_n] 。ここで、z_i (nz x 1) は i 番目の測定値である。 p0 : 初期推定 (サイズ np x 1) (オプションについてはマニュアル参照)
○戻り値 p : 列ベクトル。見つけられる最適解。 err : スカラー。最小自乗誤差。
与えられた関数G(p,z)に対して、datafitは一組のベクトルz_iに対して、 G(p,z_i)=0 に近似するパラメータ p の最も良いベクトルを見つける。 アルゴリズムはデフォルトではquasi-Newton法が使われる。
deff('y=FF(x)','y=a*(x-b)+c*x.*x') X=[];Y=[]; a=34;b=12;c=14;for x=0:.1:3, Y=[Y,FF(x)+100*(rand()-.5)];X=[X,x];end Z=[Y;X]; deff('e=G(p,z)','a=p(1),b=p(2),c=p(3),y=z(1),x=z(2),e=y-FF(x)') [p,err]=datafit(G,Z,[3;5;10]) %..leastsq leastsq - 非線形最小自乗問題を解く
○使い方 [f,xopt]=leastsq(fun [,dfun] ,x0) (その他のオプションは省略)
○パラメータ fun : 外部関数。すなわち、Scilab 関数もしくは列 ( fun は最小自乗問題を定義している関数である。 dfun : 関数の勾配 x0 : 実数ベクトル (最小化される変数の初期値)。
○戻り値 f : 最適な最小自乗値の値。 xopt : 発見された x の最適値。
制約なしもしくは制約ありのプログラムに対する非線形最適化ルーチン。 fun は関数 f(x) の定義を与える。これは外部関数である。 この外部関数は与えられた x に対して y(j)=f(x)のような y を返さなければならない。 アルゴリズムはデフォルトではquasi-Newton法が使われる。
Examples
a=rand(3,2);b=[1;1;1];x0=[1;-1]; deff('f=fun(x,a,b)','f=a*x-b'); deff('g=dfun(x,a,b)','g=a');
[f,xopt]=leastsq(fun,x0) //Simplest call xopt-a\b //compare with linear algebra solution
[f,xopt]=leastsq(fun,dfun,x0) //specify gradient
[f,xopt]=leastsq(list(fun,[1 2;3 4],[1;2]),x0)
deff('f=fun(x,a,b)','f=exp(a*x)-b'); deff('g=dfun(x,a,b)','g=a.*(exp(a*x)*ones(1,size(a,2)))');
[f,xopt]=leastsq(list(fun,[1 2;3 4],[1;2]),x0) %.補間
interp - 3次元のスプライン評価関数 interp2d - 2次元のスプライン評価関数 interp3d - 3次元のスプライン評価関数 interpln - 線形補間 lsq_splin - 加重最小自乗法の3次元スプラインフィッティング bsplin3val - 関数の任意の微分係数の3次元スプライン cshep2d - 2次元 3次 shepard (scattered)補間 eval_cshep2d - 3次元の shepard 補間計算 linear_interpn - n次元の線形補間 splin - 3次元スプライン補間 splin2d - スプラインの格子付き2次元補完 splin3d - スプラインの格子付き3次元補完
%.積分
integrate - 求積法による積分 intsplin - スプライン補間によるデータの積分 inttrap - 台形補間によるデータの積分 delip - 楕円積分 int2d - 求積法もしくは立体求積法による2次元の定積分 int3d - 求積法もしくは立体求積法による3次元の定積分 intc - コーシー積分 intg - 定積分 intl - コーシー積分
%.微分方程式
ode - 常微分方程式ソルバ ode_discrete - 常微分方程式ソルバー、離散時間シミュレーション ode_root - 根を求める常微分方程式 odedc - 離散/ 連続時間 ode ソルバー odeoptions - ode ソルバーのオプションを決める
%.外部ファイルの実行
exec( "path" [,mode] )
modeオプション
0 : デフォルト値