MATLAB 非线性规划

什么是非线性规划问题

非线性规划问题仍是规划问题的一种,但是目标函数和约束条件不再是线性的,而是存在非线性的部分,如指数函数、对数函数、三角函数等。


如何使用 MATLAB 解决非线性规划问题

常见的非线性规划问题通常类似于以下形式:

minf(x)=x12+x22+x32+8\begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation}

 s.t. {x12x2+x320x1+x22+x3320x1x22+2=0x2+2x32=3x1,x2,x30\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}

其中,公式1为目标函数,公式2为约束条件。

对于非线性规划问题,MATLAB 提供了 fmincon 函数来解决,其基本语法为:

1
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

其中,fun 为目标函数,x0 为初始值,A 为线性不等式约束的系数矩阵,b 为线性不等式约束的右端项,Aeq 为线性等式约束的系数矩阵,beq 为线性等式约束的右端项,lb 为变量的下界,ub 为变量的上界,nonlcon 为非线性约束函数。

MATLAB 中的非线性规划问题的标准形式为:

minxf(x) such that {c(x)0,ceq(x)=0,Axb,Aeqx=beq,lbxub\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}

其中,c(x) 为非线性不等式约束,ceq(x) 为非线性等式约束。

所以要使用 fmincon 函数,需要先将非线性规划问题转为标准形式:

minf(x)=x12+x22+x32+8\begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation}

 s.t. {x12+x2x320x1+x22+x33200x1+x222=0x2+2x323=0x1,x2,x30\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}

这里没有线性约束条件,因此 Ab 为空矩阵。

接下来,将目标函数和非线性约束条件分别写成函数形式:

1
2
3
function f = objfun(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end
1
2
3
4
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.mnonlcon.m 文件中。

最后,使用 fmincon 函数求解:

1
2
3
[x,fval] = fmincon(@objfun,[0 0 0],[],[],[],[],[0 0 0],[],@nonlcon)
% 或
[x,fval] = fmincon('objfun',[0 0 0],[],[],[],[],[0 0 0],[],'nonlcon')

通过修改 x0 的值,可以改变迭代过程,但是最终的解是相同的。

本题的解为:

1
2
3
4
5
x =
0.5522 1.2033 0.9478

fval =
10.6511