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