Matlab での fmincon 関数の使用
最近、記事を書くときに最適化のために fmincon 関数を使用する必要があるので、時間をかけて学習しました; いつものように、学習プロセスを記録するためにブログ記事を開き続けます
参考文献:
[制約付き非線形多変量関数の最小値を求める - MathWorks]
[Matlab で非線形計画法を解く、fmincon 関数の使い方まとめ - Blog Park]
[Matlab 非線形計画法 - Blog Park]
1 はじめに
Matlab では、fmincon
この関数は制約付き非線形多変数関数 (制約付き非線形多変数関数) の最小値を解くことができます。つまり、非線形計画問題を解くために使用できます。
Matlab では、非線形計画モデルは次のように記述されます。
最小 f ( x ) s 。と。{ A ⋅ x ≤ b A eq ⋅ x = beqc ( x ) ≤ 0 ceq ( x ) = 0 lb ≤ x ≤ ub min \; f(x) \\ st \begin{cases} A·x ≤b \\ Aeq·x = beq \\ c(x)≤0\\ ceq(x) = 0\\ lb≤x≤ub \end{場合}分f ( x )s 。と。⎩ ⎨ ⎧あ⋅バツ≤bA e q ⋅バツ=ベク_ _c ( x )≤0ce q ( x )=0l b≤バツ≤あなたは
- A. Aeq は線形制約に対応する行列です。
- b. beq は線形制約に対応するベクトルです
- C(x)、Ceq(x) は非線形制約 (ベクトルを返す関数) です。
- f(x) は目的関数 (スカラーを返す関数) です。
2. 文法
Matlab 要求解読コマンド:
x = fmincon ( fun , x 0 , A , b , A eq , beq , lb , ub , nonlcon , options ) x = fmincon(fun,x0,A, b,Aeq,beq,lb,ub 、非Lコン、オプション)バツ=f min con ( f un , _ _× 0 、あ、b 、A e q 、ベク_ _ _l b 、うb、いいえ、_ _ _ _ _オプション) _ _ _ _ _
- x の戻り値は決定ベクトル x の値、fval の戻り値は目的関数 f(x) の値です。
- fun は、M ファイルで定義された関数 f(x) であり、(非) 線形目的関数を表します。
- x0 は x の初期値です
- A、b、Aeq、beq は線形制約を定義します。線形制約がない場合は、A=[]、b=[]、Aeq=[]、beq=[] となります。
- lb と ub は、変数 x の下限と上限です。下限と上限に制約がない場合は、lb=[]、ub=[]、lb の各成分が -inf であると書くこともできます。 、ub の各コンポーネントは inf です
- nonlcon は、M ファイルで定義された非線形ベクトル関数制約です。
- オプションは最適化パラメータを定義します。入力されていない場合は、Matlab のデフォルトのパラメータ設定を使用することを意味します。
3. 例
次の非線形計画問題を解きます:
min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 2 + x 2 2 + x 3 2 ≤ 20 − x 1 2 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 分 \; f(x) = x_{1}^ 2 + x_{2}^2+x_{3}^2+8 \\ st \begin{件} x_{1}^2-x_{2} +x_{3}^2≥0 \\ x_{1 }^2+x_{2}^2 +x_{3}^2≤20 \\ -x_{1}^2-x_{2}^2 +2=0\\ x_{2} +2x_{3} ^2=3\\ x_{1}, x_{2} ,x_{3}≥0 \end{件}分f ( x )=バツ12+バツ22+バツ32+8s 。と。⎩
⎨
⎧バツ12−バツ2+バツ32≥0バツ12+バツ22+バツ32≤20− ×12−バツ22+2=0バツ2+2倍_32=3バツ1、バツ2、バツ3≥0
3.1 M 関数 fun1.m を記述し、目的関数を定義する
function f = fun1(x)
f = x(1).^2 + x(2).^2 + x(3).^2 + 8;
end
3.2 M 関数 fun2.m を作成し、非線形制約を定義する
function [g,h] = fun2(x)
g(1) = - x(1).^2 + x(2) - x(3).^2;
g(2) = x(1) + x(2).^2 + x(3).^3 - 20;
% g代表不等式约束,Matlab中默认g<=0,所以这里取相反数
h(1) = - x(1).^2 - x(2).^2 + 2;
h(2) = x(2) + 2 * x(3).^2 - 3;
% h代表等式约束
end
3.3 メインプログラム関数の作成
options = optimset;
[x, y] = fmincon('fun1', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'fun2', options)
% 'fun1'代表目标函数,rand(3, 1)随机给了x初值,zeros(3, 1)代表下限为0,即x1, x2, x3>=0, 'fun2'即刚才写的约束条件
得られた結果、x は最適解、y は最適値:
x 1 = 0.6312 、 x 2 = 1.2656 、 x 3 = 0.9312 y = 10.8672 x_{1}=0.6312,x_{2}=1.2656,x_{3 } =0.9312\\ y=10.8672バツ1=0.6312 、バツ2=1.2656 、バツ3=0.9312y=10.8672