主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ソルバーが失敗する場合

過剰な反復または関数評価

目的関数が要求された許容誤差に最小化される前に,反復または関数評価の回数が上限に達したため,ソルバーは停止しました。継続するには,以下の1つまたはいくつかを試してください。

1 .反復表示の有効化
2 .許容誤差の緩和
3 .異なる点からソルバーを開始
4 .目的関数と制約関数の定義を確認
5 .問題のセンタリングとスケーリング
6 .勾配またはヤコビアンの指定
7 .ヘッシアンの供給

1 .反復表示の有効化

显示オプションを“通路”に設定します。この設定により,ソルバー反復の結果が表示されます。

MATLAB®コマンドラインで反復表示を有効にするには,次を入力します。

选择= optimoptions(“solvername”,“显示”,“iter”);

选项構造体を使用して,ソルバーを呼び出します。

反復表示の例については,結果の解釈を参照してください。

反復表示内で何を探すか

  • 目的関数 (Fvalf (x)Resnorm)が減少するかどうかを観察します。減少すれば,進行していることを示します。

  • それが確実に0に減少するように,制約違反(马克斯约束)を調べます。減少すれば,進行していることを示します。

  • 1次の最適性が0に向かって減少するかどうかを観察します。減少すれば,進行していることを示します。

  • 信赖域半径が小さい値に減少するかどうか観察します。この減少は,対象が滑らかでないかもしれないことを示します。

何をすべきか

  • ソルバーが進行していると思われる場合:

    1. MaxIterationsMaxFunctionEvaluationsを既定値よりも大きく設定します。ソルバーの関数リファレンスページにあるオプションの表で既定値を確認できます。

    2. その最後に計算された点からソルバーを開始します。

  • ソルバーが進行していない場合は,リストされている他の推奨操作を試してください。

2 .許容誤差の緩和

たとえば,StepToleranceOptimalityTolerance,いが小さすぎるとつそれが最小値に達したかをソルバーが認識しないかもしれません。無制限に無益な反復を行う可能性があります。

コマンドラインで許容誤差を変更するには,オプションの設定と変更で説明するように,関数optimoptionsを使用します。

FiniteDifferenceStepSizeオプション(または,DiffMaxChangeおよびDiffMinChangeオプション)はソルバーの進行に影響する可能性があります。これらのオプションは,導関数値推定のための有限差分のステップサイズを制御します。

3 .異なる点からソルバーを開始

“初期点の変更“を参照してください。

4 .目的関数と制約関数の定義を確認

たとえば,目的関数と非線形制約関数が任意の点で正しい値を返すことを確認します。“目的関数と制約関数の確認”を参照してください。実行不可能な点で関数がエラーを起こさないことを確認します。反復は制約に違反する可能性ありを参照してください。

5 .問題のセンタリングとスケーリング

各座標が目的関数と制約関数にほぼ同じ影響を与える場合に,ソルバーはより高い信頼性をもって機能します。座標軸の各方向に適切なスカラーを乗算することにより各座標の影響を均等化します。適切な値を特定の座標に追加し,それらのサイズを均等化します。

例:センタリングとスケーリング-1 e6 * x (1) ^ 2 + 1 e-6 * x (2) ^ 2の最小化を考えます。

F = @(x) 10^6*x(1)^2 + 10^-6*x(2)^2;

fminunc“拟牛顿”アルゴリズムを使用してfを最小化します。

选择= optimoptions(“fminunc”,“显示”,“没有”,“算法”,“拟牛顿”);X = fminunc(f,[0.5;0.5],opts) X = 0 0.5000

結果は正しくありません。不適切なスケーリングにより良い解の取得が妨げられました。

問題をスケーリングします。次を設定します

D =诊断接头([1 e - 3, 1 e3]);fr = @(y) f(D*y);Y = fminunc(fr, [0.5;0.5], opts) Y = 0 0 %正确答案

同様に,不適切なセンタリングにより解が妨げられる可能性があります。

