UnconstrainedProblemsパッケージ

検索データのプロット

ユーティリティ関数のFindMinimumPlotFindRootPlotは,一次元および二次元関数におけるFindMinimumFindRootの検索データを表示する.これらは基本的にそれぞれFindMinimumFindRootと同じ引数で使うが,異なる点はプロット作成のために呼び出すグラフィックス関数に影響するオプションを付加的に取るという点と,FindMinimumFindRootが持つHoldAll属性を持たないという点である.

FindMinimumPlot[f,{x,xst},opts]FindMinimum[f,{x,xst}]において,関数 f およびその任意の導関数を評価したステップおよび点を fx のプロットに重ねてプロットする.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 およびその任意の導関数を評価したステップおよび点を fx のプロットに重ねてプロットする.opts にはFindRootおよびPlotのオプションを使うことができる
FindRootPlot[f,{{x,xst},{y,yst}},opts]FindRoot[f,{{x,xst},{y,yst}}]において,関数 f およびその任意の導関数を評価したステップおよび点を xy の関数としてのメリット関数 f の等高線プロットに重ねてプロットする.opts にはFindRootおよびContourPlotのオプションを使うことができる

検索データのプロット

関数 f の処理を簡潔にし,起る可能性のある混乱を避けるために,FindRootPlotは方程式を取らず,根 f=0を見付ける.  

ステップおよび評価点は,簡単に見分けられるよう,以下のように色分けしてある.

  • ステップは青い線と青い点で示す.
  • 関数の評価は,緑の点で示す.
  • 勾配の評価は,赤い点で示す.
  • ヘッセ行列の評価は水色の点です.
  • 剰余関数の評価は黄色い点で示す.
  • ヤコビ行列の評価は,紫の点で示す.
  • 検索の終了は,大きい黒い点で示す.

FindMinimumPlotFindRootPlotは,デフォルトの引数 "Plot"を使ってステップのプロットを返す.

引数"SolutionData"を使うFindMinimumPlotFindRootPlotは,キーが{Plot,Solution,Statistics}Associationを返す.ここで:

  • Plot は表示されるグラフィックオブジェクトである.
  • SolutionFindMinimumまたはFindRootの結果である.
  • Statistics は関数のステップ数,評価回数,その導関数を示す規則のリストである.
パッケージをロードする:
以下は,点から開始して,関数の極小値を見付ける際に,FindMinimumが使用するステップと評価を2Dで示したものである.等高線が表示されず,関数値がグレースケールで示されるよう,ContourPlotにオプションが与えられている.FindMinimumはデフォルトで「準ニュートン」法を使うので,同じ点で起る関数と勾配の評価だけが表示される.これは緑を中心とする赤い円で示されている:
以下は,点から開始して関数の極小値を見付ける際に,FindMinimumが使用するステップと評価を2Dで示したものである.この問題は平方和なので,FindMinimumは剰余関数を導出した上で,それとその関数のヤコビ行列だけを評価する「ガウス・ニュートン」/LevenbergMarquardt法をデフォルトで使う.剰余関数が評価される点は,黄色い点で示されている.大きい紫の輪で囲まれている黄色い点は,ヤコビ行列も評価された点であることを示す:
以下は,点から開始して,「ニュートン」法で関数の極小値を求める際に,FindMinimumが使用するステップと評価を2Dで表示したものである.関数,勾配,ヘッセ行列がすべて評価された点は,同心の緑,赤,水色の円で示されている.この例ではすべてのニュートンステップがWolfe条件を満足したので,ヘッセ行列とは別に関数と勾配が評価された点は存在しないということに注意する.しかしこのようなことが常にあるわけではない.また,ニュートン法がデフォルトのメソッドとは異なる極小値を見付けるということにも注意する:
以下は,2つの初期値が関数のプロットに重なっている関数 の極小値を求めるために,FindMinimumが使用するステップと評価を示したものである.関数を表す曲線が,太く紫で表示されるよう,Plotにオプションが与えてある.初期値が2つあると,FindMinimumは導関数なしの主軸法を使うので,関数の評価しかない.これは緑の点で示されている:
以下は,点から開始して関数の極小値を求める際に,FindRootが使用するステップと評価を2Dで表示したものである.前述の通り関数は剰余関数であり,FindRootのデフォルトメソッドは,黄色の点と紫の円で示されている通り,剰余関数とそのヤコビ行列を評価する.このプロットは,関数に対してFindMinimumPlotのデフォルトメソッドを使って生成されるものとほとんど同じである.それは,剰余関数が同じだからである.FindRootPlotも剰余関数の各要素のゼロ等高線を赤と緑で示す:

テスト問題

