市民工学科 令和5年度 数値計算実習(第3回その3)

令和5年 10月12日(木) 3限目15:10〜16:40


←その 2 にもどる

2.プログラム (スクリプト)


2.1 エディタ「\(\ SciNotes\) (サイノーツ)」を使ってプログラム (スクリプト)を記述しよう


これまで,いろいろなコマンド(あるいは コード)を入力することによって,計算させたり,その結果を出力させたりしてきました.その際,あるコマンド(コード)を入力するたびに,その計算結果を出力してきましたね.

簡単な計算ならばそれほど手間はありませんが,より複雑な処理をするときや,同じ処理を何回も繰り返そうとするときには,いちいち計算結果を出力することが結構な手間になってきます.


\(Scilab\ \)では,ファイル名を付けて一連のコマンド(コード)を保存したり,いつでも必要なときに呼び出したりできます.そして,一連のコマンド(コード)を一度に実行させることができます.この記録される一連のコマンド(コード)を「プログラム(または スクリプト)」と呼びます.

\(Scilab\ \)でプログラム(スクリプト)を記述するには, はじめに「\(Editor\) (エディタ)」という”編集用のソフトウェア”を起動させます.エディタを使うと,プログラム(スクリプト)の誤った記述(バグ)の修正(デバグ)が簡単にできます.


\(Scilab\)(バージョン 5.5)では,「\(\ SciNotes\) (サイノーツ)」という付属のエディタが使えます.

このエディタを起動するには,\(Scilab\ \)のコンソール画面の上段にみえるアイコンの中で,一番左にあるアイコン「\(\ \mbox{SciNotes}\ \)を起動」をクリックします.あるいは,コンソール画面の上段のメニューの中から「アプリケーション(A)」をプルダウンして,一番上の「\(\ \mbox{SciNotes}\ \)」をクリックしても起動します.


すると,図\(\ 3−5\ \)のような別ウィンドウが出てきます.これが,\(SciNotes\ \)です.

図\(\ 3−5\ \) エディタ「\(\ SciNotes\ \)」


以下では,この\(\ SciNotes\ \)を使ってプログラム(スクリプト)を記述していきます.


\(SciNotes\ \)の操作方法は,普通のワープロと大体同じです.とりあえず,図\(\ 3−6\ \)のようなプログラム(スクリプト)を記述してみましょう.
以下のプログラム\(\ 3\ \)行をマウスでドラックして右クリックでコピー(または\(\ \mbox{Ctrl + C}\ \))したあと,\(SciNotes\ \)上に右クリックでペースト(または\(\ \mbox{Ctrl + V}\ \))してもよいです.

プログラム (スクリプト) の例
x = [-%pi:0.1*%pi:%pi]
y = cos(x)
plot(x,y)

図\(\ 3−6\ \) プログラム (スクリプト) の例


これまでと違って,プログラム(スクリプト)の場合は,コマンド(コード)を入力するたびに実行されることはありません.


図\(\ 3−6\ \)のようにプログラム(コード)を記述できたら,とりあえず保存しましょう.

エディタ\(\ SciNotes\ \)の画面の上段にみえるアイコンの中で,左から\(\ 4\ \)つめまたは\(\ 5\ \)つめにあるアイコン「保存」または「別名で保存」をクリックします.あるいは,上段のメニューの中から「ファイル」をプルダウンして「保存\(\ \mbox{Ctrl + S}\ \)」または「別名で保存\(\ \mbox{Ctrl + Shift + S}\ \)」をクリックします.

すると,ファイル名の指定を要求されるので,とりあえず「\(\ \mbox{cosplot. sce}\ \)」という名前で保存しておきましょう.保存場所は,とりあえずデスクトップ上にしておきましょう.

ファイル名の後ろに付く「\(\ *\mbox{. sce}\ \)」を\(\ Scilab\ \)の「拡張子」と呼びます.


それでは,いま保存したプログラム (スクリプト) を実行してみましょう.

エディタ\(\ SciNotes\ \)の画面の上段にみえるアイコンの中で,右から\(\ 5\ \)つめにあるアイコン「実行する」をクリックします.あるいは,上段のメニューの中から「実行する」をプルダウンして「ファイルを実行 (出力あり)\(\ \mbox{Ctrl + L}\ \)」をクリックします.

もうひとつの方法として,\(Scilab\ \)のコンソール画面上から実行することもできます.そのときのコマンドは「\(\ \mbox{exec}\ \)」です.


さきほどの図\(\ 3−6\ \)の上側の赤い四角で囲った部分に着目して下さい.これは,保存したファイル「\(\ \mbox{cosplot. sce}\ \)」の保存先へのパスの付いたファイル名(つまり,パス付きファイル名)を表しています.このパス付ファイル名の「パス」の部分については,みなさん各々で違っていることに注意して下さい.

このとき,コマンド「\(\ \mbox{exec}\ \)」は,\(SciNotes\ \)上ではなくコンソール上で,次のように使います.

コマンド「\(\ \mbox{exec}\ \)」の使い方(コンソール上で次のコマンドを入力)
-->exec(' SciNotes の上段にあるパス付きファイル名 ',-1);

※ 図3−6の例の場合は,パス付きファイル名は以下のとおり.
-->exec('C:\Users\yotsutsuji\Desktop\cosplot.sce',-1);

※ ( )内の最後の ,-1 を省略すると,計算の途中は出力されない.
-->exec('C:\Users\yotsutsuji\Desktop\cosplot.sce');

