|
3.9.10 発展:アルゴリズムのモニターと選択
Mathematicaの関数は内部がどのような仕組みになっているのかを知る必要がないように注意深く設定されている.しかし,特に反復アルゴリズムを使用する数値計算の場合には,アルゴリズムの内部過程がモニターできると便利なことがある.

数値関数の過程のモニター
これはステップが取られる度にxの値を出力する.
In[1]:= FindRoot[Cos[x] == x, {x, 1}, StepMonitor :> Print[x]]




Out[1]= 
option -> exprではなくoption :> exprを使うのが重要であることに注意されたい.exprが規則が与えられたときだけではなく使われる度に評価されるためには遅延型の規則:>が必要である.
ReapとSowは取るステップのリストを作る便利な方法を提供する.
In[2]:= Reap[FindRoot[Cos[x] == x, {x, 1}, StepMonitor :> Sow[x]]]
Out[2]= 
これでステップを数える.
In[3]:= Block[{ct = 0}, {FindRoot[Cos[x] == x, {x, 1}, StepMonitor :> ct++], ct}]
Out[3]= 
解へ向けて着実にステップを重ねるために,反復的な数値アルゴリズムが与えられた関数を数回評価しなければならないことがある.これは例えば各ステップが関数の値の差分によって導関数を推定しなければならないからだったり,ステップが成功するためにはいくつかの試みが必要だったりするからである.
これは解に到達するための有効なステップを示す.
In[4]:= Reap[FindRoot[Cos[x] == x, {x, 5}, StepMonitor :> Sow[x]]]
Out[4]= 
これは関数が評価されたすべての場合を示す.
In[5]:= Reap[FindRoot[Cos[x] == x, {x, 5}, EvaluationMonitor :> Sow[x]]]
Out[5]= 
Mathematicaのアルゴリズムによる評価パターンは非常に複雑なことがある.
In[6]:= ListPlot[Reap[NIntegrate[1/Sqrt[x], {x, -1, 0, 1}, EvaluationMonitor :> Sow[x]]][[2, 1]]]

Out[6]= 

メソッドオプション
特定のタイプの数値計算のため複数の異なるメソッドが知られていることがある.そのような場合にMathematicaは普通文献で説明されているもの,説明されていないものの中で一般に最も成功率が高いものをサポートする.特定の問題に対し,最良のメソッドを自動的に選択するのには多大な努力が必要である.しかし,問題をよく知っていれば,あるいは数値メソッドについて研究しているのであれば,使うべきメソッドをMathematicaに明示的に与えてみてもよいだろう.付録にはMathematicaに組込まれているメソッドのいくつかが載っている.その他のメソッドについてはA.9.4 あるいはアドバンスドキュメントまたはオンラインドキュメントで説明してある.
これはメソッドをm使って微分方程式を解き,必要なステップと評価を返す.
In[7]:= try[m_] := Block[{s=e=0}, NDSolve[{y''[x] + Sin[y[x]] == 0, y'[0] == y[0] == 1}, y, {x, 0, 100}, StepMonitor :> s++, EvaluationMonitor :> e++, Method -> m]; {s, e}]
自動選択されたメソッドの場合,これは必要なステップと評価の数になる.
In[8]:= try[Automatic]
Out[8]= 
これは他のいくつかのメソッドではどうなるかを示している.自動的に選択されたアダムス(Adams)法が最も速い.
In[9]:= try /@ {"Adams", "BDF", "ExplicitRungeKutta", "ImplicitRungeKutta", "Extrapolation"}
Out[9]= 
これは差分次数のパラメータが変更された場合に陽的ルンゲクッタ(Runge-Kutta)法を使ったらどうなるかを示している.
In[10]:= Table[try[{"ExplicitRungeKutta", "DifferenceOrder" -> n}], {n, 4, 9}]
Out[10]= 
|