fc = @ (z) fr ([z z (1) 1 e6; (2) + 1 e6));%定心不正z = fminunc(fc,[。5 .5] z = 1.0e+005 * 10.0000 -10.0000 %看起来不错,但是…Z - [1e6 -1e6] %检测Z与1e6的距离ans = -0.0071 0.0078 %显示距离FCC = @(w)fc([w(1)+1e6;w(2)-1e6]);%居中w = fminunc(fcc,[。5],选择)w = 0 %正确的答案

6 .勾配またはヤコビアンの指定

勾配またはヤコビアンが提供されない場合,ソルバーは有限差分法によって勾配とヤコビアンを推定します。つまり,これらの導関数を提供することにより,計算時間の節約や精度の向上が期待できます。問題ベースのアプローチは,自動的に勾配を提供できます。优化工具箱の自動微分を参照してください。

制約問題の場合は,勾配を与えることで別の利点があります。ソルバーは,xそれ自体は実行可能だが,xの周囲の有限差分は常に実行不可能な点へ導くような点xに到達することがあります。この場合,ソルバーは失敗するか途中で停止する可能性があります。勾配を与えることで,ソルバーは続行できます。

目的関数と非線形制約関数を定義するファイル内に,勾配またはヤコビアンも与えます。構文についての詳細は,スカラー目的関数の記述ベクトルと行列の目的関数の記述および非線形制約を参照してください。

勾配またはヤコビアンの有効性を確認で説明されているように,勾配またはヤコビ関数が正しいことを確認するにはCheckGradientsオプションを使用します。

符号数学工具箱™のライセンスをお持ちの場合は,プログラミングによって勾配とヘッシアンを計算することができます。例については,符号数学工具箱™を使用した勾配とヘッシアンの計算を参照してください。

勾配とヤコビアンを使用している例は,勾配およびヘッシアンを使った最小化勾配付き非線形制約符号数学工具箱™を使用した勾配とヘッシアンの計算ヤコビアンを使用した場合と使用しない場合の非線形系の解法,およびヤコビアンを使用した非線形方程式の大規模スパース系を参照してください。問題ベースのアプローチの自動微分については,問題ベースの最適化における自動微分の効果を参照してください。

7 .ヘッシアンの供給

ヘッシアンを与えると,ソルバーはより正確かつより少ない反復で作動します。

以下のソルバーとアルゴリズムはヘッシアンを受け入れます。

符号数学工具箱のライセンスをお持ちの場合は,プログラミングによって勾配とヘッシアンを計算することができます。例については,符号数学工具箱™を使用した勾配とヘッシアンの計算を参照してください。問題ベースのアプローチでヘッシアンを提供するには,問題ベースのワークフローへの導関数の供給を参照してください。

実行不可能な点に収束

通常このような結果が得られる理由は,ソルバーがConstraintTolerance許容誤差内,ですべての制約を満たす点を見つけられなかったためです。しかし,ソルバーは実行可能点に位置していた,またはそこで開始したものの,実行不可能点に収束した可能性があります。ソルバーが実行可能性を失った場合は,ソルバーが実行可能性を失った場合を参照してください。quadprogがこの結果を返す場合は,quadprogの実行不可能点への収束を参照してください。

ソルバーが実行可能点を見つけないときに継続するには,以下のいずれか,またはいくつかを試してください。

1 .線形制約の確認
2 .非線形制約の確認

1 .線形制約の確認

線形計画問題を解くことにより,境界と線形制約を満たす点を見つけてみます。

  1. 常に0である目的関数で線形計画問題を定義します。

    f = 0(大小(x0));%假设x0是初始点
  2. 実行可能点があるかどうかを確かめるために,線形計画問題を解きます。

    xnew = linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
  3. 実行可能点xnewがある場合は,初期点としてxnewを使用し,元の問題を再実行します。

  4. 実行可能点がない場合は,問題は適切に定式化されていません。範囲制約と線形制約の定義を確認します。線形制約の確認の詳細については,線形実行不可能性の調査を参照してください。

2 .非線形制約の確認

範囲制約と線形制約が実行可能である(点がすべての制約を満たす)ことを確認した後,非線形制約を確認します。

  • 目的関数を0に設定します。

    @ (x) 0

    すべての制約を満たす状態で,0の目的関数で最適化を実行します。実行可能点xnewがある場合は,x0 = xnewを設定し,元の問題を再実行します。

  • 0の目的関数を使用する実行可能点が見つからない場合は,複数の初期点をもつ0の目的関数を使用します。

    • 実行可能点xnewがある場合は,x0 = xnewを設定し,元の問題を再実行します。

    • 実行可能点が見つからない場合は,次に検討するように,制約を緩めてみます。

非線形の不等式制約を緩め,それから厳しくしてみます。

  1. 非線形制約関数cを,c -Δを返すよう変更します。ここでΔは正の数値です。この変更は非線形制約をより満たしやすくします。

  2. 元の目的関数または常に0である目的関数のどちらかを使用して,新しい制約関数での実行可能点を探します。

    1. 実行可能点が見つかる場合は,

      1. Δの値を小さくします。

      2. 以前に見つかった点から開始し,新しい制約関数での実行可能点を探します。

    2. 実行可能点が見つからない場合は,Δを増やし,再度探してみます。

実行可能点が見つからない場合は,問題が本当に実行不可能であるかもしれません。つまり,解が存在しないことを意味します。すべての制約定義を再度確認します。

ソルバーが実行可能性を失った場合

ソルバーが実行可能点でスタートしたが,実行不可能点に収束した場合は,以下の手法を試してください。

  • 別のアルゴリズムを試してください。fmincon“sqp”および“内点”アルゴリズムは通常最もロバストであるため,最初にこれらのいずれかまたは両方を試してください。

  • 範囲を狭くしてみます。ベクトルを可能な限り高くし,乌兰巴托ベクトルを可能な限り低くします。これは,ソルバーが実行可能性を維持するのに役立ちます。fmincon“sqp”および“内点”アルゴリズムは各反復で範囲に従うので,範囲が狭いと最適化が容易になります。

quadprogの実行不可能点への収束

通常は,線形制約が矛盾しているか,ほぼ特異なために,このメッセージが表示されます。実行可能点が存在するかどうかを確認するには,同じ制約とゼロの目的関数ベクトルfをもつ線形計画問題を作成します。linprog对偶单纯形的アルゴリズムを使用して解決します。

选择= optimoptions (“linprog”,“算法”,对偶单纯形的);x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)