以上のうちいずれかの実行方法を使って「\(\ \mbox{cosplot. sce}\ \)」を実行すると,保存されていたすべてのコマンド(コード)が上から順に一気に実行されます.そして,その実行結果として,図\(\ 3−7\ \)のようなグラフが出力されます.

図\(\ 3−7\ \) プログラム (スクリプト) の実行結果



2.2 繰り返しの処理


その\(\ 2\ \)の最後で「何度も似たようなコマンド (コード) を入力するのは,たいへん面倒です.なんとかならないでしょうか.」と書きました.

いよいよ,なんとかなるときがきました.そのためには,\(SciNotes\ \)で「繰り返しの処理」のプログラムを記述します.繰り返しの処理には,コマンド「\(\ \mbox{for}\ \)」を使います.


それでは,次のプログラム (スクリプト) を実行してみましょう.ちなみに,以下のプログラム (スクリプト) は,\(SciNotes\ \)上に「コピー&ペースト」できます.

\(\ 10\ \)のべき乗を計算するプログラム
a = 1;
for i = 1:10 do
   a = a * i;
end
a

プログラム (スクリプト) を記述できたら保存したあとで実行しましょう.結果として”\(\ 3628800\ \)”が出力されれば正解です.


なお,上記の例で,コマンド「\(\ a = 1\ \)」のあとにセミコロン「\(\ ;\ \)」を入力しているのは,そのコマンドによって実行された計算結果を画面上に出力しなくするためです.

また,上記の例で,プログラム (スクリプト) の最後に,コマンド「\(\ a\ \)」を入力しているのは,繰り返し処理が終了したあとの変数\(\ a\ \)の値を出力させるためです.


一般に,コマンド「\(\ \mbox{for}\ \)」のプログラム (スクリプト) は,次のような構造をしています.

for 制御変数 = 最初の値 最後の値 do

   繰り返したい命令文(2行以上でもよい)

end

コマンド「\(\ \mbox{for}\ \)」で指定される変数を「制御変数」と呼びます.上記の例では,「\(\ i\ \)」が制御変数です.

また,\(\ \mbox{for}\ \)文において「\(\ \mbox{do}\ \)」と「\(\ \mbox{end}\ \)」で囲まれる範囲には,繰り返したい命令文(\(\ 2\ \)行以上でもよい)を記述します.この「繰り返したい命令文」の中では,繰り返し値が代入される変数を設定する必要があります.上記の例では,「\(\ a\ \)」がこの変数となります.


\(\ \mbox{for}\ \)文における繰り返し処理では,はじめに,制御変数に最初の値がセットされます.上記の例では,「\(\ i = 1\ \)」とセットされます.そして,この最初の値がセットされた制御変数のもとで,繰り返したい命令文が実行されます.

次に,制御変数の値が\(\ 1\ \)だけ加算されてセットされます.この例の場合,「\(\ i = 2\ \)」とセットされます.そして,この\(\ 1\ \)だけ増えた制御変数のもとで,再度,繰り返したい命令文が実行されます.

さらに,制御変数の値が\(\ 1\ \)だけ加算されてセットされます.これらの繰り返し処理は,制御変数に最後の値がセットされて命令文が実行されるまで継続します.この例の場合,「\(\ i = 10\ \)」とセットされて命令文が実行されれば終了です.


ここで注意したいのは,上記の例の中にある繰り返したい命令文,

a = a * i;

の表記のしかたです.

この命令文における等号「\(\ =\ \)」は,プログラムに特有の意味をもっており,「右辺の値を左辺に代入する」という意味があります.したがって,通常の数学で使われる等号の意味とは異なることに注意して下さい.


上記の例では,「変数\(\ a\ \)の値に制御変数\(\ i\ \)を掛けて,その値を変数\(\ a\ \)に代入する」という意味になります.このような表記のしかたは,繰り返し処理の中で,ある変数の値を繰り返し更新していくときなどに使われます.


なお,\(\ \mbox{for}\ \)文では,制御変数\(\ i\ \)の増分として\(\ 1\ \)以外の値を用いることもできます.その際は,次のように記述します.

for 制御変数 = 最初の値 増分:最後の値 do

   繰り返したい命令文(2行以上でもよい)

end


それでは,さきほど練習した「図形を連続して回転させる」を実行してみましょう.

図形を連続して回転させるためのプログラム (スクリプト)
a=[1;0];
b=[2;1];
c=[1;2];
d=[0;1];
XY=[a,b,c,d,a];
th=30/180*%pi;
R=[cos(th),-sin(th);sin(th),cos(th)]
for i=1:11 do
plot(XY(1,:),XY(2,:))
XY=R*XY;
end

図\(\ 3−8\ \)のように描画されます.

図\(\ 3−8\ \) 図形を連続して原点のまわりで回転させるプログラム (スクリプト)の結果


この例についても,もう一度強調しておくならば,

XY = R * XY ;

という表記のしかたは,「\(\ Scilab\ \)では,\(\ =\ \)(イコール)は『代入』を意味する」ことから,

「行列\(\ R\ \)の後ろから行列\(\ XY\ \)を掛けて,その結果を 新しい\(\ XY\ \)の値にしなさい」

ということを意味していることが理解できると思います.


それでは,次の練習問題を解いてみて下さい.

[練習問題\(\ 3−2\ \)]

上記のプログラムで,\(XY = R*XY ;\ \) を,\(\ XY = 0.9*R*XY ;\ \) に変えて実行してみたらどうなるでしょうか? 

さらに,この \(\ 0.9\ \) の代わりに \(\ 1.1\ \) を使ったらどうなるでしょうか?

   いろいろ試してみましょう.


次ページへ