多变量约束优化算法实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、非线性不等式约束
【例1】已知 f(x)=e x1∗(4x12+2x22+4x1x2+2x2+1) ,且满足非线性约束:
{x1x2−x1−x2≤−1.5
x1x2≥−10,求min x f(x)。
【分析】fmincon函数要求的约束一般为c(x)≤0。故对约束条件要变形。【程序清单】
%编写目标函数:
function y=objfun(x)
y=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
%编写返回约束值得函数:
function[c,ceq]=confun(x)
%非线性不等式约束
c=[1.5+x(1)*x(2)-x(1)-x(2); -x(1)*x(2)-10];
%线性等式约束
ceq=[];
x0=[-1,1];
%采用标准算法
options=optimset('largescale','off'); %这是对寻优函数搜索方式的设定,LargeScale指大规模搜索,off表示在规模搜索模式关闭。
[x,fval]=fmincon('objfun',x0,[],[],[],[],[],[],'confun',options)
【输出结果】
x =
-9.5474 1.0474
fval =
0.0236
2、边界约束问题
【例2】已知 f(x)=e x1∗(4x12+2x22+4x1x2+2x2+1) ,求min
x
f(x)。
且满足非线性约束:{x1x2−x1−x2≤−1.5 x1x2≥−10
边界约束:{x1≥0 x2≥0
【分析】此类问题在非线性约束的基础上增加了变量x的边界条件,在fmincon 函数输入参数中加上Ib和ub参数即可。
【程序清单】
%编写目标函数:
function y=objfun(x)
y=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
%编写返回约束值得函数:
function[c,ceq]=confun(x)
%非线性不等式约束
c=[1.5+x(1)*x(2)-x(1)-x(2); -x(1)*x(2)-10];
%线性等式约束
ceq=[];
x0=[-1,1];
%设置下界
Ib=[0,0];
%无上界
ub=[];
%采用标准算法
options=optimset('largescale','off'); %这是对寻优函数搜索方式的设定,LargeScale指大规模搜索,off表示在规模搜索模式关闭。
[x,fval]=fmincon('objfun',x0,[],[],[],[],Ib,ub,'confun',options)
【输出结果】
x =
0 1.5000
fval =
8.5000
>> [c,ceq]=confun(x)
c =
-0.0000
-10.0000
ceq =
0 1.5000
3、利用梯度求解约束优化问题
【例3】已知 f(x)=e x1∗(4x12+2x22+4x1x2+2x2+1) ,且满足非线性约
束:{x1x2−x1−x2≤−1.5
x1x2≥−10,求min x f(x)。
【分析】一般来说,标准算法求解函数的最小值常使用由有限差分逼近的到的离散数字梯度,在这个过程中,为了计算目标函数约束的偏微分,所有变量被系统地加以调动。当使用梯度求解上述问题时,效率更高并且结果更精确。
题目中目标函数的偏微分为:
∂f ∂x =[
e x1∗(4x12+2x22+4x1x2+2x2+1)+e x1∗(8∗x(1)+4∗x(2))
e x1∗(4x1+4x2+2)
]
【程序清单】
%编写目标函数和梯度的m文件:
function [f,g]=objfun(x)
f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
t=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
% g中包涵着目标函数的偏微分信息
g=[t+ exp(x(1))*(8*x(1)+4*x(2)); exp(x(1))*( 4*x(1) +4*x(2)+2)];
%编写不等式约束及其梯度的.m文件:
function[c,ceq,dc,dceq]=confun(x)
%不等式约束
c=[1.5+x(1)*x(2)-x(1)-x(2); -x(1)*x(2)-10];
%约束的梯度
dc=[x(2)-1,-x(2);x(1)-1,-x(1) ];
%没有非线性约束
ceq=[];
dceq=[];
% dc的列包涵着不同约束各自的偏微分,也就是说,dc的第i列是第i个约束条
件对x的偏微分,在此处dc为:[∂c1
∂x1
∂c2
∂x1
∂c1
∂x2
∂c2
∂x2
]=[
x2−1−x1
x1−1−x2]
x0=[-1,1];
%设置下界
Ib=[0,0];
%无上界
ub=[];
%采用标准算法
options=optimset('largescale','off'); %这是对寻优函数搜索方式的设定,LargeScale指大规模搜索,off表示在规模搜索模式关闭。
options=optimset( options,'GradObj','on','GradConstr','on');
[x,fval]=fmincon('objfun',x0,[],[],[],[],Ib,ub,'confun',options)
>> [c,ceq]=confun(x)
【输出结果】
x =
0 1.5000