Main Content

アルゴリズムの選択

fmincon アルゴリズム

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

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

  • 'trust-region-reflective'

  • 'sqp'

  • 'sqp-legacy'

  • 'active-set'

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

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

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

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

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

詳細については、内点法アルゴリズムによる精度低下の可能性についてを参照してください。

推奨の理由

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

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

  • 'sqp-legacy''sqp' に類似していますが、通常、より低速で、さらに多くのメモリを使用します。

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

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

各アルゴリズムの説明については、制約付き非線形最適化アルゴリズムを参照してください。

fsolve アルゴリズム

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

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

  • 'trust-region'

  • 'levenberg-marquardt'

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

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

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

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

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

推奨の理由

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

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

各アルゴリズムの説明については、方程式を解くためのアルゴリズムを参照してください。

fminunc アルゴリズム

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

  • 'quasi-newton' (既定の設定)

  • 'trust-region'

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

推奨
  • 目的関数が勾配を含む場合は、'Algorithm' = 'trust-region' を使用して、SpecifyObjectiveGradient オプションを true に設定します。

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

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

各アルゴリズムの説明については、制約なし非線形最適化アルゴリズムを参照してください。

最小二乗アルゴリズム

lsqlin

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

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

  • 'trust-region-reflective'

  • 'active-set'

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

推奨
  • 最初に 'interior-point' を試行します。

    ヒント

    入力行列 C の非ゼロ入力の割合が高い場合に、より優れたパフォーマンスを得るには、C を通常の double 行列として指定します。同様に、C の非ゼロ入力が比較的少ない場合に、より優れたパフォーマンスを得るには、C をスパースとして指定します。データ型の詳細については、スパース行列を参照してください。'LinearSolver' オプションを使用すると、内部的な線形代数タイプを設定することもできます。

  • 制約がない場合または範囲制約のみの場合に、より高い精度、速度が必要な場合または 線形最小二乗付きヤコビ乗算関数 を使用するには、'trust-region-reflective' を試行します。

  • 多数の線形制約があるものの変数の数は多くない場合は、'active-set' を試してください。

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

詳細については、内点法アルゴリズムによる精度低下の可能性についてを参照してください。

各アルゴリズムの説明については、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。

lsqcurvefit と lsqnonlin

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

  • 'trust-region-reflective' (制約なし問題または範囲制約付き問題の既定値)

  • 'levenberg-marquardt'

  • 'interior-point' (線形制約または非線形制約がある問題の既定値)

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

推奨
  • 範囲制約のみをもつ問題の場合は、まず 'trust-region-reflective' または 'levenberg-marquardt' を試します。

  • 範囲制約付きが劣決定 (次元より方程式が少ない) の場合は、まず 'levenberg-marquardt' を試します。

  • 問題に線形制約または非線形制約がある場合は、'interior-point' を使用します。

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

各アルゴリズムの説明については、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。

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

linprog には 4 つのアルゴリズムがあります。

  • 'dual-simplex-highs' (既定の設定)

  • 'dual-simplex-legacy'

  • 'interior-point'

  • 'interior-point-legacy'

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

推奨

最初に 'dual-simplex-highs' アルゴリズム、'dual-simplex-legacy' アルゴリズム、または 'interior-point' アルゴリズムを使用します。問題に対して、どのアルゴリズムがより効果的に動作するかを判断するのは困難です。

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

詳細については、内点法アルゴリズムによる精度低下の可能性についてを参照してください。

推奨の理由

  • 多くの場合、'dual-simplex-highs' アルゴリズム、'dual-simplex-legacy' アルゴリズム、および 'interior-point' アルゴリズムは高速であり、使用するメモリが比較的少なくなります。

  • 'interior-point-legacy' アルゴリズムは 'interior-point' に類似していますが、'interior-point-legacy' では速度やロバスト性が低下したり、メモリ使用量が増加したりすることがあります。

各アルゴリズムの説明については、線形計画法のアルゴリズムを参照してください。

混合整数線形計画法のアルゴリズム

intlinprog には 2 つのアルゴリズムがあります。

  • 'highs' (既定の設定)

  • 'legacy'

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

推奨

最初に 'highs' アルゴリズムを使用します。

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

推奨の理由

  • 多くの場合、'highs' アルゴリズムの方が 'legacy' アルゴリズムよりも速いか、よりうまく動作します。

  • 'highs' アルゴリズムの方が調整オプションが大幅に少なくなっています。そのため、問題を解くときの選択項目が少なくて済みます。

  • 'legacy' アルゴリズムは将来のリリースで削除される予定です。

各アルゴリズムの説明については、混合整数線形計画法 (MILP) アルゴリズムを参照してください。

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

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

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

  • 'trust-region-reflective'

  • 'active-set'

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

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

  • ヒント

    ヘッセ行列 H の非ゼロ入力の割合が高い場合に、より優れたパフォーマンスを得るには、H を通常の double 行列として指定します。同様に、H の非ゼロ入力が比較的少ない場合に、より優れたパフォーマンスを得るには、H をスパースとして指定します。データ型の詳細については、スパース行列を参照してください。'LinearSolver' オプションを使用すると、内部的な線形代数タイプを設定することもできます。

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

  • 多数の線形制約があるものの変数の数は多くない半正定値問題の場合は、'active-set' を試してください。

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

詳細については、内点法アルゴリズムによる精度低下の可能性についてを参照してください。

各アルゴリズムの説明については、二次計画法のアルゴリズムを参照してください。

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

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

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

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

内点法アルゴリズムによる精度低下の可能性について

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

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

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

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

  • 内点法の求解から始め、別のアルゴリズムを実行します。一部のアルゴリズムでは大量のメモリや長時間を要することがあり、また、すべての 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-legacy アルゴリズムを使用して同じ問題を解きます。

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

   2.0833e-13

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

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

     0

これらの場合、内点法アルゴリズムで精度は低下しますが、正しい解にきわめて近くなっています。