このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
目的関数が要求された許容誤差に最小化される前に,反復または関数評価の回数が上限に達したため,ソルバーは停止しました。継続するには,以下の1つまたはいくつかを試してください。
1 .反復表示の有効化 |
2 .許容誤差の緩和 |
3 .異なる点からソルバーを開始 |
4 .目的関数と制約関数の定義を確認 |
5 .問題のセンタリングとスケーリング |
6 .勾配またはヤコビアンの指定 |
7 .ヘッシアンの供給 |
显示
オプションを“通路”
に設定します。この設定により,ソルバー反復の結果が表示されます。
MATLAB®コマンドラインで反復表示を有効にするには,次を入力します。
选择= optimoptions(“solvername”,“显示”,“iter”);
选项
構造体を使用して,ソルバーを呼び出します。
反復表示の例については,結果の解釈を参照してください。
反復表示内で何を探すか
目的関数 (Fval
かf (x)
かResnorm
)が減少するかどうかを観察します。減少すれば,進行していることを示します。
それが確実に0
に減少するように,制約違反(马克斯约束
)を調べます。減少すれば,進行していることを示します。
1次の最適性が0
に向かって減少するかどうかを観察します。減少すれば,進行していることを示します。
信赖域半径
が小さい値に減少するかどうか観察します。この減少は,対象が滑らかでないかもしれないことを示します。
何をすべきか
ソルバーが進行していると思われる場合:
MaxIterations
やMaxFunctionEvaluations
を既定値よりも大きく設定します。ソルバーの関数リファレンスページにあるオプションの表で既定値を確認できます。
その最後に計算された点からソルバーを開始します。
ソルバーが進行していない場合は,リストされている他の推奨操作を試してください。
たとえば,StepTolerance
やOptimalityTolerance
,いが小さすぎるとつそれが最小値に達したかをソルバーが認識しないかもしれません。無制限に無益な反復を行う可能性があります。
コマンドラインで許容誤差を変更するには,オプションの設定と変更で説明するように,関数optimoptions
を使用します。
FiniteDifferenceStepSize
オプション(または,DiffMaxChange
およびDiffMinChange
オプション)はソルバーの進行に影響する可能性があります。これらのオプションは,導関数値推定のための有限差分のステップサイズを制御します。
“初期点の変更“を参照してください。
たとえば,目的関数と非線形制約関数が任意の点で正しい値を返すことを確認します。“目的関数と制約関数の確認”を参照してください。実行不可能な点で関数がエラーを起こさないことを確認します。反復は制約に違反する可能性ありを参照してください。
各座標が目的関数と制約関数にほぼ同じ影響を与える場合に,ソルバーはより高い信頼性をもって機能します。座標軸の各方向に適切なスカラーを乗算することにより各座標の影響を均等化します。適切な値を特定の座標に追加し,それらのサイズを均等化します。
例:センタリングとスケーリング-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 %正确的答案
勾配またはヤコビアンが提供されない場合,ソルバーは有限差分法によって勾配とヤコビアンを推定します。つまり,これらの導関数を提供することにより,計算時間の節約や精度の向上が期待できます。問題ベースのアプローチは,自動的に勾配を提供できます。优化工具箱の自動微分を参照してください。
制約問題の場合は,勾配を与えることで別の利点があります。ソルバーは,x
それ自体は実行可能だが,x
の周囲の有限差分は常に実行不可能な点へ導くような点x
に到達することがあります。この場合,ソルバーは失敗するか途中で停止する可能性があります。勾配を与えることで,ソルバーは続行できます。
目的関数と非線形制約関数を定義するファイル内に,勾配またはヤコビアンも与えます。構文についての詳細は,スカラー目的関数の記述、ベクトルと行列の目的関数の記述および非線形制約を参照してください。
勾配またはヤコビアンの有効性を確認で説明されているように,勾配またはヤコビ関数が正しいことを確認するにはCheckGradients
オプションを使用します。
符号数学工具箱™のライセンスをお持ちの場合は,プログラミングによって勾配とヘッシアンを計算することができます。例については,符号数学工具箱™を使用した勾配とヘッシアンの計算を参照してください。
勾配とヤコビアンを使用している例は,勾配およびヘッシアンを使った最小化、勾配付き非線形制約、符号数学工具箱™を使用した勾配とヘッシアンの計算、ヤコビアンを使用した場合と使用しない場合の非線形系の解法,およびヤコビアンを使用した非線形方程式の大規模スパース系を参照してください。問題ベースのアプローチの自動微分については,問題ベースの最適化における自動微分の効果を参照してください。
ヘッシアンを与えると,ソルバーはより正確かつより少ない反復で作動します。
以下のソルバーとアルゴリズムはヘッシアンを受け入れます。
fmincon
内点
。別個の関数としてヘッシアンを記述します。例については,解析的ヘッシアンを使用したfminconの内点法アルゴリズムを参照してください。
fmincon
trust-region-reflective
。ヘッシアンを目的関数の3番目の出力として与えます。例については,密に構造化されたヘッシアンと線形等式を使用した最小化を参照してください。
fminunc
信赖域
。ヘッシアンを目的関数の3番目の出力として与えます。例については,勾配およびヘッシアンを使った最小化を参照してください。
符号数学工具箱のライセンスをお持ちの場合は,プログラミングによって勾配とヘッシアンを計算することができます。例については,符号数学工具箱™を使用した勾配とヘッシアンの計算を参照してください。問題ベースのアプローチでヘッシアンを提供するには,問題ベースのワークフローへの導関数の供給を参照してください。
通常このような結果が得られる理由は,ソルバーがConstraintTolerance
許容誤差内,ですべての制約を満たす点を見つけられなかったためです。しかし,ソルバーは実行可能点に位置していた,またはそこで開始したものの,実行不可能点に収束した可能性があります。ソルバーが実行可能性を失った場合は,ソルバーが実行可能性を失った場合を参照してください。quadprog
がこの結果を返す場合は,quadprogの実行不可能点への収束を参照してください。
ソルバーが実行可能点を見つけないときに継続するには,以下のいずれか,またはいくつかを試してください。
1 .線形制約の確認 |
2 .非線形制約の確認 |
線形計画問題を解くことにより,境界と線形制約を満たす点を見つけてみます。
常に0である目的関数で線形計画問題を定義します。
f = 0(大小(x0));%假设x0是初始点
実行可能点があるかどうかを確かめるために,線形計画問題を解きます。
xnew = linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
実行可能点xnew
がある場合は,初期点としてxnew
を使用し,元の問題を再実行します。
実行可能点がない場合は,問題は適切に定式化されていません。範囲制約と線形制約の定義を確認します。線形制約の確認の詳細については,線形実行不可能性の調査を参照してください。
範囲制約と線形制約が実行可能である(点がすべての制約を満たす)ことを確認した後,非線形制約を確認します。
目的関数を0に設定します。
@ (x) 0
すべての制約を満たす状態で,0の目的関数で最適化を実行します。実行可能点xnew
がある場合は,x0 = xnew
を設定し,元の問題を再実行します。
0の目的関数を使用する実行可能点が見つからない場合は,複数の初期点をもつ0の目的関数を使用します。
実行可能点xnew
がある場合は,x0 = xnew
を設定し,元の問題を再実行します。
実行可能点が見つからない場合は,次に検討するように,制約を緩めてみます。
非線形の不等式制約を緩め,それから厳しくしてみます。
非線形制約関数c
を,c -
Δを返すよう変更します。ここでΔは正の数値です。この変更は非線形制約をより満たしやすくします。
元の目的関数または常に0である目的関数のどちらかを使用して,新しい制約関数での実行可能点を探します。
実行可能点が見つかる場合は,
Δの値を小さくします。
以前に見つかった点から開始し,新しい制約関数での実行可能点を探します。
実行可能点が見つからない場合は,Δを増やし,再度探してみます。
実行可能点が見つからない場合は,問題が本当に実行不可能であるかもしれません。つまり,解が存在しないことを意味します。すべての制約定義を再度確認します。
ソルバーが実行可能点でスタートしたが,実行不可能点に収束した場合は,以下の手法を試してください。
別のアルゴリズムを試してください。fmincon
“sqp”
および“内点”
アルゴリズムは通常最もロバストであるため,最初にこれらのいずれかまたは両方を試してください。
範囲を狭くしてみます。磅
ベクトルを可能な限り高くし,乌兰巴托
ベクトルを可能な限り低くします。これは,ソルバーが実行可能性を維持するのに役立ちます。fmincon
“sqp”
および“内点”
アルゴリズムは各反復で範囲に従うので,範囲が狭いと最適化が容易になります。
quadprog
の実行不可能点への収束通常は,線形制約が矛盾しているか,ほぼ特異なために,このメッセージが表示されます。実行可能点が存在するかどうかを確認するには,同じ制約とゼロの目的関数ベクトルf
をもつ線形計画問題を作成します。linprog
对偶单纯形的
アルゴリズムを使用して解決します。
选择= optimoptions (“linprog”,“算法”,对偶单纯形的);x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
linprog
によって実行可能点が見つからない場合は,問題は本当に実行不可能です。
linprog
によって実行可能点が見つかった場合は,別のquadprog
アルゴリズムを試します。または,StepTolerance
やConstraintTolerance
などの一部の許容誤差を変更して,再度問題を解きます。
ソルバーは,目的関数が許容範囲以下の値を持つ点に達しました。
問題が非有界である可能性があります。つまり,以下をもつ連続点x我
lim f (x我) = -∞
そのため,すべてのx我は問題の制約を満たします。
問題が正しく定式化されていることを確認します。ソルバーは,目的関数を最小化しようとします。最大値を求める場合は,目的関数に——(マイナス)を付けます。例については,目的関数の最大化を参照してください。
問題をスケーリングするか,センタリングしてみます。“問題のセンタリングとスケーリング”を参照してください。
optimoptions
を使用してObjectiveLimit
の値を減らし,目的関数値の許容範囲を緩めます。
fsolve
が方程式を解けない理由はいろいろあります。以下に,その対処法を挙げます。
初期点の変更を参照してください。fsolve
は初期点に依存します。異なる初期点を与えると,成功のチャンスが増えます。
方程式の定義をチェックし,それが滑らかであることを確かめます。fsolve
は,絶対値のような不連続な勾配をもつ方程式の場合は収束しない可能性があります。fsolve
は,不連続点をもつ関数では収束しない場合があります。
方程式が”合致する”,すなわち入力と出力が等次元である(方程式の本数と未知数が同数存在する)ことを確認します。
許容誤差,特にOptimalityTolerance
とStepTolerance
を変更します。許容誤差を非常に小さい値に設定することにより高精度を得ようとすると,fsolve
は収束に失敗することがあります。許容誤差の設定が高すぎると,fsolve
が方程式を正確に解けないことがあります。
問題の定義を確認します。X ^2 + 1 = 0
のように,問題によっては実数の解をもちません。