記号的評価

関数FindMinimumFindMaximumFindRootはすべてHoldAll属性を持っているので,その引数の評価に対して特殊な意味を持つ.まず,変数は第2引数によって決定し,局所化される.次に,関数が記号的に評価され,数値計算に適した形式に処理される.最後に,コマンドの実行中に,関数が異なる数値で繰返し評価される.ここでは,これらのステップを示すリストに説明を加える.

変数の決定これは第2引数を処理することで実行される.第2引数が正しい形式(変数と初期値のリスト)ではない場合,正しい形式になるよう評価される
変数の局所化BlockTableの場合と同様に,変数に与えられた割当てがコマンドのスコープを超えた Mathematica セッションに影響を与えないよう,また,直前の割当てが値に影響を及ぼさないよう,変数の規則を与える(この段階では,変数は評価されてそれ自身になる)
関数の評価局所的に未定義の変数の(記号的)値を使って,第1引数(関数または方程式)を評価する.注意:この点は,Mathematica 5における変更点なので,以前のバージョンで実行したコードには,多少の調整が必要となる可能性がある.該当する関数で,記号評価により関数が意図されたように維持されない,あるいは異様に遅い場合は,変数の数値に対してのみ評価するよう,関数を定義しなければならない.最も簡単な方法は,f[x_?NumberQ]:=definition のようにPatternTest ()を使って関数を定義することである
関数の前処理使用するアルゴリズムの決定 (平方和のときはLevenberg-Marquardt法等)を助けるために,関数を解析する.可能であれば,高速の数値評価ができるよう関数を最適化・コンパイルする.FindRootでは,この段階にはまず方程式から関数にすることが含まれる
導関数の計算可能であれば,必要な記号的導関数を計算する.あるいは,有限差分を使って導関数を計算するのに必要な前処理を行う
数値的な評価異なる数値で関数(必要なときは導関数も)を繰返し評価する

コマンドに対する関数処理のステップ

FindFitHoldAll属性を持たないので,その引数はすべてコマンドが始まる前に評価される.しかし,関数評価の代りに,モデル関数,変数,与えられたデータから最小化する関数を構築するということ以外は,上記の段階をすべて使う.

関数が明示的な式ではないが,値がプログラムの実行によって導かれた場合等,記号評価を避けたい場合もあるだろう.以下の例では,記号評価を避ける方法を示す.

簡単な境界値問題を,狙い撃ち法を使って数値的に解こうと試みる.
In[1]:=
Click for copyable input
Out[1]=

関数を数値評価するために,このコマンドは失敗する.Blockの内部で評価するとどうなるか見てみる.

FindRootに与えられた関数を未定義の局所値で評価する.
In[2]:=
Click for copyable input
Out[2]=

もちろん,これは関数に対して意図されたものではない.に依存すらしていない.ここでは,に対する数値がないために,NDSolveが失敗している.従って,Firstが第1引数のを返す規則がないために,ReplaceAll ()が失敗する.関数はが数値を持たない限り意味をなさないので,そのように定義しなければならない.

以下は,におけるに対する数値関数として,値を返す関数を定義する.
In[3]:=
Click for copyable input

FindRootの外部に簡単な関数の定義があると,その関数が本当に自分の意図したものであるかどうかを確認するために,個別にテストすることができるという利点がある.

のプロットを作成する.
In[4]:=
Click for copyable input
Out[4]=

プロットから,根に対する2つのブラケット値を推測することができるので,「ブレント」法を使って迅速かつ正確に問題を解くことができる.

狙い撃ち問題を解く.
In[5]:=
Click for copyable input
Out[5]=

記号評価を避けるためだけに関数を定義しなければならないので,記号評価は面倒なように思える.しかし,記号評価をしなければ,Mathematica はそのユニークに統合された数値パワーと記号パワーを利用するのが困難となる.記号評価とは,アルゴリズムの決定,導関数の自動計算,自動最適化と自動コンパイル,構造分析等の記号分析から派生する利点を,コマンドが絶えず利用できるということである.

New to Mathematica? Find your learning path »
Have a question? Ask support »