[MGH81]で示されているテスト問題はすべてWolfram言語にコード化され,Optimization`UnconstrainedProblems`パッケージに入っている.解およびFindMinimumFindRootを使ったテストのために問題がシームレスに処理されるよう,データ構造が使われている.FindMinimumおよびFindRootの問題のリストはそれぞれ$FindMinimumProblems$FindRootProblemsに含まれており,問題にはGetFindMinimumProblemGetFindRootProblemを使ってアクセスすることができる.

$FindMinimumProblemsFindMinimumに適した問題のリスト
GetFindMinimumProblem[prob]デフォルトのサイズと初期値を使った問題 probFindMinimumProblemデータ構造で得る
GetFindMinimumProblem[prob,{n,m}]m 個の平方の和となるような n 個の変数を持つ問題 probFindMinimumProblemデータ構造で得る
GetFindMinimumProblem[prob,size,start]
指定されたサイズ size と初期値 start を持つ問題 probFindMinimumProblemデータ構造で得る
FindMinimumProblem[f,vars,opts,prob,size]
FindMinimumが解く最小化問題を含むデータ構造

FindMinimum問題へのアクセス

$FindRootProblemsFindRootに適切な問題のリスト
GetFindRootProblem[prob]デフォルトのサイズと初期値を使った問題 probFindRootProblemデータ構造で得る
GetFindRootProblem[prob,n]n 個の変数(と n 個の方程式)を持つ問題 probFindRootProblemデータ構造で得る
GetFindRootProblem[prob,n,start]サイズ n,初期値 start を持つ問題 probFindRootProblemデータ構造で得る
FindRootProblem[f,vars,opts,prob,size]
FindRootが解く最小化問題を含むデータ構造

FindRoot問題へのアクセス

GetFindMinimumProblemGetFindRootProblemは共に,他のコマンドが使用するオプションを渡す.また,これらは問題に対して使用する変数を指定するために使われるVariables->vars オプションを取る.

オプション名
デフォルト値
VariablesX#& 変数の問題,あるいはその変数を含む長さ のリストのための変数を生成するために,整数 に適用する関数

変数名の指定

パッケージをロードする:
ビール問題をFindMinimumProblemデータ構造で取り出す:
パウエルの特異関数問題をFindRootProblemデータ構造で取り出す:

一旦FindMinimumProblemあるいはFindRootProblemオブジェクトを入手すると,ただ問題を解く以外にもさまざまなテストを実行することができる.

ProblemSolve[p,opts]p についての問題を解き,FindMinimumFindRootと同じ出力を与える
ProblemStatistics[p,opts]問題を解き,リスト{{sol,stats}}を与える.ここで solProblemSolve[p] の出力,evals はステップと評価に使われた数を示す規則のリストである
ProblemTime[p,opts]問題を解き,リスト{{sol,Time->time}}を与える.ここで solProblemSolve[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に直接渡されるオプションを取り,問題が設定されたときに指定されていたこれらの関数のオプションを上書きすることができる.

FindRootを使ってパウエルの特異関数問題を解き,根を与える:
上と同様の動作をするが,必要なステップ数や評価回数に関する統計を含んでいる:
FindMinimumを使ってビール問題を解き,問題を解くのにかかる平均時間を求めるために,数回の試行にかかった時間を平均する:
FindMinimumを使ってビール問題を解き,その結果と参照解を比較し,テストの結果を示す規則のリストを与える:

ProblemTestは,同じ問題に対する2つの異なるメソッドを簡単に比較することができる.

FindMinimum「ニュートン」法を使ってビール問題を解き,その結果と参照解を比較し,テストの結果を示す規則のリストを与える:

これらの関数によって返される規則のほとんどは自己説明的であるか,記述が必要なものもある.以下はそのような規則を明確にする表である.

"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オブジェクトを設定し,問題のテストをメソッドのリストにマップすることにより,簡単に実行することができる.

Chebyquad問題を取り出す.スペースを節約するために,出力が短縮されている:
以下が可能なメソッドのリストである:
これで,異なるメソッドを正確さと計算時間について比較する表を作成する:

$FindMinimumProblemsあるいは$FindRootProblemsの名前にマップすることにより,ある特定のメソッドがさまざまな問題に対してどのように作用するかを示す表を作成することが可能である.

FindMinimumでデフォルト設定を使って,問題をテストする関数を設定する.しかし,デフォルトのLevenbergMarquardtメソッドが収束できるよう,MaxIterationsの設定だけは大きくする:
$FindMinimumProblemsの問題すべてをテストした結果の一部を示す表を作成する.実行するのに数分かかることがある:

空間精度が2ヶ所ERRORと表示されているが,これらは線形問題で,単独の最小化関数がないためである.また,非常に低い空間精度を持つものが1つあり,これは複数の最小化関数を持つので,メソッドは参照の最小値とは異なる最小値に行ってしまう.これらの関数の多くは複数の極小値を持つので,メソッドが参照の最小値とは異なる最小値に行ったという理由だけでエラーが報告される可能性があるということに気を付けなければならない.