UnconstrainedProblemsパッケージ
検索データのプロット
ユーティリティ関数のFindMinimumPlotとFindRootPlotは,一次元および二次元関数におけるFindMinimum,FindRootの検索データを表示する.これらは基本的にそれぞれFindMinimum,FindRootと同じ引数で使うが,異なる点はプロット作成のために呼び出すグラフィックス関数に影響するオプションを付加的に取るという点と,FindMinimumとFindRootが持つHoldAll属性を持たないという点である.
FindMinimumPlot[f,{x,xst},opts] | FindMinimum[f,{x,xst}]において,関数 f およびその任意の導関数を評価したステップおよび点を f 対 x のプロットに重ねてプロットする.opts にはFindMinimumおよびPlotのオプションを使うことができる |
FindMinimumPlot[f,{{x,xst},{y,yst}},opts] | FindMinimum[f,{{x,xst},{y,yst}}]において,関数 f およびその任意の導関数を評価したステップおよび点を x および y の関数としての f の等高線プロットに重ねてプロットする.opts にはFindMinimumおよびContourPlotのオプションを使うことができる |
FindRootPlot[f,{x,xst},opts] | FindRoot[f,{x,xst}]において,関数 f およびその任意の導関数を評価したステップおよび点を f 対 x のプロットに重ねてプロットする.opts にはFindRootおよびPlotのオプションを使うことができる |
FindRootPlot[f,{{x,xst},{y,yst}},opts] | FindRoot[f,{{x,xst},{y,yst}}]において,関数 f およびその任意の導関数を評価したステップおよび点を x と y の関数としてのメリット関数 f の等高線プロットに重ねてプロットする.opts にはFindRootおよびContourPlotのオプションを使うことができる |
関数 f の処理を簡潔にし,起る可能性のある混乱を避けるために,FindRootPlotは方程式を取らず,根 f=0を見付ける.
ステップおよび評価点は,簡単に見分けられるよう,以下のように色分けしてある.
- ステップは青い線と青い点で示す.
- 関数の評価は,緑の点で示す.
- 勾配の評価は,赤い点で示す.
- ヘッセ行列の評価は水色の点です.
- 剰余関数の評価は黄色い点で示す.
- ヤコビ行列の評価は,紫の点で示す.
- 検索の終了は,大きい黒い点で示す.
FindMinimumPlotとFindRootPlotは,デフォルトの引数 "Plot"を使ってステップのプロットを返す.
引数"SolutionData"を使うFindMinimumPlotとFindRootPlotは,キーが{Plot,Solution,Statistics}のAssociationを返す.ここで:
- Plot は表示されるグラフィックオブジェクトである.
- Solution はFindMinimumまたはFindRootの結果である.
- Statistics は関数のステップ数,評価回数,その導関数を示す規則のリストである.
テスト問題
[MGH81]で示されているテスト問題はすべてWolfram言語にコード化され,Optimization`UnconstrainedProblems`パッケージに入っている.解およびFindMinimumやFindRootを使ったテストのために問題がシームレスに処理されるよう,データ構造が使われている.FindMinimumおよびFindRootの問題のリストはそれぞれ$FindMinimumProblemsと$FindRootProblemsに含まれており,問題にはGetFindMinimumProblem,GetFindRootProblemを使ってアクセスすることができる.
$FindMinimumProblems | FindMinimumに適した問題のリスト |
GetFindMinimumProblem[prob] | デフォルトのサイズと初期値を使った問題 prob をFindMinimumProblemデータ構造で得る |
GetFindMinimumProblem[prob,{n,m}] | m 個の平方の和となるような n 個の変数を持つ問題 prob をFindMinimumProblemデータ構造で得る |
GetFindMinimumProblem[prob,size,start] | |
指定されたサイズ size と初期値 start を持つ問題 prob をFindMinimumProblemデータ構造で得る | |
FindMinimumProblem[f,vars,opts,prob,size] | |
FindMinimumが解く最小化問題を含むデータ構造 |
FindMinimum問題へのアクセス
$FindRootProblems | FindRootに適切な問題のリスト |
GetFindRootProblem[prob] | デフォルトのサイズと初期値を使った問題 prob をFindRootProblemデータ構造で得る |
GetFindRootProblem[prob,n] | n 個の変数(と n 個の方程式)を持つ問題 prob をFindRootProblemデータ構造で得る |
GetFindRootProblem[prob,n,start] | サイズ n,初期値 start を持つ問題 prob をFindRootProblemデータ構造で得る |
FindRootProblem[f,vars,opts,prob,size] | |
FindRootが解く最小化問題を含むデータ構造 |
FindRoot問題へのアクセス
GetFindMinimumProblemとGetFindRootProblemは共に,他のコマンドが使用するオプションを渡す.また,これらは問題に対して使用する変数を指定するために使われるVariables->vars オプションを取る.
オプション名
|
デフォルト値
| |
Variables | X#& | 変数の問題,あるいはその変数を含む長さ のリストのための変数を生成するために,整数 に適用する関数 |
一旦FindMinimumProblemあるいはFindRootProblemオブジェクトを入手すると,ただ問題を解く以外にもさまざまなテストを実行することができる.
ProblemSolve[p,opts] | p についての問題を解き,FindMinimum,FindRootと同じ出力を与える |
ProblemStatistics[p,opts] | 問題を解き,リスト{{sol,stats}}を与える.ここで sol はProblemSolve[p] の出力,evals はステップと評価に使われた数を示す規則のリストである |
ProblemTime[p,opts] | 問題を解き,リスト{{sol,Time->time}}を与える.ここで sol はProblemSolve[p]の出力,time は問題を解くのにかかった時間である.time が1秒より小さい場合は,平均時間を得る目的で問題が数回解かれる |
ProblemTest[p,opts] | 問題を解き,ProblemStatistics[p]とProblemTime[p]からのステップ,評価統計,時間を含む規則のリスト,および,参照解との比較に基づく解の確度・精度を示す規則のリストを与える |
FindMinimumPlot[p,opts] | FindMinimumProblem p を解くためのステップと評価点をプロットする |
FindRootPlot[p,opts] | FindRootProblem p を解くためのステップと評価点をプロットする |
FindMinimumProblemおよびFindRootProblemデータオブジェクトを使った操作
既出のコマンドはすべてFindMinimumあるいはFindRootに直接渡されるオプションを取り,問題が設定されたときに指定されていたこれらの関数のオプションを上書きすることができる.
ProblemTestは,同じ問題に対する2つの異なるメソッドを簡単に比較することができる.
これらの関数によって返される規則のほとんどは自己説明的であるか,記述が必要なものもある.以下はそのような規則を明確にする表である.
"FunctionAccuracy" | 関数値の確度 -Log[10,error in f] |
"FunctionPrecision" | 関数値の精度 -Log[10,relative error in f] |
"SpatialAccuracy" | 最小化関数あるいは根の位置の確度 -Log[10,error in x] |
"SpatialPrecision" | 最小化関数あるいは根の位置の精度 -Log[10,relative error in x] |
"Messages" | 問題を解いている間に出されたメッセージのリスト |
メソッドのリストが,ある特定の問題にどのように作用するかを比べると非常に役に立つ.この比較は,FindMinimumProblemオブジェクトを設定し,問題のテストをメソッドのリストにマップすることにより,簡単に実行することができる.
$FindMinimumProblemsあるいは$FindRootProblemsの名前にマップすることにより,ある特定のメソッドがさまざまな問題に対してどのように作用するかを示す表を作成することが可能である.
空間精度が2ヶ所ERRORと表示されているが,これらは線形問題で,単独の最小化関数がないためである.また,非常に低い空間精度を持つものが1つあり,これは複数の最小化関数を持つので,メソッドは参照の最小値とは異なる最小値に行ってしまう.これらの関数の多くは複数の極小値を持つので,メソッドが参照の最小値とは異なる最小値に行ったという理由だけでエラーが報告される可能性があるということに気を付けなければならない.