主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

制約付き非線形問題の解法,ソルバーベース

典型的な最适化问题

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

この例では,问题を解くための2つのアプローチをます.1つは,最適化ライブエディタータスクというビジュアルアプローチを使用します。もう1つは,MATLAB®コマンドラインというテキストベースのアプローチを使用します。この種の問題は、問題ベースのアプローチを使用して解くこともできます。制約付き非線形問題の解法,問題ベースを参照してください。

问题问题定式化:RosenBrock关节

问题は,罗森布罗克关关节を小气するです。

f x = One hundred. x 2 x 1 2 2 + 1 x 1 2

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

メモ

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

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

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

図を生成するコード

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

优化工具箱のすべての最適化関数は目的関数を最小化します。関数fを最大化するには,関数を負にして- fを最適化ルーチンに適用します。最大化の詳細は,目的関数の最大化を参照してください。

最適化ライブエディタータスクを使用した問題の定義と解決

最適化ライブエディタータスクを使用すれば,ビジュアルアプローチで問題を設定して解くことができます。

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

    新增实时脚本按钮

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

    优化Live Editor任务

  3. タスクの[問題の種類の指定)セクションで,[目的]、[非線形]を選択して,[制約]、[非線形]を選択します。タスクが[fmincon -制約付き非線形最小化)ソルバーを選択します。

  4. 。関数を目的関数として含めます。タスクの[问题のデータの选択]セクションで,(目的関数]、[ローカル関数)を選択してから,[新規...]ボタンをクリックします。新しいローカル関数がタスクの下のセクションに表示されます。

    函数f = objectiveFcn (optimInput)%的例子:%最小化罗森布罗克函数% f = 100*(y - x)^2 + (1 - x)^2%编辑下面的线路计算x = optimInput (1);y = optimInput (2);F = 100*(y - x)^2 + (1 - x)^2;结束

    この関数が。関数を実装します。

  5. タスクの[问题のデータの选択]セクションで,(目的関数],[objectiveFcn]を選択します。

  6. 初期点x0 = (0, 0)をMATLABワークスペースに配置します。タスクをクリックしてから,[挿入]タブで[セクション区切り]ボタンをクリックすることによって,最適化タスクの上に新しいセクションを挿入します。タスクの上の新しいセクションに、初期点の次のコードを入力します。

    x0 = (0, 0);
  7. 按Ctrl + Enterを押してセクションを実行します。このアクションによって,x0がワークスペースに配置されます。

  8. タスクの[问题のデータの选択]セクションで,(初期点(x0)], [x0]を選択します。

    目标函数和x0

  9. [问题のデータの选択]セクションで,(制約]、[非線形],[ローカル関数)を選択してから,[新規...]ボタンをクリックします。新しいローカル関数が以前のローカル関数の下に表示されます。

  10. 新しいローカル関数を次のように編集します。

    函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;[];结束
  11. [问题のデータの选択]セクションで,制約関数として(unitdisk)を選択します。

    问题数据:目标、初始点、非线性约束

  12. ソルバーの進行状況をモニターするには,タスクの[進行状況の表示)セクションで,[テキスト表示]、[各反復]を選択します。また,プロットの[目的値と実行可]を選択します。

    迭代显示和目标值及可行性图函数

  13. ソルバーを実行するには,タスクウィンドウの右上にあるオプションボタン(⁝)をクリックして,[セクションの実行)を選択します。別の图ウィンドウと出力領域にプロットが表示されます。

    函数值通常会随着迭代的进行而减少

    出力領域には,結果の解釈で説明する反復の表が表示されます。

  14. 解を見つけるには,タスクの一番上を確認します。

    从fmincon返回

    ソルバーは,変数の解决方案objectiveValueをワークスペースに配置します。タスクの下に新しいセクション区切りを挿入して次の行を入力することによって、変数の値を確認します。

    disp(解决方案);disp (objectiveValue)

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

    解决方案=[0.7864,0.6177]。objectiveValue = 0.0457。

    結果を取得するためのfminconプロセスを理解するには,結果の解釈を参照してください。

  16. 問題を解くために最適化が生成するコードを表示するには,タスクウィンドウの右上にあるオプションボタン(⁝)をクリックして,[コントロールおよびコード]を選択します。

    控制和代码

    タスクの一番下に,次のコードが表示されます。

    设置非默认解算器选项选项= Optimoptions('fmincon'“显示”“通路”“PlotFcn”...“optimplotfvalconstr”);%解决(解决方案,objectiveValue) = fmincon (x0 @objectiveFcn ,[],[],[],[],[],[],...@unitdisk选项);

    このコードは,後述するようにコマンドラインで問題を解くために使用するコードです。

