MATLAB 非线性规划

MATLAB求解非线性规划可以使用 fmincon 函数,其数学模型可以写成如下形式:

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

其中,fun是目标函数,x0是初始值,A,b 规定线性不等式约束条件,Aeq,beq 规定线性等式约束条件,lb 规定可行解的数值下限,ub规定可行解的数值上限。nonlcon是包含非线性约束条件(C(x),Ceq(x))的函数。使用options所指定的优化选项执行最小化。

例如,使用MATLAB计算如下非线性规划。

x0 = [0.5,0];
A = [1,-2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)

带有边界约束的,例如:

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
lb = [0,0];
ub = [1,2];
% 没有线性约束,因此将这些参数设置为 []。
A = [];
b = [];
Aeq = [];
beq = [];
% 尝试使用一个位于区域中部的初始点。
x0 = (lb + ub)/2; 
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

带有非线性约束的,例如:

%% 主函数
options=optimset('largescale','off'); 
x = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options) 

%% 目标函数
function f=fun(x)
f=sum(x.^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

 

 特别注意:

目标函数为最小化函数,fun是一个函数,fun接受向量或数组 x,并返回实数标量 f,即在 x 处计算的目标函数值。

非线性约束条件,nonlcon是一个函数,接受向量或数组 x,并返回两个数组 c(x) 和 ceq(x)。

意味着 fun 和 nonlcon 不能更改已有输入和输出的用途或含义,也不能增加额外的输入和输出。当目标函数或非线性约束条件较为复杂时,可以通过定义和使用全局变量(global)传递参数,例如:

%% 主函数
global region;
global speces;
region=rand(10,10);
speces=unifrnd(20,2);
options=optimset('largescale','off'); 
x = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options);

%% 目标函数
function f=fun(x)
global region;
f=sum(x.^2)+sum(sum(region));
end

%% 非线性约束条件
function [c,ceq]=nonlcon(x)
global speces;
c=[-x(1)^2+x(2)-x(3)^2 
    x(1)+x(2)^2+x(3)^3-sum(speces(:,1))];  %非线性不等式约束 
ceq=[-x(1)-x(2)^2+2 
   x(2)+2*x(3)^2--sum(speces(:,2))]; %非线性等式约束 
end

  

特别感谢:

任雪樵 

 

参考资料:

https://ww2.mathworks.cn/help/optim/ug/fmincon.html

https://blog.csdn.net/qq_29831163/article/details/89483975

https://blog.csdn.net/qq_29831163/article/details/89485908

 

 

 
posted @ 2021-02-26 15:13  CollinsLi  阅读(2553)  评论(0编辑  收藏  举报