非线性规划

数学表达

minf(x)\\
s.t.\begin{cases}
Ax \leq B\\
Aeq \cdot x=Beq\\
C(x)\leq 0\\
Ceq(x) = 0
\end{cases}
  • 为目标函数,可以是任意函数
  • 为矩阵相乘,前两个条件是线性等式和线性不等式,与线性规划相同
  • 为非线性等式和非线性不等式

fmincon函数

[x,fval]=fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)
  • 是初始值,因为这个函数只能找到局部最优解,所以初始值很重要
  • NONLCON 为非线性规划的等式和不等式
  • FUN 和 NONLCON 要写在一个函数文件中,其中,NONLCON有两个输出,即 ,其中,第一个输出 c 为不等式,第二个输出 ceq 为等式
  • 这个函数虽然实际上没有什么用,因为NP难问题是很难找到全局最优解的,这个函数不够“智能”,但是这个函数的调用形式是非常重要的,很多智能算法工具箱都是这样的形式

函数说明

  • 新建一个函数的m文件,function f = functionName(x);则在脚本中@functionName或者‘functionName’就可以引用这个函数
  • 在函数中x1用 x(1) 表示,代表 x 向量的第一个元素。

实例

 minf(x)=x_1^2+x_2^2+8\\
 s,t.\begin{cases}
 x_1^2-x_2 \geq 0\\
 -x_1-x_2^2+2=0\\
 x_1,x_2\geq 0
 \end{cases}
//fun1.m

function f = fun1(x)
f = x(1)^2 + x(2)^2 + 8;
end

//fun2.m

function [c,ceq] = fun2(x)
c = -x(1)^2+x(2);
ceq = -x(1)-x(2)^2+2;
end

//main.m

[x,fval] = fmincon(@fun1,rand(2,1),[],[],[],[],zeros(2,1),[],@fun2);
disp(x);
disp(fval);

本文章使用limfx的vscode插件快速发布