![](https://i-blog.csdnimg.cn/blog_migrate/b169d0aec0105f3bfe5ee1bb509c9ac9.gif#pic_center)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
什么是非线性规划问题
非线性规划问题仍是规划问题的一种,但是目标函数和约束条件不再是线性的,而是存在非线性的部分,如指数函数、对数函数、三角函数等。
如何使用 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. } \begin{cases} & 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{cases} \end{equation} s.t. ⎩ ⎨ ⎧x12−x2+x32≥0x1+x22+x33≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
其中,公式1为目标函数,公式2为约束条件。
对于非线性规划问题,MATLAB 提供了 fmincon
函数来解决,其基本语法为:
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
其中,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 } \begin{cases} & c(x) \leq 0, \\ & ceq(x) = 0, \\ & A \cdot x \leq b, \\ & { Aeq } \cdot x={ beq }, \\ & l b \leq x \leq u b \end{cases} 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. } \begin{cases} & -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{cases} \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