ワーキングディレクトリ

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

roots(p) 多項式 p についてp=0の根を与える

solve

solve - シンボルの線形システムソルバー

使い方 x=solve(A,b)

A : 文字の上三角行列 x,b : 文字の行列

このとき、solveはA*x=bの解を与える。

linsolve

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

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 : デフォルト値


*1 X-p(2

トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS