ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

制約付き非線形問題の解法

典型的な最適化問題

この例では、Optimization Toolbox™ ソルバーを使用して、制約付き非線形問題を解く方法を説明します。例は典型的なワーク フローを示します。つまり、目的関数を作成し、制約を作成して、問題を解き、結果を調べます。

問題の定式化: Rosenbrock 関数

Rosenbrock 関数

f(x)=100(x2x12)2+(1x1)2,

"単位円板" (原点を中心とした半径 1 の円板) で最小化する問題について考えてみます。つまり、x12+x221 という条件で関数 f(x) を最小にする x を求めます。この問題は非線形制約をもつ非線形関数の最小化です。

メモ

Rosenbrock 関数は最適化の標準的なテスト関数であり、点 [1,1] で一意に最小値 0 に到達します。この関数は曲線の深い谷に奥行きのない最小値をもつため、最小値の検索がアルゴリズムによっては困難になります。この問題の解は、点 [1,1] ではありません。この点は制約を満たしていないからです。

この図は単位円板内の Rosenbrock 関数の 2 つのビューを示します。縦軸は対数、つまりプロットは log(1+f(x)) を示します。等高線は表面プロットの下に描きます。

対数で表した Rosenbrock 関数の 2 つのビュー。

 図を生成するコード

関数 f(x) は "目的関数" と呼ばれます。目的関数は、最小化する関数です。不等式 x12+x221"制約" と呼ばれます。制約は、ソルバーが最小値を探す x の集合の範囲を限定します。任意の数の制約 (不等式または方程式) をもつことができます。

Optimization Toolbox のすべての最適化関数は目的関数を最小化します。関数 f を最大化するには、関数を負にして –f を最適化ルーチンに適用します。最大化の詳細は、目的関数の最大化を参照してください。

ツールボックスの構文による問題の定義

Optimization Toolbox ソフトウェアを使用するには、問題を以下のように表します。

  1. 目的関数を MATLAB® 言語で、関数ファイルまたは無名関数として定義します。この例では関数ファイルを使用します。

  2. 制約を別の関数ファイルまたは無名関数として定義します。

目的関数の関数ファイル

関数ファイルは、MATLAB コマンドを含むテキスト ファイルで、拡張子は .m です。任意のテキスト エディターまたは組み込みの MATLAB エディターを使用して以下のように関数ファイルを作成します。

  1. コマンド ラインで、以下を入力します。

    edit rosenbrock
  2. 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 は、同時にいくつかの点の値を計算できるベクトル関数です。詳細は、ベクトル化 (MATLAB)を参照してください。ベクトル関数は、プロットに最適です。非ベクトル バージョンの場合は、以下を入力します。

    %% 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;
  3. ファイルを rosenbrock.m という名前で保存します。

制約の関数ファイル

制約関数の形式は、c(x) ≤ 0 または ceq(x) = 0 です。制約 x12+x221 はソルバーが処理する形式ではありません。正しい構文にするには、制約を x12+x2210 として再定式化します。

さらに、非線形制約の構文は、等式と不等式の両方の制約を返します。この例には不等式制約のみが含まれるため、等式の制約関数 ceq として空の配列 [] を渡さなければなりません。

これらを考慮して、非線形制約の関数ファイルを記述します。

  1. 以下のコードを含む unitdisk.m という名前のファイルを作成します。

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. ファイル unitdisk.m を保存します。

最適化の実行

最適化を実行するには 2 つの方法があります。

最適化アプリを使用した Rosenbrock 関数の最小化

メモ