コマンドラインでの問題の定義と解決

コマンドラインで最适化问题を解く最初のステップはソルバーの选択です。最適化の意思決定表を参照してください。非線形目的関数と非線形制約を伴う問題の場合は,fminconソルバーを使用するのが一般的です。

fmincon関数のリファレンスページを参照してください。ソルバー構文は次のとおりです。

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)

有趣的入力とnonlcon入力は,それぞれ,目的関数と非線形制約関数を表します。

問題は次のように表されます。

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

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

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

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

    编辑
  2. MATLABエディター上で以下を入力します。

    %% ROSENBROCK(x)期望一个两列矩阵并返回一个列向量%输出为Rosenbrock函数,其最小值为%(1,1)的值为0,并且在其他地方严格为正。函数F = 100*(x(:,2) - x(:,1).^2)^2 + (1 - x(:,1))

    メモ

    は,同時にいくつかの点の値を計算できるベクトル関数です。詳細は,ベクトル化を参照してください。ベクトル関数は,プロットに最適です。非ベクトルバージョンの場合は,以下を入力します。

    %% ROSENBROCK1(x)期望一个二元向量并返回一个标量%输出为Rosenbrock函数,其最小值为%(1,1)的值为0,并且在其他地方严格为正。函数f = rosenbrock1 f (x) = 100 * (x (2) - x (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;
  3. ファイルをrosenbrock.mという名前で保存します。

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

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

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

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

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

これで,目的関数と制約関数を定義したため,他のfmincon入力を作成します。

  1. “optimplotfvalconstr”プロット関数を使用して反復表示を返すfmincon用のオプションを作成します。

    选项= Optimoptions('fmincon'...“PlotFcn”“optimplotfvalconstr”...“显示”“通路”);
  2. 初期点を作成します。

    X0 = [0 0];
  3. この例では使用しない制約用の空のエントリを作成します。

    一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];

fminconを呼び出して問題を解きます。

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
Iter的一阶范数f(x)可行性优化步骤03 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- 01 6 301.897216e-01 0.000e+00 2.311e -01 1.147e-01 7 33 1.13701e -01 0.000e+00 9.706e-01 5.764e-02 8 36 1.153330e-01 0.000e+00 1.127e - 00 8.1600e -02 9 39 1.198058e-01 0.000e+00 1.000e-01 1.1600e -02 10 42 8.91005e -02 0.000e+00 8.378e-01 8.301e-02 11 45 6.771960e-02 0.000e+00 1.365e -01 7.149e-02 12 48 6.437664e-02 0.000e+00 1.146e-01 5.701e- 02 13 516.329037e-02 0.000e+00 1.318e-02 3.774e- 02 14 54 4.161934e -02 0.000e+00 3.016e-01 4.464e-02 16 60 4.95540e -02 0.000e+00 5.462e-03 4.185e- 02 2.208e-05 18 66 4.658289e-02 0.000e+00 1.318e-02 1.255e-02 19 69 4.94011e -02 0.000e+00 8.006e-04 4.940e-04 20 724.568281e-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优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。X = 0.7864 0.6177 fval = 0.0457

函数值通常会随着迭代的进行而减少

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

結果の解釈

ライブエディタータスクの出力領域とMATLABコマンドウィンドウの両方の反復表に,MATLABがどのように単位円板内で。関数の最小値を検索したかが表示されます。この表はツールボックスのバージョンや計算プラットフォームによって異なる場合があります。次の説明がこの例で示す表に適用されます。

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

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

  • 3列目はf (x)とラベル付けされ,目的関数の値を表示します。最終値4.567482依照は,最適化の実行で報告される最小値で,コマンドウィンドウの終了メッセージの最後に表示されます。

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

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

参考

|

関連するトピック