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

プロット関数

最適化実行時のプロット表示

ソルバーの実行中に進捗状況のさまざまな測定をプロットできます。PlotFcn の名前/値のペアを optimoptions で設定し、各反復でソルバーが呼び出すプロット関数を 1 つまたは複数指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。

さまざまな定義済みプロット関数を使用できます。詳細は、以下を参照してください。

  • ソルバー関数のリファレンス ページにある PlotFcn オプションの説明

  • [最適化アプリ]、[オプション]、[プロット関数]

また、カスタムのプロット関数を使用することもできます。出力関数と同じ構造を使用して関数ファイルを記述します。この構造については、出力関数の構文を参照してください。

プロット関数の使用

この例は、プロット関数を使用して、fmincon 内点法アルゴリズムの進行を見る方法を示します。問題は、「入門」の制約付き非線形問題の解法、ソルバーベースから取られています。例の最初の部分では、最適化アプリを使用した最適化の実行方法を示します。第 2 の部分では、コマンド ラインからの最適化の実行方法を示します。

メモ

最適化アプリは、将来のリリースで削除される予定です。

最適化アプリを使用した最適化の実行

  1. 導関数を含めて、非線形の目的関数と制約関数を記述します。

    function [f g H] = rosenboth(x)
    % ROSENBOTH returns both the value y of Rosenbrock's function
    % and also the value g of its gradient and H the Hessian.
    
    f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;
    
    if nargout > 1
        g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
            200*(x(2)-x(1)^2)];
        
        if nargout > 2
            H = [1200*x(1)^2-400*x(2)+2, -400*x(1);
                -400*x(1), 200];  
        end
    end

    このファイルを rosenboth.m として保存します。

    function [c,ceq,gc,gceq] = unitdisk2(x)
    % UNITDISK2 returns the value of the constraint
    % function for the disk of radius 1 centered at
    % [0 0]. It also returns the gradient.
    
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
    
    if nargout > 2
        gc = [2*x(1);2*x(2)];
        gceq = [];
    end

    このファイルを unitdisk2.m として保存します。

  2. コマンド ラインに optimtool と入力して、最適化アプリを起動します。

  3. 以下のように最適化を設定します。

    • [fmincon] ソルバーを選択します。

    • [Interior point] アルゴリズムを選択します。

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

    • 目的関数の導関数の [勾配指定] を選択します。

    • 開始点は [0 0] です。

    • 非線形制約関数を @unitdisk2 に設定します。

    • 非線形制約導関数の [勾配指定] を選択します。

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

  4. [オプション] ペインの次の 3 つのプロット関数 [現在の点][関数値] および [1 次の最適性] を選択します。

  5. [ソルバーを実行して結果を表示] の下の [開始] をクリックします。

  6. 最適化アプリに以下のような出力が表示されます。

    さらに、以下の 3 つのプロットが別個のウィンドウに表示されます。

  • [現在の点] プロットは、最小値 [0.786,0.618] を視覚的に示します。これは、[ソルバーを実行して結果を表示] ペインに [最終点] として報告されます。このプロットは各反復で更新され、中間反復を示します。

  • [現在の関数値] プロットは、すべての反復における目的関数値を表示します。このグラフはきわめて単調で、fmincon がほぼすべての反復で目的関数を減少するのを示します。

  • [1 次の最適性] プロットは、すべての反復における 1 次の最適性の尺度を示します。

コマンド ラインから最適化を実行

  1. 最適化アプリを使用した最適化の実行に示すように、導関数を含めて、非線形の目的関数と制約関数を記述します。

  2. 3 つのプロット関数の呼び出しを含むオプション構造体を作成します。

    options = optimoptions(@fmincon,'Algorithm','interior-point',...
     'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,'PlotFcn',{@optimplotx,...
        @optimplotfval,@optimplotfirstorderopt});
  3. fmincon を呼び出します。

    x = fmincon(@rosenboth,[0 0],[],[],[],[],[],[],...
        @unitdisk2,options)
  4. fmincon は、以下の出力を返します。

    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.
    
    x =
        0.7864    0.6177

    また、最適化アプリを使用した最適化の実行の最後に示すように、fmincon は 3 つのプロット関数を表示します。

関連するトピック