ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ソルバーの選択

最適化の意思決定表

以下の表はソルバーの選択に役立つように設計されています。この表は、多目的関数をもつ最適化や方程式を解く問題には用いません。以下のすべてのソルバーの詳細は Optimization Toolbox の関数が扱う問題 を参照してください。

以下のように表を利用してください。

  1. 目的関数を以下の 5 つのタイプの中から識別します。

    • 線形

    • 二次

    • 二乗和 (最小二乗)

    • 滑らかな非線形

    • 滑らかでない

  2. 制約を 5 つのタイプの中から識別します。

    • なし (制約なし)

    • 範囲

    • 線形 (範囲を含む)

    • 一般的な滑らか

    • 離散 (整数)

  3. 関連するソルバーを識別するために以下の表を使用してください。

この表では以下のようになります。

  • * は、関係するソルバーが 「Global Optimization Toolbox」の関数 (ライセンスは Optimization Toolbox™ の他に別途必要です) の中にあることを意味します。

  • 最も滑らかな目的関数に fmincon は滑らかな制約を適用します。表にリストされたソルバーの方が一般的に効率が良いため、fmincon は最小二乗と線形/二次計画法の推奨ソルバーとしてリストされていません。

  • この表には推奨する関数が示されていますが、選択の幅を過度に制限するものではありません。たとえば、fmincon は、滑らかでない一部の問題に効果的な場合があります。

  • Global Optimization Toolbox の関数 ga では、混合整数計画問題を扱うことができます。

目的関数と制約のソルバー

制約タイプ 目的タイプ
線形二次最小二乗法滑らかな非線形滑らかでない
なしn/a (f = const、または min = )quadprog「情報」\lsqcurvefitlsqnonlin「情報」fminsearchfminunc「情報」fminsearch, *
範囲linprog「情報」quadprog「情報」lsqcurvefitlsqlinlsqnonlinlsqnonneg「情報」fminbndfminconfseminf「情報」fminbnd, *
線形linprog「情報」quadprog「情報」lsqlin「情報」fminconfseminf「情報」*
一般的な滑らかfmincon「情報」fmincon「情報」fmincon「情報」fminconfseminf「情報」*
離散intlinprog「情報」****

    メモ:    この表は、多目的関数のソルバーと方程式を解くソルバーはリストしていません。Optimization Toolbox の関数が扱う問題の全リストは Optimization Toolbox の関数が扱う問題 を参照してください。

    メモ:    一部のソルバーは複数のアルゴリズムをもっています。選択については、アルゴリズムの選択を参照してください。

アルゴリズムの選択

fmincon アルゴリズム

fmincon には、次の 4 つのアルゴリズム オプションがあります。

  • 'interior-point' (既定の設定)

  • 'trust-region-reflective'

  • 'sqp'

  • 'active-set'

optimoptions を使用して、コマンド ラインから Algorithm オプションを設定します。

推奨
  • 最初に 'interior-point' アルゴリズムを使用します。

    最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

  • 最適化を再度実行して小規模または中規模の問題に対するスピードを上げるには、次に 'sqp' を、最後に 'active-set' を試してください。

  • 適用可能なら 'trust-region-reflective' を使用します。問題においては、目的関数に勾配と制約が含まれ、制約条件は範囲のみか線形等式のみ (両方は不可) でなければなりません。

内点法アルゴリズムで精度が落ちる可能性」を参照してください。

推奨の理由-  

  • 'interior-point' は大規模なスパース問題と小規模な密問題を処理します。このアルゴリズムは、すべての反復で範囲を満たし、NaN または Inf の結果から回復できます。これは大規模なアルゴリズムです。大規模と中規模のアルゴリズムを参照してください。このアルゴリズムは、大規模な問題に対して特別な手法を使用できます。詳細については、Interior-Point アルゴリズム を参照してください。

  • 'sqp' はすべての反復で範囲を満たします。このアルゴリズムは、NaN または Inf の結果から回復できます。これは大規模なアルゴリズムではありません。大規模と中規模のアルゴリズムを参照してください。

  • 'active-set' は大きなステップを取ることができるので、高速に処理可能です。このアルゴリズムは、滑らかでない制約をもつ一部の問題に対して効果的です。これは大規模なアルゴリズムではありません。「大規模と中規模のアルゴリズム」を参照してください。

  • 'trust-region-reflective' は、勾配を与えることを必要とし、範囲のみまたは線形等式制約のみ (ただし両方ではない) が可能です。これらの制限内でならば、このアルゴリズムは大規模なスパース問題と小規模な密問題を効果的に扱うことができます。これは大規模なアルゴリズムです。「大規模と中規模のアルゴリズム」を参照してください。このアルゴリズムは、ヘッセの乗算関数など、特別な手法を使用してメモリ使用量を節約できます。詳細については、信頼領域 Reflective 法アルゴリズム を参照してください。

