MATLAB非线性规划

数学形式

m i n f ( x ) s . t . { A x B A e q x = B e q C ( x ) 0 C e q ( x ) = 0 minf(x)\\ s.t.\begin{cases} Ax \leq B\\ Aeq \cdot x=Beq\\ C(x)\leq 0\\ Ceq(x) = 0 \end{cases}

  • f ( x ) f(x) 为目标函数,可以是任意函数
  • A x Ax 为矩阵相乘,前两个条件是线性等式和线性不等式,与线性规划相同
  • C ( x ) C e q ( x ) C(x)、Ceq(x) 为非线性等式和非线性不等式

fmincon函数

[ x , f v a l ] = f m i n c o n ( F U N , X 0 , A , B , A e q , B e q , L B , U B , N O N L C O N ) [x,fval]=fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)

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

函数说明

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

实例

m i n f ( x ) = x 1 2 + x 2 2 + 8 s , t . { x 1 2 x 2 0 x 1 x 2 2 + 2 = 0 x 1 , x 2 0 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);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43575267/article/details/89606763