【例16】一维问题。
假设有下面的函数:
\[f(x)=({x}_{1}-0.5{)}^{2}+({x}_{2}-0.5{)}^{2}+({x}_{3}-0.5{)}^{2}\]
式中
\[\begin{matrix} {K}_{1}(x,{w}_{1})=\operatorname{sin}{(}{w}_{1}{x}_{1})\operatorname{cos}{(}{w}_{1}{x}_{2})-\frac{1}{1000}({w}_{1}-50{)}^{2}-\operatorname{sin}{(}{w}_{1}{x}_{3})-{x}_{3}\leq 1 \\ {K}_{1}(x,{w}_{2})=\operatorname{sin}{(}{w}_{2}{x}_{2})\operatorname{cos}{(}{w}_{2}{x}_{2})-\frac{1}{1000}({w}_{2}-50{)}^{2}-\operatorname{sin}{(}{w}_{2}{x}_{3})-{x}_{3}\leq 1 \end{matrix}\]
w1和w2有下面的约束:
\[\begin{matrix} 1\leq {w}_{1}\leq 100 \\ 1\leq {w}_{2}\leq 100 \end{matrix}\]
注意:这里半无限约束是一维矢量。因为约束条件必须写为\({K}_{1}(x,{w}_{1})\leq0\)的形式,故需要对约束做如下计算。
首先,写一个M文件fseminf1o.m,计算目标函数值。
code.matlab
function f = myfun(x, s)
% 目标函数
f = sum((x-0.5).^2);
然后,编写M文件fseminf1c.m,计算非线性等式约束和非线性不等式约束,以及半无限约束:
code.matlab
function [c,ceq,K1,K2,s] = mycon(x,s)
% 初始化样本区间
if isnan(s(1,1)),
s = [0.2 0; 0.2 0];
end
% 样本集
w1 = 1:s(1,1):100;
w2 = 1:s(2,1):100;
% 半无限约束
K1 = sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2 -...
sin(w1*x(3))-x(3)-1;
K2 = sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2 -...
sin(w2*x(3))-x(3)-1;
% 无约束
c = []; ceq=[];
% 绘制半无限约束图
plot(w1, K1,'-', w2, K2, ':')
title('Semi-infinite constraints')
drawnow
然后调用优化过程:
code.matlab
>> x0=[0.5;0.2;0.3]; % 给初值
>> [x,fval]=fseminf(@fseminf1o,x0,2,@fseminf1c)
得到问题的解:
code.matlab
x =
0.6675
0.3012
0.4022
解x处的函数值为:
code.matlab
fval =
0.0771
计算解x处的半无限约束最大值。
code.matlab
>> [c,ceq,K1,K2] = fseminf1c(x,NaN);
>> max(K1)
ans =
-0.0077
>> max(K2)
ans =
-0.0812
生成半无限约束图,如图9-1所示。该图演示了约束边界上两个函数如何达到峰值。
\[\]
图9-1 一维问题的半无限约束图
【例17】二维问题。
该问题的数学模型为
\[f(x)=({x}_{1}-0.5{)}^{2}+({x}_{2}-0.5{)}^{2}+({x}_{3}-0.5{)}^{2}\]
式中
\[{K}_{1}(x,w)=\operatorname{sin}{(}{w}_{1}{x}_{1})\operatorname{cos}{(}10{w}_{2}{x}_{2})-\frac{1}{1000}({w}_{1}-50{)}^{2}-\operatorname{sin}{(}10{w}_{1}{x}_{3})-{x}_{3}+...\operatorname{sin}{(}{w}_{2}{x}_{2})\operatorname{cos}{(}{w}_{1}{x}_{1})-\frac{1}{1000}({w}_{2}-50{)}^{2}-\operatorname{sin}{(}{w}_{2}{x}_{3})-{x}_{3}\leq 1.5\]
w1和w2有下面的约束:
\[\begin{matrix} 1\leq {w}_{1}\leq ⥂100 \\ 1\leq⥂⥂ {w}_{2}\leq 100 \end{matrix}\]
初始点为x=[0.2 0.2 0.2]。
注意半无限约束是二维的,即为矩阵。
首先,写一个M文件fseminf2o.m,计算目标函数值。因为目标函数跟上例的相同,所以M文件的代码跟fseminf1o.m的相同。
第2步,为约束条件编写M文件fseminf2c.m:
code.matlab
function [c, ceq, K1,s] = mycon(x, s)
% 初始化取样区间
if isnan(s(1, 1)),
s = [2 2];
end
% 样本集
w1x = 1:s(1,1):100;
w1y = 1: s(1, 2):100;
[wx,wy]=meshgrid(w1x,w1y);
%
% 半无限约束
K1=sin(wx*x(1)).*cos(wy*x(2))-1/1000*(wx-50).^2 -...
sin(wx*x(3))-x(3)+sin(wy*x(2)).*cos(wx*x(1))-...
1/1000*(wy-50).^2-sin(wy*x(3))-x(3)-1.5;
% 无有限非线性约束
c=[]; ceq=[];
% 网格图
mesh(K1)
title('Semi-infinite constraint')
drawnow
下一步调用优化过程,用fseminf函数进行计算。
code.matlab
>> x0 = [0.25, 0.25, 0.25]; % 初值
>> [x,fval] = fseminf(@fseminf2o,x0,1,@fseminf2c)
得到问题的解:
code.matlab
x =
0.6109 0.6308 0.4637
解x处的函数值为:
code.matlab
fval =
0.0307
计算解x处的半无限约束最大值。
>> [c, ceq, K1] = fseminf2c(x, NaN);
>> max(max(K1))
ans =
0.2063
生成网格图如图9-2所示。
\[\]
图9-2 二维问题的半无限约束图