fsolve アルゴリズム

fsolve は次の 3 つのアルゴリズムをもっています。

  • 'trust-region-dogleg' (既定の設定)

  • 'trust-region-reflective'

  • 'levenberg-marquardt'

optimoptions を使用して、コマンド ラインで Algorithm オプションを設定します。

推奨
  • 最初に 'trust-region-dogleg' アルゴリズムを使用します。

    fsolve が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

  • ヤコビ行列の乗算関数をもっている場合、または内部アルゴリズムを微調整したい場合 (信頼領域 Reflective 法アルゴリズムのみを参照) に、再び方程式を解くには、'trust-region-reflective' を試してください。

  • 'levenberg-marquardt' を含めてすべてのアルゴリズムの時間を測定してみて、自分の問題に最も適したアルゴリズムを探してください。

推奨の理由-  

  • 'trust-region-dogleg' は、非線形方程式を解くために特別に設計された唯一のアルゴリズムです。その他は、この関数の二乗和を最小にするよう試みます。

  • 'trust-region-reflective' アルゴリズムは、スパース問題に対して効果的です。このアルゴリズムは、大規模な問題に対して、ヤコビ行列の乗算関数などのような特別な手法を使用できます。

fminunc アルゴリズム

fminunc は次の 2 つのアルゴリズムをもっています。

  • 'trust-region' (以前の LargeScale = 'on')、既定値

  • 'quasi-newton' (以前の LargeScale = 'off')

optimoptions を使用して、コマンド ラインで Algorithm オプションを設定します。

推奨
  • 目的関数が勾配を含む場合は、'Algorithm' = 'trust-region' を使用します。

  • そうでない場合は 'Algorithm' = 'quasi-newton' を使用します。

最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

最小二乗アルゴリズム

lsqlin-  lsqlin は次の 2 つのアルゴリズムをもっています。

  • 'trust-region-reflective' (以前の LargeScale = 'on')、既定値

  • 'active-set' (以前の LargeScale = 'off')

optimoptions を使用して、コマンド ラインで Algorithm オプションを設定します。

推奨
  • 制約がない場合または範囲制約のみの場合は、'trust-region-reflective' を使用します。

  • 線形制約がある場合は、'active-set' を使用します。

最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

lsqcurvefit と lsqnonlin-  lsqcurvefitlsqnonlin は次の 2 つのアルゴリズムをもっています。

  • 'trust-region-reflective' (既定の設定)

  • 'levenberg-marquardt'

optimoptions を使用して、コマンド ラインで Algorithm オプションを設定します。

推奨
  • 制約がない場合または範囲制約のみの場合は、'trust-region-reflective' を使用します。

  • 問題が劣決定の場合 (次元に比べて方程式が少ない場合) は、'levenberg-marquardt' を使用します。

最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

線形計画法のアルゴリズム

linprog は次の 3 つのアルゴリズムをもっています。

  • 'interior-point' (以前の LargeScale = 'on')、既定値

  • 'active-set' (以前の LargeScale = 'off')

  • 'simplex' (以前の LargeScale = 'off'Simplex = 'on')

optimoptions を使用して、コマンド ラインから Algorithm オプションを設定します。

推奨

interior-point アルゴリズムを使用します。

最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

内点法アルゴリズムで精度が落ちる可能性」を参照してください。

二次計画法のアルゴリズム

quadprog は次の 3 つのアルゴリズムをもっています。

  • 'interior-point-convex' (既定の設定)

  • 'trust-region-reflective' (以前の LargeScale = 'on')

  • 'active-set' (以前の LargeScale = 'off')

optimoptions を使用して、コマンド ラインで Algorithm オプションを設定します。

推奨
  • 凸問題の場合や問題が凸であるかどうかわからない場合には、'interior-point-convex' を使用します。

  • 範囲のみまたは線形等式のみをもつ非凸問題の場合は、'trust-region-reflective' を使用します。

  • 'trust-region-reflective' の制約を満たさない非凸問題の場合は、'active-set' を使用します。

最小化が失敗した場合のヘルプは、ソルバーが失敗したときまたはソルバーが成功した可能性がある場合を参照してください。

内点法アルゴリズムで精度が落ちる可能性」を参照してください。

大規模と中規模のアルゴリズム

非スパース行列を保存したり、演算する必要がない線形代数を使用する場合、最適化アルゴリズムは大規模になります。内部の計算処理では可能な限り、スパース行列を用いた保存やスパース線形代数を用いた演算を行います。さらに内部アルゴリズムはスパース コレスキー因子などのようなスパース性を維持し、共役勾配法のように行列を生成することはありません。