最適化アプリは、将来のリリースで削除される予定です。代替方法については、最適化アプリの代替方法を参照してください。

  1. コマンド ラインに optimtool と入力して、最適化アプリを起動します。このツールの詳細は最適化アプリを参照してください。

    既定の [ソルバー] では [制約付き非線形最小化] が選択されています。Rosenbrock 関数は非線形であり、今回の問題は制約をもつため、このソルバーはこの問題に適しています。ソルバーの選択方法の詳細については 最適化の意思決定表 を参照してください。

    既定の [アルゴリズム][Interior point] も選択されています。

  2. [目的関数] ボックスに @rosenbrock を入力します。@ 文字はファイル rosenbrock.m関数ハンドル (MATLAB)であることを示します。

  3. [開始点] ボックスに [0 0] と入力し、fmincon が最小値を探す起点となる初期点を指定します。

  4. [非線形制約関数] ボックスに @unitdisk を入力します。これは unitdisk.m の関数ハンドルです。

    [問題の設定と結果] ペインは以下の図のようになります。

  5. [オプション] ペインの [コマンド ウィンドウに表示] (ペインの下部) の下で [表示レベル] リストから [各反復] を選択します(このオプションが表示されていない場合は、[コマンド ウィンドウに表示] をクリックします)。この設定は、コマンド ウィンドウに fmincon の計算過程を表示します。

  6. [問題の設定と結果] ペインの [ソルバーを実行して結果を表示] の下で、[開始] をクリックします。

以下のメッセージが [ソルバーを実行して結果を表示] ボックスに表示されます。

Optimization running.
Objective function value: 0.04567482475812774
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
使用するコンピューター システムと Optimization Toolbox のバージョンにより、目的関数の値は若干異なる場合があります。

上記メッセージは以下のことを示しています。

  • 目的関数の導関数が制約を考慮した方向でほぼ 0 になるため、制約付き最適化の検索が終了しました。

  • 制約は必要な精度を満たしています。

[問題の設定と結果] ペインの下部の [最終点] の下に最小値をとる x が表示されます。終了メッセージの詳細については、終了フラグと終了メッセージを参照してください。

コマンド ラインでの Rosenbrock 関数の最小化

コマンド ラインから同じ最適化を実行できます。

  1. 反復表示と interior-point アルゴリズムを選択してオプションを作成します。

    options = optimoptions(@fmincon,...
        'Display','iter','Algorithm','interior-point');
  2. options 構造体を使用して fmincon ソルバーを実行します。最小となるときの位置 x と、目的関数によって得られる値 fval の両方をレポートします。

    [x,fval] = fmincon(@rosenbrock,[0 0],...
        [],[],[],[],[],[],@unitdisk,options)

    6 つの空のかっこは、この例ではオプションの制約が使用されないことを示します。構文については fmincon の関数リファレンス ページを参照してください。

MATLAB は各反復についての情報をまとめた表と最適化の結果を出力します。

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the selected value of the function tolerance,
and constraints are satisfied to within the selected value of the constraint tolerance.

x =
    0.7864    0.6177

fval =
    0.0457

このメッセージは、目的関数の導関数が制約で認められた方向でほぼ 0 となるため制約付き最適化の検索は終了したこと、および制約は必要な精度で満たされていることを示します。メッセージの中のフレーズのいくつかは、メッセージ内で使用される用語に関するより多くの情報へのリンクを含んでいます。このリンクの詳細は、より詳細な終了メッセージ を参照してください。

結果の解釈

コマンド ウィンドウの反復の表は、MATLAB がどのように単位円板内で Rosenbrock 関数の最小値を検索したかを示します。この表は最適化アプリを使用してもコマンド ラインを使用しても同じです。MATLAB は以下のように最小化をレポートします。

                                            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.437e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.083e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    1.996e-08    6.916e-06

この表はツールボックスのバージョンや計算プラットフォームによって異なる場合があります。以下の説明は表示される表の説明です。

  • 1 列目は Iter とラベル付けされ、0 から 24 までの反復数を示します。fmincon は収束するために 24 回反復を行いました。

  • 2 列目は F-count とラベル付けされ、Rosenbrock 関数が評価された累積回数を示します。最後の行は 84 の F-count を示し、fmincon が最小値を検索する過程で 84 回 Rosenbrock 関数を計算したことを示します。

  • 3 列目は f(x) とラベル付けされ、目的関数の値を表示します。最終値 0.04567482 は、最適化アプリの [ソルバーを実行して結果を表示] ボックスに表示される最小値です。この値はコマンド ウィンドウの終了メッセージの最後にも記載されます。

  • 4 列目の Feasibility は、すべての反復に対して 0 です。この列は、制約が正となる各反復での制約関数 unitdisk の値を示します。すべての反復で unitdisk の値は負であったため、どの反復でも制約は満たされています。

反復の表の他の列は 反復表示 で説明されています。

参考

関連するトピック