ソルバーの時間がかかりすぎる
ソルバーの時間がかかりすぎる理由はいろいろあります。理由を診断したり、より高速な解法を有効にするには、以下の 1 つ以上の手法を試します。
反復表示の有効化
Display
オプションを 'iter'
に設定します。この設定により、ソルバー反復の結果が表示されます。
MATLAB® コマンド ラインで反復表示を有効にするには、次を入力します。
options = optimoptions('solvername','Display','iter');
options
構造体を使用して、ソルバーを呼び出します。
反復表示の例については、結果の解釈を参照してください。詳細については、反復表示内で何を探すかを参照してください。
適切な許容誤差を使用
許容誤差、特に OptimalityTolerance
と StepTolerance
が小さすぎると、ソルバーは収束に失敗することがあります。
コマンド ラインで許容誤差を変更するには、最適化オプションの設定と変更で説明するように、関数 optimoptions
を使用します。
プロット関数を使用
プロット関数を使用して、ソルバー反復に関するより視覚的またはより詳しい情報を得ることができます。選択したソルバーの関数リファレンス ページにある「オプション」セクションにプロット関数が一覧表示されています。
MATLAB コマンド ラインでプロット関数を使用するには、次を入力します。
options = optimoptions('solvername','PlotFcn',{@plotfcn1,@plotfcn2,...});
options
構造体を使用して、ソルバーを呼び出します。
プロット関数の使用例については、定義済みプロット関数の使用 を参照してください。
'lbfgs' HessianApproximation
オプションの使用
fmincon
ソルバーおよび fminunc
ソルバーでは、多数 (数百個以上) の変数が問題に含まれている場合、HessianApproximation
オプションを 'lbfgs'
に設定することにより、しばしば時間とメモリを節約できます。これにより、fmincon
の 'interior-point'
アルゴリズムおよび fminunc
の 'quasi-newton'
アルゴリズムで低メモリのヘッセ近似が使用されます。詳細については、多くの変数を使用した非線形問題の求解を参照してください。
checkGradients
を使用した導関数の検証
導関数 (勾配またはヤコビアン) をソルバーに与えると、その導関数が不正確な場合は、ソルバーが収束に失敗する可能性があります。関数 checkGradients
の使い方については、勾配またはヤコビアンの有効性を確認を参照してください。
任意の大きな境界値の代わりに Inf を使用
任意の大きな境界値 (上限または下限) を使用すると、ソルバーで過度に時間がかかり、場合によっては収束しないことがあります。しかし、境界値として Inf
または -Inf
を設定すれば、ソルバーでかかる時間が短縮され、うまく収束する場合があります。
この理由について説明しましょう。内点法アルゴリズムは初期点を有限範囲の中間点に設定できます。つまり、内点法アルゴリズムでは有限範囲の中ほどに「中央パス」の検出を試みることができます。このため、任意の大きな境界値ではこれらの成分の大きさが不適切に変更されることがあります。一方で、この目的では無限境界値は無視されます。
重要性は低いですが、一部のソルバーでは各制約に対し、主に制約ヘッシアンによってメモリを使用します。境界値を Inf
または -Inf
に設定することは制約がないことを意味するため、制約ヘッシアンの次元は低く、使用されるメモリが少なくなります。
出力関数の使用
出力関数を使用して、ソルバー反復に関する詳しい情報を得ることができます。ソルバーは反復ごとに出力関数を呼び出します。出力関数とプロット関数の構文で説明するように、構文を使用して出力関数を記述します。
出力関数の使用例については、Optimization Toolbox の出力関数 を参照してください。
さまざまなアルゴリズム オプションの試行
多くのソルバーには、求解時間を変化させる可能性のあるオプションがありますが、どう変化するかは容易に予測できません。一般的に Algorithm
オプションは求解時間に顕著な影響を及ぼします。
求解時間に影響を及ぼす他のオプションには次のようなものがあります。
fmincon
の'interior-point'
アルゴリズム —BarrierParamUpdate
オプションを'predictor-corrector'
に設定して試します。'trust-region'
または'trust-region-reflective'
アルゴリズムの'SubproblemAlgorithm'
オプション —'SubproblemAlgorithm'
を既定の'cg'
の代わりに'factorization'
に設定して試します。coneprog
— 大規模なスパース問題では、LinearSolver
オプションを'prodchol'
、'schur'
、または'normal'
に設定して試します。密な問題では、LinearSolver
オプションを'augmented'
に設定して試します。quadprog
の'interior-point-convex'
アルゴリズムまたはlsqlin
の'interior-point'
アルゴリズム —LinearSolver
オプションを'sparse'
または'dense'
に設定して試します。
スパース ソルバーまたは乗算関数の使用
大きい問題は、MATLAB のメモリ不足か時間不足の原因になる可能性があります。以下に、メモリを減らす方法を挙げます。
可能な場合は、大規模なアルゴリズムを使用します (大規模アルゴリズムと中規模アルゴリズムを参照)。これらのアルゴリズムには
trust-region-reflective
、interior-point
、fminunc
trust-region
アルゴリズム、fsolve
trust-region-dogleg
アルゴリズム、Levenberg-Marquardt
アルゴリズムなどが含まれます。これに対し、active-set
、quasi-newton
およびsqp
のアルゴリズムは大規模なアルゴリズムではありません。ヒント
大規模アルゴリズムを使用している場合は、線形制約のためにスパース行列を使用します。
ヤコビ乗算関数またはヘッセ乗算関数を使用します。例については、線形最小二乗付きヤコビ乗算関数、密な構造化されたヘッシアンを使った二次最小化、および密に構造化されたヘッシアンと線形等式を使用した最小化を参照してください。
並列計算の使用
Parallel Computing Toolbox™ ライセンスを保有する場合、並列計算を使用するとソルバーをより高速に実行できるかもしれません。詳細については、並列計算を参照してください。