Main Content

fmincon ソルバーを使用した最適化ライブ エディター タスク

この例では、線形と非線形の制約と範囲をもつ二次式を最小化するために、[fmincon] ソルバーと共にソルバーベースの [最適化] ライブ エディター タスクを使用する方法を示します。

以下を解く、[x1, x2] を探す問題を考えてみましょう。

minxf(x)=x12+x22

以下の制約に従います。

0.5x1(bound)x1x2+10(linear inequality)x12x22+109x12x22+90x12+x20x22+x10}(nonlinear inequality)

この問題の開始点 x0 は、x1 = 3 と x2 = 1 です。

最適化ライブ エディター タスクの開始

[ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] ボタンをクリックして、新しいライブ スクリプトを作成します。

New Live Script button

[最適化] ライブ エディター タスクを挿入します。[挿入] タブをクリックしてから、[コード] セクションで、[タスク]、[最適化] を選択します。

Insert Optimize Live Editor task

Optimize task in Live Editor: Choose between problem-based (recommended) and solver-based

この例の場合は、ソルバーベースのタスクを選択します。

View of the Optimize Live Task

後で問題データの入力で使用するために、[挿入]、[セクション区切り] を選択します。新しいセクションがタスクの上と下に表示されます。

問題のデータの入力

  1. タスクの一番上から、問題タイプと制約タイプを入力します。[目的]、[2 次] ボタンと、[制約]、[下限][線形不等式]、および [非線形] の各ボタンをクリックします。推奨ソルバーは fmincon であると表示されます。

  2. 目的関数

    目的関数は、十分単純なため、無名関数として表現できます。カーソルをタスクの上のセクションに配置して、次のコードを入力します。

    fun = @(x)sum(x.^2);
  3. 下限

    問題には、下限 x1 ≥ 0.5 が含まれています。この範囲を変数 lb で表します。カーソルを目的関数を定義する行の末尾に配置して、Enter を押し、下限を指定する次のコードを入力します。

    lb = [0.5 -Inf];
  4. 初期点

    カーソルを下限を定義する行の末尾に配置して、Enter を押し、初期点を設定する次のコードを入力します。

    x0 = [3,1];
  5. 線形制約

    カーソルを初期点を定義する行の末尾に配置して、Enter を押し、線形制約を設定する次のコードを入力します。

    A = [-1,-1];
    b = -1;
  6. セクションの実行

    これで、一番上のセクションに 5 つのパラメーターが表示されます。

    Five lines of code defining initial parameters

    次に、セクションを実行して、パラメーターをワークスペースに変数として配置する必要があります。これを行うには、斜めの縞模様のバーを含む、セクションの左端の領域をクリックします。この領域をクリックすると、バーが無地のバーになり、変数がワークスペースに配置されたことが示されます (メモ:Ctrl+Enter を押して、セクションを実行することもできます)。

  7. 問題データの設定

    タスクの [問題のデータの選択] セクションに変数を入力します。目的関数を指定するために、[目的関数]、[関数ハンドル] を選択して、[fun] を選択します。

  8. 初期点 [x0] を設定します。

  9. [下限]、[From workspace] を選択して、[lb] を選択します。

  10. [線形不等式] 領域で、線形不等式制約変数の Ab を設定します。

  11. ここで、非線形不等式制約を指定します。[問題のデータの選択] セクションで、[非線形]、[ローカル関数] を選択してから、[新規] ボタンをクリックします。タスクの下側の新しいセクションに関数が表示されます。以下のコメントが解除された行を含むように生成されたコードを編集します。

    function [c,ceq] = constraintFcn(x)
    % You can include commented code lines or not.
    % Be sure that just these uncommented lines remain:
    c = [-x(1)^2 - x(2)^2 + 1;
         -9*x(1)^2 - x(2)^2 + 9;
         -x(1)^2 + x(2);
         -x(2)^2 + x(1)];
    ceq = [];
    end
  12. [問題のデータの選択] セクションで、[constraintFcn] を選択します。

  13. 進行状況の監視

    タスクの [進行状況の表示] セクションで、[テキスト表示]、[各反復] を選択して、ソルバーの進行状況を監視できるようにします。プロットの [目的値] を選択します。

    設定は次のようになります。

    fmincon solver, objective function handle fun, initial point x0, lower bounds lb, linear inequality constraints A and b, nonlinear local function constraintFcn, display each iteration, plot objective value

ソルバーの実行と結果の検証

ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。

Run solver; keyboard equivalent is ctrl+enter

別の Figure ウィンドウとタスク出力領域にプロットが表示されます。

Plot showing 12 iterations and a final function value 2

解の変数が返された場所を見つけるには、タスクの一番上を確認します。

solution, objectiveValue = minimize fun using fmincon solver

最終点とその関連目的関数値が、ワークスペースの solution 変数と objectiveValue 変数に表示されます。これらの値は、次のコードをタスクの下のライブ エディター セクションに入力することによって表示されます。

solution, objectiveValue

Ctrl+Enter を押して、セクションを実行します。

solution = [1 1], objectiveValue = 2

参考

|

関連するトピック