関数とプログラム

ユーザ定義の関数
Wolfram言語には組込み関数が多数ある.このチュートリアルでは,ユーザによる関数の定義を Wolfram言語にどのように追加したらよいかを説明する.
最初の例として,引数を2乗する関数fを考える.この関数を定義するのに必要なWolfram言語のコマンドは,f[x_]:=x^2である.式の左辺にある下線部(_)は「ブランク」と呼ばれ,非常に重要なものである.ブランクの持つ意味についてはここで説明するが,ここでは,_は定義式の右辺ではなく,左辺に置かれる,ということを覚えていてほしい.
関数fを定義する._が左辺にあることに注意:
fは引数を2乗する:
引数には数値を指定してもよい:
もちろん複雑な式でも構わない:
fを計算式の一部として使ってみる:
疑問符をfの前に付けると,fの定義式を参照することができる:
f[x_]:=x^2
関数fを定義する
?f
fの定義式を確認する
Clear[f]
fに関するすべての定義情報を消去する
関数の定義
Wolfram言語では,fのような関数に使う名前は単なる記号である.このため,組込み関数と区別するため,大文字で始まる関数名は使わないようにする.また,これらの名前を同じセッションで他のものに対して使わないようにする.
Wolfram言語の関数には引数をいくつ持たせてもよい:
関数humpは,組込み関数と同じように使うことができる:
humpの定義を変更する.前の定義は新たな定義で上書きされる:
定義情報を確認する.新しい定義になっていることが分かる:
humpに関するすべての定義を消去しておく:
定義した関数が必要なくなったら,必ず定義を消去しておく.そうしないと,後で同じWolfram言語セッションにおいて同じ関数を別の用途に使おうとすると問題が起る.ユーザ定義された関数 f からすべての定義を消去するにはClear[f]を使う.
fの定義をすべて消去する:
fの定義は表示されない:
手続きとしての関数
多くの計算問題で,同じ式を繰返しWolfram言語にタイプしなければならない状況が起るときがある.そのようなときは,入力のコマンドを含む関数を定義しておくことで何度も同じ式をタイプしなくても済むようになる.
3つの項を掛け合せ,結果を展開する:
同じ処理を4つの項に対して行う:
これは,n 項の乗積を計算し,展開する関数exprodを定義する:
関数が使われるたびに,乗積Productと展開Expandの両操作が実行される:
ユーザ定義の関数は,本質的にはコマンドを実行するための「手続き(プロシージャ)」である.手続きには複数の計算ステップを記述することができる.区切りのため,ステップとステップの間にはセミコロンを入れる.
関数全体の戻り値は,手続きの最後の式に対する結果である.関数をこのように定義するときは,丸カッコで手続きの部分をくくることに注意:
手続きを実行する:
expr1;expr2;
評価する一連の式
Module[{a,b,},proc]
局所変数 a, b, をともなう手続き
手続きの構築
Wolfram言語で手続きを記述するとき,手続き内で使う変数は局所的なものとして宣言しておくとよい.そうしておけば,変数が手続きの外で起ることと干渉することがなくなる.変数の局所化は,手続きをモジュールとして宣言することで行うことができる.
前の例で使った関数cexはモジュールとして定義されていない.したがって,tの値は「逃げて」しまい,関数が返った後も残ってしまう:
変数tを消去する:
次に同じ計算をモジュールを使い定義してみる.変数tを局所的にする:
返される結果は以前の関数と同じである:
ただし,今度は,tの値が「逃げない」ので,参照しても何も返されない:
オプションの操作
Wolfram言語には,Plotのように各種オプションを設定できる関数がいくつか組み込まれている.これらのオプションを扱うための共通の手順がいくつかあるので説明しておこう.
Plotの場合がそうであるように,関数にオプションがあっても,それに対して特に何も指定しなければ,デフォルト値が使われる.オプションのデフォルト値が何か確認するには,Options[function,option]を使う.また,デフォルト値を変更するには,SetOptions[function,option->value]を使うことで,デフォルト値を変更することができる.注意点として,一度,デフォルト値が変更されたなら,その設定は,再び変更されるまで常に有効になる.
Options[function]
すべてのオプションについて現行のデフォルト値を列挙する
Options[function,option]
特定のオプションについて現行のデフォルト値を参照する
SetOptions[function,option->value,]
デフォルト値を変更する
オプションのデフォルト値の参照と変更
関数PlotのオプションPlotRangeのデフォルト値を見てみる:
PlotRangeのデフォルト値をAll(すべて)に変更する.行末尾のセミコロンは,Wolfram言語が長いPlotのオプションを表示出力しないようにするために加えた:
再び変更されるまでPlotRangeオプションのデフォルト値はAllのままになっている:
PlotShowで生成したグラフィックスオブジェクトにはプロット仕様に関する情報が格納されている.この情報を参照するにはグラフィックスオブジェクトにOptionsを作用させる.
Options[plot]
ある特定のプロットに使われているすべてのオプションを列挙する
Options[plot,option]
特定のオプションのみを参照する
AbsoluteOptions[plot,option]
特定のオプションにおいて,その設定値がAutomaticAllの場合でも,絶対的な設定値を表示する
プロットのオプションに関する情報の取得
次は,オプションすべてにデフォルト値が使われているプロットである:
確認すると,オプションPlotRangeにはAllが使われたことが分かる:
PlotRangeで自動的に採用された値をAbsoluteOptionsで問い合せてみる:
上記の例のように,グラフィックスを表すために変数を使うと便利なことがよくあるが,グラフィックス事態は直接評価することができる.ノートブックインターフェースでこれを行う一般的な方法は,グラフィックスをコピーペーストするか,グラフィカル出力セルに入力し始めることである.後者の場合,その段階で出力セルは新規の入力セルに変換される.
明示的なImageSizeなしで生成されたプロットが入力セルに置かれると,それはより簡単に入力に収まるよう,自動的に縮小される.
下の入力セルは,上記の例で生成されたグラフィカル出力をコピーペーストして生成されたものである:
Plotをデフォルトのオプション設定に戻す:
反復処理
Wolfram言語を使っていて,ある処理を繰返し実行しなければならないときがある.これを行う方法はいろいろあるが,最も自然なのは,処理したい要素を並べたリスト等の構造体を作っておき,その各要素に対して必要な操作を一括で行う方法であろう.
もうひとつは,関数Doを使ったループを形成する方法である.この式はC言語やFortranの反復構造体と同じように機能する.Doでは,「和と積」に記述されているようにSumProductと同じWolfram言語反復子の記述法が使われる.
Do[expr,{i,imax}]
i が1から imax の区間で式 expr を繰り返し計算する(刻み幅は+1)
Do[expr,{i,imin,imax,di}]
iimin から imax の区間で式 expr を繰り返し計算する(刻み幅は di
Print[expr]
expr を出力(表示)し改行する
Table[expr,{i,imax}]
i が1から imax の区間で式 expr を繰り返し計算し,値をリスト形式で出力する
反復処理の記述法
1から5までの階乗の値を表示する:
場合によってはリスト形式で結果が得られると好都合である.そうすればさらに操作を続けられる:
特に反復変数を与えなければ,同じ操作が指定回数分だけ繰り返される.反復の際は何も変更されない:
関数の変換規則
書式 x->value の変換規則を使った記号への値の置換えを「シンボルの値」で説明した.Wolframシステムの変換規則は,記号だけに対応したものではなくもっと一般的なものである.実際,どのようなWolframシステムの式でも,それに対応した変換規則を設けることが可能である.
x->3の変換規則を適用すると,式中のx3になる:
変換規則をf[x]に対して使うこともできる.この規則はf[y]には作用しない:
f[t_]はパターンを表し,fが実際に取る引数は何でもよい:
変換規則の最も強力な面は,文字通りの変数や関数だけでなく,パターンに基づいたものであってもよいことである.ここで,パターンとは,例えば,ブランク(_)を含むf[t_]のような式を指す.ブランクはどんな式でも代替することができる.つまり,f[t_]に対する変換規則は,どんな引数を取っても有効である関数fの変換の仕方を指定する.これに対して,f[x]に対応したブランクなしの変換規則は,記述通りの式f[x]しか変換することができない.f[y]の変換に関しては何の効果も持たない.
また,f[t_]:=t^2のような関数定義を与えるときは,f[t_]->t^2の変換規則を必要な際に適用するようにWolframシステムに命令しているに過ぎない.
どんな形の式にも変換規則を設定することができる:
x^p_に関する変換規則を適用する:
任意の式へのパターンおよび変換規則の設定は,「パターン」「変換規則と定義」で詳しく説明する.ここでは,Wolframシステムにおいてすべての式は特定のシンボル的な構造を持っており,また,そのため,変換規則を使うことで式の構造のどの部分でも変換することができる,というだけにとどめる.