复合形法求最优化问题
两个函数1.function[x1,fx]=gen_complex(x0,k,f,g_cons)
N=length(x0);
M=size(g_cons);
M=length(M(:,1));
x1(:,1)=x0;
fx(1)=fevel(f,x0);
a=1.3;
s=rand(N,k)*2-ones(N,k);
s=s/norm(s);
k2=1;
while k2<k
x0=x1(:,1)+a*s(:,k2);
gx=fevel(g_cons,x0);
if max(gx)<0
k2=k2+1;
x1(:,k2)=x0;
fx(k2)=fevel(f,x0);
else
a=0.7*a;
end
end
第二个:function [xo,fo,go]=opt_complex(f,g_cons,x0,x1,xu,to1x,to1fun,maxiter)
N=length(x0);
M=size(g_cons);
k1=0;
k=N+1;%单纯性顶点个数
gx=ones(M,1);
while max(gx)>0
x0=x1+rand(N,1).*xu;
gx=feval(g_cons,x0);
end
[x1,fx]=gen_complex(x0,k,f,g_cons);
flag1=1;flag2=1;flag3=1;
k1=0
fx;
x1;
fprintf('此处暂停,请按下任意键继续\n')
pause
while k1<maxiter
flag1=1;flag2=1;flag3=1;
k1=k1+1
[fx,I]=sort(fx);
for i=1:k
x2(:,1)=x1(:,I(i));
end
x1=x2;
fmax1=fx(k);
imax1=I(k);
fmin=fx(1);
imin=I(1);
fmax2=fx(k-1);
imax2=I(k-1);
%计算形心
xc=zeros(N,1);
for i=1:k
xc=xc+x1(:,i);
end
xc=xc-x1(:,imax1);
xc=xc/(k-1);
gxc=feval(g_cons,xc);
alpha=1.31;
%反射
xr=xc+alpha*(xc-x1(:,imax1));
gxr=feval(g_cons,xr)
if max(gxr)<0
fxr=feval(f,xr);
if fxr<fmax1
fprintf('反射成功\n')
fmax1,fxr
fmax1=fxr;
fx(imax1)=fxr;
x1(:,imaxl)=xr;
flag1=-1;
else
%反射失败
flag1=1;
end
else
%反射失败
flag1=1;
end
gama=0.7;
if flag1==-1
fprintf('延伸\n')
xe=xr+gama*(xr-xc);
gxe=feval(g_cons,xe)
if max(gxe)<0
fxe=feval(f,xe);
if fxe<fmax1
fprintf('延伸成功\n')
fxe,fmax1
fx(imax1)=fxe;
fmax1=fxe;
x1(:,imax1)=xe;
flag2=-1;
else
%延伸失败
flag2=1;
end
else
%延伸失败
flag2=1;
end
end
beta=0.7;
if flag1~=-1&flag2~=-1
fprintf('收缩\n')
xk=x1(:,imax1)+beta*(xc-x1(:,imax1));
gxk=feval(g_cons,xk)
if max(gxk)<0
fxk=feval(f,xk);
if fxk<fmax1
fprint('收缩成功\n')
fxk,fmax1
fmax1=fxk;
fx(imax1)=fxk;
x1(:,imax1)=xk;
flag3=-1;
else
%收缩失败
flag3=1;
end
else
%收缩失败
flag3=1;
end
end
if flag1~=-1&flag2~=-1&flag3~=-1
fprintf('flag1,flag2,flag3\n%d%d%d\n',flag1,flag2,flag3)
fprintf('重新生成单纯性\n')
[fx,I]=sort(fx);
imin=I(1);
x0=x1(:,imin);
[x1,fx]=gen_complex(x0,k,f,g_cons)
end
end
xo=x1(:,imin);
fo=feval(f,xo);
go=feval(g_cons,xo);
k1
用户程序是:f=inline('(x(1)-5)^2+4*(x(2)-6)^2','x');
tolx=1e-6;
tolfun=1e-6;
x0=[8,14]';
x1=[2 2]';
xu=[7 9]';
maxiter=65;
option=optimset('largescale','off');
[xo,fxo,g]=opt_complex(f,@fun_cons,x0,x1,xu,tolx,tolfun,maxiter)
[xo,fo]=fmincon(f,x0,[],[],[],[],x1,xu,@fun_cons,options)
function[c ceq]=fun_cons(x)
c=[64-x(1)^2-x(2)^2
-x(1)+x(2)-10
x(1)-10];
ceq=[];
各位大神帮我看看哪里出现了问题