8 プログラミング

先のファイル処理では,いろいろなコマンドが並んでいた.そして,それは上から下へと 処理が進められた.これは,プログラムに他ならない.プログラムに必要な構文は, 等である.Mathematicaには,これらに関する全てのコマンドが用意されている.それも, FORTRANは言うに及ばず,C言語よりも,そのコマンドは高度で幅広い.コマンドが多すぎ るのが欠点であるが,マニュアルやヘルプを参照して必要なコマンドを使うよう心がける べきである.

全てを学習することは時間的に不可能なので,ここでは概略のみを述べる.諸君は Mathematicaでプログラムが書けることを憶えておき,研究で必要になればそれを使うよ うにすれば良い.

8.1 コメント文

プログラムの動作には全く関係ないが,プログラマーのメモがコメント文である. Mathematicaでは,次のように書く.
書式 (* ここにコメントを書く *)
(*)がコメントのはじまりで,*)が終わりである.コメント文は,複数の行に わたってもよい.C言語の/**/と全く同じである.

8.2 制御文

一般に,コンピュータープログラムの制御構造は分岐と繰り返し(ループ)から成る. Mathematicaでも,それらの構造はサポートされている.

8.2.1 分岐

以下の分岐の構文が使える.通常のプログラミング言語と似ているので,すぐに理解でき るであろう.
書式
	If[判定式,
	   判定式が正しい時の文1;
	   判定式が正しい時の文2,
	   判定式が誤り時の文1;
	   判定式が誤り時の文2
	];
Mathematicaではブロック構造が使えないので,複数の実行文があるときはセミコロン (;)を使う.そして,ブロックの区切りにカンマ(,)を使っている.これを使っ た関数

$\displaystyle f(x)=\begin{cases}\sin x & x<0\text{のとき}\ x & 0\leqq x\text{のとき} \end{cases}$    

の例を示す.
	f[x_]:=If[x<0, Sin[x],x];
	Plot[f[x],{x,-10,10}];
	Plot[f'[x],{x,-10,10}];
この例で分かるように,普通の関数のように微分ができるのである.

Ifのほかに,分岐を行う構文にWhichSwitchがある.ヘルプを見て,各 自が必要になったときに学習せよ.

8.2.2 繰り返し(ループ)

C言語と全く同じ,Forというループ文が用意されている.
書式
	For[初期の式, 判別式,ループ後の式, 
	   文1;
	   文2;
	   文3;
	];
例えば,次のように書く.
	For[i=1, i<20, i++,
	  Print[N[Pi,i]];
	];

For以外に,DoWhileを使ったループ文も使える.また,BreakContinueReturnなどC言語とほとんど同じ構文が使えるようになっている. 必要になったときに学習せよ.

8.3 サブルーチン

サブルーチン--C言語の関数--を使いたい場合は,Moduleを使う.これを使ったサ ブルーチンの書き方は,次のようにする.
書式
	関数名[引数並び_]:=Module[{ローカル変数並び},
	   文1;
	   文2,
	   文3;
	   Return[返却値];
	];
これで,サブルーチンでの処理を定義することができる.プログラム中では,サブルーチ ンは,使用前に定義する必要がある.これはC言語と同じであるが,C言語の場合はプロト タイプ宣言が使えるので,定義を書く場所は関数はその関数が最初に現れるところに書か なくても良い.

つぎに,サブルーチンを使ったプログラム例を示す.ここで取り扱っている例は,

  $\displaystyle \frac{\mathrm{d}^2f}{\mathrm{d}t^2}+\frac{\mathrm{d}f}{\mathrm{d}t}+f=\sin t$   $\displaystyle f^\prime(0)=0$   $\displaystyle f(0)=0$    

という微分方程式の数値計算を行う.そして,呼出元で与えられた値を中心にして,全幅 2でグラフを描く.サブルーチンの返却値は,呼出元で与えられた$ t$の場合の微分方程式 の近似値である.
(* ========== Subroutine ========== *)

func[x_]:=Module[{xlow,xhigh},
      xlow=x-1;
      xhigh=x+1;
      Print["xlow = ",xlow];
      result=NDSolve[{f''[t]+f'[t]+f[t]==Sin[t],
            f'[0]==0,f[0]==0},f,{t,xlow,xhigh}
          ];
      ans[t_]=f[t]/.result;
      Plot[ans[t],{t,xlow,xhigh}];
      Return[ans[x]];
      ];


(* ========== Main routine ========== *)

value1=func[3.4];
value2=func[6.5];
Print["value1 = ",value1];
Print["value2 = ", value2];

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年6月24日


no counter