
非線性規划問題的基本內容
非線性規划解決的是自變量在一定的非線性約束或線性約束組合條件下,使得非線性目標函數求得最大值或者最小值的問題。
當目標函數為最小值時,上述問題可以寫成如下形式:
\[\min z={F(x)} \]
\[\text { s.t. } \left\{\begin{array}{l} {\mathbf{A}\mathbf{X} \leqslant \mathbf{B}} \\ {\mathbf{A}_{\mathrm{eq}} \mathbf{X}=\mathbf{B}_{\mathrm{eq}}} \\ G(x) \leqslant 0 \\ H_{\mathrm{eq}}(x) = 0 \\ {\mathbf{LB} \leqslant \mathbf{X} \leqslant \mathbf{UB}} \end{array}\right. \]
其中
\(F(x)\) 為非線性目標函數
\(G(x)\) 為非線性不等式約束條件
\(H_\mathrm{eq}(x)\) 為非線性等式約束條件
\(\mathbf{X}\) 為決策變量向量
\(\mathbf{A}\) 為線性不等式系數矩陣
\(\mathbf{B}\) 為線性不等式右端常數向量
\(\mathbf{A}_\mathrm{eq}\) 為線性等式系數矩陣
\(\mathbf{B}_\mathrm{eq}\) 為線性等式右端常數向量
\(\mathbf{L B}\) 為決策變量下界向量
\(\mathbf{U B}\) 為決策變量上界向量
Matlab模型代碼
調用形式
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON) % 統一形式
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(F,X0,A,B,Aeq,Beq,LB,UB,NONLCON) % 線性目標函數,包含非線性約束
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(@(X)MYOBJ(X),X0,A,B,Aeq,Beq,LB,UB,@(X)MYCON(X)) % 自己定義目標函數和非線性約束函數
% 目標函數
function F = MYOBJ(X)
F = ......
% 非線性約束函數
function [G,Heq] = MYCON(X)
G = ..... % 非線性不等式約束條件
Heq = ..... % 非線性等式約束條件
輸入變量
- FUN 為目標函數,可以自己定義,輸入變量X,輸出目標值
- X0 為初始解
- A 為不等式約束系數矩陣(注意默認不等式方向為小於等於,若為大於等於,需要將其取相反數)
- B 為不等式右端常數向量(注意默認不等式方向為小於等於,若為大於等於,需要將其取相反數)
- Aeq 為等式約束系數矩陣
- Beq 為等式右端常數向量
- LB 為決策變量下界向量
- UB為決策變量上界向量
- NONLCON 為非線性約束,可以自己定義,其中包括非線性不等式約束,非線性等式約束兩種約束。輸入變量X,輸出不等式計算值,等式計算值
在調用時,輸入參數不存在時,可以將其輸入用 [] 空矩陣表示。
輸出變量
- X 為最優解
- FVAL 為最優目標值
- EXITFLAG 為運行結束標志,當等於1時,表示程序收斂於解 X;當等於0時,表示程序運行次數到達最大;當小於0時,說明情況較多
- OUTPUT 為程序迭代次數
- LAMBDA 為解X相關的Largrange乘子和影子價格
案例演示
目標函數與約束條件
\[\min f(x)=x_{1}^{2}+x_{2}^{2}+8$$ $$\text { s.t. }\left\{\begin{array}{l}{x_{1}^{2}-x_{2} \geq 0} \\ {-x_{1}-x_{2}^{2}+2=0} \\ {x_{1}, x_{2} \geq 0}\end{array}\right. \]
Matlab程序
clc
clear
close all
x0=rand(2,1); % 隨機產生初始解
A=[];
B=[];
Aeq=[];
Beq=[];
LB=[0,0];
UB=[];
[x,fval,exitflag]=fmincon(@(x)myobj(x),x0,A,B,Aeq,Beq,LB,UB,@(x)mycon(x))
% 目標函數
function F = myobj(x)
F = x(1)^2+x(2)^2+8;
end
% 非線性約束函數
function [G,Heq] = mycon(x)
G = -x(1)^2+x(2);
Heq = -x(1)-x(2)^2+2;
end
運行結果
x =
1.0000
1.0000
fval =
10.0000
exitflag =
1
