[最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題
典型的な最適化問題
この例では、Optimization Toolbox™ ソルバーを使用して、制約付き非線形問題を解く方法を説明します。例は典型的なワークフローを示します。つまり、目的関数を作成し、制約を作成して、問題を解き、結果を調べます。
この例では、問題を解くための 2 つのアプローチを示します。1 つは、[最適化] ライブ エディター タスクというビジュアル アプローチを使用します。もう 1 つは、MATLAB® コマンド ラインというテキストベースのアプローチを使用します。この種の問題は、問題ベースのアプローチを使用して解くこともできます。制約付き非線形問題の解法、問題ベースを参照してください。
問題の定式化: Rosenbrock 関数
問題は、Rosenbrock 関数を最小化することです。
"単位円板" (原点を中心とした半径 1 の円板) で最小化します。つまり、 という条件で関数 f(x) を最小にする x を求めます。この問題は非線形制約をもつ非線形関数の最小化です。
メモ
Rosenbrock 関数は最適化の標準的なテスト関数であり、点 [1,1]
で一意に最小値 0 に到達します。この関数は曲線の深い谷に奥行きのない最小値をもつため、最小値の検索がアルゴリズムによっては困難になります。この問題の解は、点 [1,1]
ではありません。この点は制約を満たしていないからです。
この図は単位円板内の Rosenbrock 関数の 2 つのビューを示します。縦軸は対数、つまりプロットは log(1+f(x)) を示します。等高線は表面プロットの下に描きます。
対数で表した Rosenbrock 関数の 2 つのビュー
関数 f(x) は "目的関数" と呼ばれます。目的関数は、最小化する関数です。不等式 は "制約" と呼ばれます。制約は、ソルバーが最小値を探す x の集合の範囲を限定します。任意の数の制約 (不等式または等式) をもつことができます。
Optimization Toolbox のすべての最適化関数は目的関数を最小化します。関数 f を最大化するには、関数を負にして –f を最適化ルーチンに適用します。最大化の詳細については、目的関数の最大化を参照してください。
[最適化] ライブ エディター タスクを使用した問題の定義と解決
[最適化] ライブ エディター タスクを使用すれば、ビジュアル アプローチで問題を設定して解くことができます。
[ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] をクリックして、新しいライブ スクリプトを作成します。
[最適化] ライブ エディター タスクを挿入します。[挿入] タブをクリックしてから、[コード] セクションで、[タスク]、[最適化] を選択します。
ソルバーベースのタスクを選択します。
タスクの [問題の種類の指定] セクションで、[目的]、[非線形] を選択して、[制約]、[非線形] を選択します。タスクが
[fmincon - 制約付き非線形最小化]
ソルバーを選択します。Rosenbrock 関数を目的関数として含めます。タスクの [問題のデータの選択] セクションで、[目的関数]、[ローカル関数] を選択してから、[新規...] ボタンをクリックします。新しいローカル関数がタスクの下のセクションに表示されます。
function f = objectiveFcn(optimInput) % Example: % Minimize Rosenbrock's function % f = 100*(y - x^2)^2 + (1 - x)^2 % Edit the lines below with your calculation x = optimInput(1); y = optimInput(2); f = 100*(y - x^2)^2 + (1 - x)^2; end
この関数が Rosenbrock 関数を実装します。
タスクの [問題のデータの選択] セクションで、[目的関数]、[objectiveFcn] を選択します。
初期点
x0 = [0;0]
を MATLAB ワークスペースに配置します。タスクをクリックしてから、[挿入] タブで [セクション区切り] ボタンをクリックすることによって、[最適化] タスクの上に新しいセクションを挿入します。タスクの上の新しいセクションに、初期点の次のコードを入力します。x0 = [0;0];
Ctrl+Enter を押してセクションを実行します。このアクションによって、
x0
がワークスペースに配置されます。タスクの [問題のデータの選択] セクションで、[初期点 (x0)]、[x0] を選択します。
[問題のデータの選択] セクションで、[制約]、[非線形]、[ローカル関数] を選択してから、[新規...] ボタンをクリックします。新しいローカル関数が以前のローカル関数の下に表示されます。
新しいローカル関数を次のように編集します。
function [c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; end
[問題のデータの選択] セクションで、制約関数として
[unitdisk]
を選択します。ソルバーの進行状況をモニターするには、タスクの [進行状況の表示] セクションで、[テキスト表示]、[各反復] を選択します。また、プロットの [目的値と実行可能性] を選択します。
ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。別の Figure ウィンドウと出力領域にプロットが表示されます。
出力領域には、結果の解釈で説明する反復の表が表示されます。
解を見つけるには、タスクの一番上を確認します。
ソルバーは、変数の
solution
とobjectiveValue
をワークスペースに配置します。タスクの下に新しいセクション区切りを挿入して次の行を入力することによって、変数の値を確認します。Ctrl+Enter を押してセクションを実行します。
結果を取得するための
fmincon
プロセスを理解するには、結果の解釈 を参照してください。問題を解くために [最適化] が生成するコードを表示するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[コントロールおよびコード] を選択します。
タスクの一番下に、次のコードが表示されます。
% Set nondefault solver options options = optimoptions('fmincon','Display','iter','PlotFcn',... 'optimplotfvalconstr'); % Solve [solution,objectiveValue] = fmincon(@objectiveFcn,x0,[],[],[],[],[],[],... @unitdisk,options);
このコードは、後述するようにコマンド ラインで問題を解くために使用するコードです。
コマンド ラインでの問題の定義と解決
コマンド ラインで最適化問題を解く最初のステップはソルバーの選択です。最適化の意思決定表 を参照してください。非線形目的関数と非線形制約を伴う問題の場合は、fmincon
ソルバーを使用するのが一般的です。
fmincon
関数のリファレンス ページを参照してください。ソルバー構文は次のとおりです。
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
fun
入力と nonlcon
入力は、それぞれ、目的関数と非線形制約関数を表します。
問題は次のように表されます。
目的関数を MATLAB 言語で、関数ファイルまたは無名関数として定義します。この例では関数ファイルを使用します。
制約を別の関数ファイルまたは無名関数として定義します。
関数ファイルは、MATLAB コマンドを含むテキスト ファイルで、拡張子は .m
です。任意のテキスト エディターまたは組み込みの MATLAB エディターを使用して以下のように関数ファイルを作成します。
コマンド ラインで、以下を入力します。
edit rosenbrock
MATLAB エディター上で以下を入力します。
%% ROSENBROCK(x) expects a two-column matrix and returns a column vector % The output is the Rosenbrock function, which has a minimum at % (1,1) of value 0, and is strictly positive everywhere else. function f = rosenbrock(x) f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;
メモ
rosenbrock
は、同時にいくつかの点の値を計算できるベクトル関数です。詳細については、ベクトル化を参照してください。ベクトル関数は、プロットに最適です。非ベクトル バージョンの場合は、以下を入力します。%% ROSENBROCK1(x) expects a two-element vector and returns a scalar % The output is the Rosenbrock function, which has a minimum at % (1,1) of value 0, and is strictly positive everywhere else. function f = rosenbrock1(x) f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
ファイルを
rosenbrock.m
という名前で保存します。
制約関数の形式は、c(x) ≤ 0 または ceq(x) = 0. です。制約 はソルバーが処理する形式ではありません。正しい構文にするには、制約を として再定式化します。
非線形制約の構文は、等式と不等式の両方の制約を返します。この例には不等式制約のみが含まれるため、等式の制約関数 ceq として空の配列 []
を渡さなければなりません。
これらを考慮して、非線形制約の関数ファイルを記述します。
以下のコードを含む
unitdisk.m
という名前のファイルを作成します。function [c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ];
ファイル
unitdisk.m
を保存します。目的関数と制約関数の関数ハンドルを作成します。これらの関数ハンドルは関数を示すもので、ソルバーが関数にアクセスするための手段です。
fun = @rosenbrock; nonlcon = @unitdisk;
これで、目的関数と制約関数を定義したため、他の fmincon
入力を作成します。
'optimplotfvalconstr'
プロット関数を使用して反復表示を返すfmincon
用のオプションを作成します。options = optimoptions('fmincon',... 'PlotFcn','optimplotfvalconstr',... 'Display','iter');
初期点を作成します。
x0 = [0 0];
この例では使用しない制約用の空のエントリを作成します。
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
fmincon
を呼び出して問題を解きます。
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 3 1.000000e+00 0.000e+00 2.000e+00 1 13 7.753537e-01 0.000e+00 6.250e+00 1.768e-01 2 18 6.519648e-01 0.000e+00 9.048e+00 1.679e-01 3 21 5.543209e-01 0.000e+00 8.033e+00 1.203e-01 4 24 2.985207e-01 0.000e+00 1.790e+00 9.328e-02 5 27 2.653799e-01 0.000e+00 2.788e+00 5.723e-02 6 30 1.897216e-01 0.000e+00 2.311e+00 1.147e-01 7 33 1.513701e-01 0.000e+00 9.706e-01 5.764e-02 8 36 1.153330e-01 0.000e+00 1.127e+00 8.169e-02 9 39 1.198058e-01 0.000e+00 1.000e-01 1.522e-02 10 42 8.910052e-02 0.000e+00 8.378e-01 8.301e-02 11 45 6.771960e-02 0.000e+00 1.365e+00 7.149e-02 12 48 6.437664e-02 0.000e+00 1.146e-01 5.701e-03 13 51 6.329037e-02 0.000e+00 1.883e-02 3.774e-03 14 54 5.161934e-02 0.000e+00 3.016e-01 4.464e-02 15 57 4.964194e-02 0.000e+00 7.913e-02 7.894e-03 16 60 4.955404e-02 0.000e+00 5.462e-03 4.185e-04 17 63 4.954839e-02 0.000e+00 3.993e-03 2.208e-05 18 66 4.658289e-02 0.000e+00 1.318e-02 1.255e-02 19 69 4.647011e-02 0.000e+00 8.006e-04 4.940e-04 20 72 4.569141e-02 0.000e+00 3.136e-03 3.379e-03 21 75 4.568281e-02 0.000e+00 6.440e-05 3.974e-05 22 78 4.568281e-02 0.000e+00 8.000e-06 1.084e-07 23 81 4.567641e-02 0.000e+00 1.601e-06 2.793e-05 24 84 4.567482e-02 0.000e+00 2.023e-08 6.916e-06 Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. x = 0.7864 0.6177 fval = 0.0457
この終了メッセージは、目的関数の導関数が制約で認められた方向でほぼ 0 となるため制約付き最適解の検索は終了したこと、および制約は必要な精度で満たされていることを示します。メッセージの中のフレーズのいくつかは、メッセージ内で使用される用語に関するより多くの情報へのリンクを含んでいます。このリンクの詳細については、より詳細な終了メッセージを参照してください。
結果の解釈
ライブ エディター タスクの出力領域と MATLAB コマンド ウィンドウの両方の反復表に、MATLAB がどのように単位円板内で Rosenbrock 関数の最小値を検索したかが表示されます。この表はツールボックスのバージョンや計算プラットフォームによって異なる場合があります。次の説明がこの例で示す表に適用されます。
1 列目は
Iter
とラベル付けされ、0 から 24 までの反復数を示します。fmincon
は収束するために 24 回反復を行いました。2 列目は
F-count
とラベル付けされ、Rosenbrock 関数が評価された累積回数を示します。最後の行は 84 のF-count
を示し、fmincon
が最小値を検索する過程で 84 回 Rosenbrock 関数を計算したことを示します。3 列目は
f(x)
とラベル付けされ、目的関数の値を表示します。最終値4.567482e-2
は、[最適化] の実行で報告される最小値で、コマンド ウィンドウの終了メッセージの最後に表示されます。4 列目の
Feasibility
は、すべての反復に対して 0 です。この列は、制約が正となる各反復での制約関数unitdisk
の値を示します。すべての反復でunitdisk
の値は負であったため、どの反復でも制約は満たされています。
反復の表の他の列は 反復表示 で説明されています。