2005年11月13日
研究で非線形連立方程式を解く必要にせまられている。Excelのソルバーでも解けるのだが、何度も繰り返すととてもじゃないが時間がかかってしょうがない(値をコピーして代入するのがとても面倒)。ということで、Scilabを使って一気に計算できないかと思い立ち、ちょっと勉強してみることにした。さて、どうなることやら。

非線形連立方程式自体は、「Linux数値計算ツール」という本の5章を見ながら、fsolveという組み込み関数を使って難なく解くことができた。問題は係数を少しずつ変えて、どうやって膨大な数の連立方程式を解いていくか、ということ。
  1. アイディア
  2. ExcelデータをScilabで読みこむ
  3. ベクトル・行列の一部を呼び出す
  4. 関数を定義する
  5. 関数を呼び出す
  6. グローバル変数とローカル変数
  7. 関数への引数の与え方
  8. プログラミング
  9. スクリプトの実行
  10. 変数をファイルに保存する
  11. 参考図書
  12. 役に立つページ

アイディア

係数はExcelで計算済みだから、それをScilabで行列に読み込んでしまう。計算する過程で適宜その行列から係数を読み出せばよいはず。

ExcelデータをScilabで読みこむ

Excelで「名前をつけて保存」から「テキスト (タブ区切り) (*.txt)」を選べばよいことが判明。
Scilabにおける行列の読み込みコマンドは、
X = fscanfMat('hoge.txt')
これで、Excelからhoge.txtに出力した行列が行列Xに読み込まれる。
また
X = read('hoge.txt', i, j)
で、i行j列までの行列データを読み込む。行数が分からない場合は、「-1」を指定するとファイル全体が読み込まれる。
Scilabでは変数の宣言が必要ない!これが他の一般的な言語と違ってもの凄く楽なところ。3行4列の行列を読み込めば勝手にそういう変数にしてくれるし、それに1行付け加えれば勝手に拡張して4行4列の行列にしてくれる。C言語なんかで1から行列の定義をやっているのと比べたら、涙が出るほど楽(ToT)。

ベクトル・行列の一部を呼び出す

ベクトルに対してi番目の成分からj(>=i)番目の成分を持つ ベクトルはa(i:j)で得られる
行列Xからi行j列の要素を取り出すには、X(i,j)と書く。
行列Aのi行目で構成される 行ベクトルとj列目で構成される列ベクトルはそれぞれA(i,:)と A(:,j)で得られる

関数を定義する

今やっている地温変化に伴う気泡体積変化を考える時には、気体の溶解度を考慮することが重要になる。そこで無次元ヘンリー定数なんてのをよく使うが、これは温度の関数である。いちいちこれを参照してなんかいられないので、温度を入力変数とする無次元ヘンリー定数を計算する関数を定義したい。
Scilabでは関数は一つのファイルとして保存しておき、必要に応じて呼び出すのが便利である。関数の定義の仕方は以下の通り。
function [y1, y2,...,yn] = NAME(x1, x2,...,xm)
関数の中身(例えば y1 = x1 + x2;)
endfunction
これをhoge.sciという風にファイルに保存しておけばよい。

関数を呼び出す

ファイルに保存した関数を呼び出すには、
getf('hoge.sci')
とする。

グローバル変数とローカル変数

コマンドライン(スクリプトファイル中も同様、もちろん関数内は除く)に定義した変数は、グローバル変数になるようだ。関数間の変数受け渡しで困ったら、グローバル変数を使ってしまうのは一つの手。

関数への引数の与え方

z=[31254 10418 62508 10]
fsolve(z,bubble) は、fsolve([z(1,1),z(1,2),z(1,3),z(1,4)], bubble) と同じ。

プログラミング

繰り返し計算では他言語でもお馴染みのfor文が使える。
for n=0:3,n=n+1, 繰り返しさせたい中身, end
このようにかくと、n=1, 2, 3, 4として計算する。0からではないことに注意!
なぜか知らないが、n=n+1 を繰り返しさせたい中身の後に持っていくとエラーが出た。

スクリプトの実行

execという関数を使う。例えば、
exec("hoge.sci");

変数をファイルに保存する

write("hoge.txt", hoge)
すでにファイルが存在しているとエラーが出てしまうので、write("hoge.txt", hoge)の前に、
if MSDOS then unix('del A30all.txt');
else unix('rm -f A30all.txt'); end
と書いておいてやると、存在しているファイルを消してくれるので便利。

参考図書

Linux数値計算ツール 大石進一 コロナ社2000年

役に立つページ

Scilabダウンロードページ
Scilab日本語ドキュメント http://www.ecl.sys.hiroshima-u.ac.jp/scilab/
Scilabを中心としたMATLABクローン即席入門講座 http://www.bekkoame.ne.jp/~ponpoko/Math/Scilab.html