linprogによって実行可能点が見つからない場合は,問題は本当に実行不可能です。

linprogによって実行可能点が見つかった場合は,別のquadprogアルゴリズムを試します。または,StepToleranceConstraintToleranceなどの一部の許容誤差を変更して,再度問題を解きます。

非有界な問題

ソルバーは,目的関数が許容範囲以下の値を持つ点に達しました。

  • 問題が非有界である可能性があります。つまり,以下をもつ連続点x

    lim f (x) = -∞

    があり,

    そのため,すべてのxは問題の制約を満たします。

  • 問題が正しく定式化されていることを確認します。ソルバーは,目的関数を最小化しようとします。最大値を求める場合は,目的関数に——(マイナス)を付けます。例については,目的関数の最大化を参照してください。

  • 問題をスケーリングするか,センタリングしてみます。“問題のセンタリングとスケーリング”を参照してください。

  • optimoptionsを使用してObjectiveLimitの値を減らし,目的関数値の許容範囲を緩めます。

fsolveが方程式を解けない

fsolveが方程式を解けない理由はいろいろあります。以下に,その対処法を挙げます。

  1. 初期点の変更を参照してください。fsolveは初期点に依存します。異なる初期点を与えると,成功のチャンスが増えます。

  2. 方程式の定義をチェックし,それが滑らかであることを確かめます。fsolveは,絶対値のような不連続な勾配をもつ方程式の場合は収束しない可能性があります。fsolveは,不連続点をもつ関数では収束しない場合があります。

  3. 方程式が”合致する”,すなわち入力と出力が等次元である(方程式の本数と未知数が同数存在する)ことを確認します。

  4. 許容誤差,特にOptimalityToleranceStepToleranceを変更します。許容誤差を非常に小さい値に設定することにより高精度を得ようとすると,fsolveは収束に失敗することがあります。許容誤差の設定が高すぎると,fsolveが方程式を正確に解けないことがあります。

  5. 問題の定義を確認します。X ^2 + 1 = 0のように,問題によっては実数の解をもちません。

関連するトピック