半无限问题应用实例

【例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所示。该图演示了约束边界上两个函数如何达到峰值。

Document Image
\[\]

图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所示。

Document Image
\[\]

图9-2 二维问题的半无限约束图