
✅作者簡介:人工智能專業大學在讀,喜歡計算機與程式設計,寫部落格記錄自己的學習曆程。
🍎個人首頁:小嗷犬的個人首頁
🍊個人網站:小嗷犬的技術小站
🥭個人信條:為天地立心,為生民立命,為往聖繼絕學,為萬世開太平。
本文目錄
- 什麼是非線性規劃問題
- 如何使用 MATLAB 解決非線性規劃問題
什麼是非線性規劃問題
非線性規劃問題仍是規劃問題的一種,但是目标函數和限制條件不再是線性的,而是存在非線性的部分,如指數函數、對數函數、三角函數等。
如何使用 MATLAB 解決非線性規劃問題
常見的非線性規劃問題通常類似于以下形式:
min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 \begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation} minf(x)=x12+x22+x32+8
s.t. { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 3 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \left\{ \begin{array}{c} x_{1}^2-x_{2}+x_{3}^2 \geq 0 \\ x_{1}+x_{2}^2+x_{3}^3 \leq 20 \\ -x_{1}-x_{2}^2+2 = 0 \\ x_{2}+2x_{3}^2 = 3 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array} \right. \end{equation} s.t. ⎩ ⎨ ⎧x12−x2+x32≥0x1+x22+x33≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
其中,公式1為目标函數,公式2為限制條件。
對于非線性規劃問題,MATLAB 提供了
fmincon
函數來解決,其基本文法為:
其中,
fun
為目标函數,
x0
為初始值,
A
為線性不等式限制的系數矩陣,
b
為線性不等式限制的右端項,
Aeq
為線性等式限制的系數矩陣,
beq
為線性等式限制的右端項,
lb
為變量的下界,
ub
為變量的上界,
nonlcon
為非線性限制函數。
MATLAB 中的非線性規劃問題的标準形式為:
min x f ( x ) such that { c ( x ) ≤ 0 , c e q ( x ) = 0 , A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b \min _{x} f(x) \text { such that } \left\{ \begin{array}{c} c(x) \leq 0, \\ ceq(x) = 0, \\ A \cdot x \leq b, \\ { Aeq } \cdot x={ beq }, \\ l b \leq x \leq u b \end{array} \right. xminf(x) such that ⎩ ⎨ ⎧c(x)≤0,ceq(x)=0,A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub
其中,
c(x)
為非線性不等式限制,
ceq(x)
為非線性等式限制。
是以要使用
fmincon
函數,需要先将非線性規劃問題轉為标準形式:
min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 \begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation} minf(x)=x12+x22+x32+8
s.t. { − x 1 2 + x 2 − x 3 2 ≤ 0 x 1 + x 2 2 + x 3 3 − 20 ≤ 0 x 1 + x 2 2 − 2 = 0 x 2 + 2 x 3 2 − 3 = 0 x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \left\{ \begin{array}{c} -x_{1}^2+x_{2}-x_{3}^2 \leq 0 \\ x_{1}+x_{2}^2+x_{3}^3-20 \leq 0 \\ x_{1}+x_{2}^2-2 = 0 \\ x_{2}+2x_{3}^2-3 = 0 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array} \right. \end{equation} s.t. ⎩ ⎨ ⎧−x12+x2−x32≤0x1+x22+x33−20≤0x1+x22−2=0x2+2x32−3=0x1,x2,x3≥0
這裡沒有線性限制條件,是以
A
和
b
為空矩陣。
接下來,将目标函數和非線性限制條件分别寫成函數形式:
function f = objfun(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end
function [c,ceq] = nonlcon(x)
c = [-x(1)^2 + x(2) - x(3)^2; x(1) + x(2)^2 + x(3)^3 - 20];
ceq = [x(1) + x(2)^2 - 2; x(2) + 2*x(3)^2 - 3];
end
将函數分别儲存到
objfun.m
和
nonlcon.m
檔案中。
最後,使用
fmincon
函數求解:
[x,fval] = fmincon(@objfun,[0 0 0],[],[],[],[],[0 0 0],[],@nonlcon)
% 或
[x,fval] = fmincon('objfun',[0 0 0],[],[],[],[],[0 0 0],[],'nonlcon')
通過修改
x0
的值,可以改變疊代過程,但是最終的解是相同的。
本題的解為:
x =
0.5522 1.2033 0.9478
fval =
10.6511