一方、中規模メソッドは非スパース行列を内部的に作成し、密な線形代数を利用します。問題が十分に大きい場合、非スパース行列はメモリを大量に消費し、密な線形代数を計算するのに時間がかかります。

「大規模」という名前に間違った印象をもたないでください。大規模アルゴリズムは小規模な問題にも使用できます。また、大規模アルゴリズムを使用するためにスパース行列を指定する必要はありません。制約タイプを追加するなどの追加機能にアクセスする場合は、中規模を選択してください。パフォーマンスが向上する場合があります。

内点法アルゴリズムで精度が落ちる可能性

fminconquadprog および linprog の内点法アルゴリズムには、メモリの消費量が少ないことや、大規模な問題をすばやく解決できるなど、多くの利点があります。ただし、その解は他のアルゴリズムの解と比較して精度がやや落ちる可能性があります。潜在的な精度の低下の原因は、内部計算されるバリア関数によって、反復が不等式制約の境界から遠ざけられるためです。

実際に多くの場合、この精度の低下は非常に小さなものです。

精度の低下を抑えるには、以下を試してください。

  • TolXTolFun、また場合によっては TolCon の許容誤差を小さくしてソルバーを再実行します (ただし、妥当な許容誤差は維持してください)。「許容誤差と停止条件」を参照してください。

  • 内点法の求解から始め、別のアルゴリズムを実行します。一部のアルゴリズムでは大量のメモリや長時間を要することがあり、また、一部の linprog アルゴリズムや quadprog アルゴリズムは初期点を受け入れないため、この方法は失敗することがあります。

たとえば、下限が 0 という制約で関数 x を最小化してみます。まず、fmincon interior-point アルゴリズムを使用します。

options = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x =

   2.0000e-08

fmincon sqp アルゴリズムを使用すると次のようになります。

options.Algorithm = 'sqp';
x2 = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x2 =

   0

同様に、linprog interior-point アルゴリズムを使用して同じ問題を解きます。

opts = optimoptions(@linprog,'Display','off','Algorithm','interior-point');
x = linprog(1,[],[],[],[],0,[],1,opts)
x =

   2.0833e-13

linprog simplex アルゴリズムを使用すると次のようになります。

opts.Algorithm = 'simplex';
x2 = linprog(1,[],[],[],[],0,[],1,opts)
x2 =

     0

これらの場合、interior-point アルゴリズムで精度は低下しますが、正しい解に極めて近くなっています。

Optimization Toolbox の関数が扱う問題

以下の表は、最小化問題、方程式を解く問題、多目的関数の最適化問題、最小二乗問題、データ近似問題で使用できる関数を示します。

最小化問題

種類定式化ソルバー

スカラー最小化

minxf(x)

条件 lb < x < ub (x はスカラー)

fminbnd

制約なし最小化

minxf(x)

fminunc,
fminsearch

線形計画法

minxfTx

条件 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

linprog

混合整数線形計画法

minxfTx

条件 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub、x(intcon) は整数値です。

intlinprog

二次計画法

minx12xTHx+cTx

条件 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

quadprog

制約付き最小化

minxf(x)

条件 c(x) ≤ 0、 ceq(x) = 0、 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

fmincon

半無限最小化

minxf(x)

条件   すべての  w に対して K(x,w) ≤ 0、 c(x) ≤ 0、 ceq(x) = 0、 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

fseminf

多目的関数の問題

種類定式化ソルバー

ゴール到達

minx,γγ

条件 F(x) – w·γ ≤ goal、 c(x) ≤ 0、 ceq(x) = 0、 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

fgoalattain

ミニマックス

minxmaxiFi(x)

条件 c(x) ≤ 0、 ceq(x) = 0、 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

fminimax

方程式を解く問題

種類定式化ソルバー

線形方程式

C·x = d、n 個の方程式、n 個の変数

\ (行列の左除算)

1 変数の非線形方程式

f(x) = 0

fzero

非線形方程式

F(x) = 0、n 個の方程式、n 個の変数

fsolve

最小二乗 (モデル近似) の問題

種類定式化ソルバー

線形最小二乗法

minx12Cxd22

m 個の方程式、n 個の変数

\ (行列の左除算)

非負の線形最小二乗法

minx12Cxd22

条件 x ≥ 0

lsqnonneg

制約付き線形最小二乗法

minx12Cxd22

条件 A·x ≤ b、 Aeq·x = beq、 lb ≤ x ≤ ub

lsqlin

非線形最小二乗法

minxF(x)22=minxiFi2(x)

条件 lb ≤ x ≤ ub

lsqnonlin

非線形曲線近似

minxF(x,xdata)ydata22

条件 lb ≤ x ≤ ub


lsqcurvefit

この情報は役に立ちましたか?