📄 ysc.m
字号:
function [Ntotle2,NNN,number2]=gu(y)
%for i=1:30
y=2;
if y==2
number2=0;
NNN=0;
Ntotle2=1;
for NO=1:5
[nprob,n,m,x0]=init(NO);
ee=1e-5;
ee2=1e-12;
e=100000000;
gk=grdfcn(n,m,x0,nprob);
dk=(-1)*gk;
gk2=gk;
dk2=dk;
dk2(1)=dk(2);
dk2(2)=(-1)*dk(1);
dk2(3:n)=0;
p=0.01;
b=0.1;
NI=0;
a=[norm(gk)]^(-1);
q=norm(gk);
NGG=1;
NFF=1;
%pause;
%printf('%c','I');
while (q>=ee)&(NI<60000)
if NI==0
a=a;
else
a=a*(gk11'*dk0)/(gk1'*dk);
end
a1=0;
a2=10;
sk=a*dk;
sk2=a*dk2;
x1=x0+sk;
x12=x0+sk2;
f0=objfcn(n,m,x0,nprob);
f02=f0;
f1=objfcn(n,m,x1,nprob);
f12=objfcn(n,m,x12,nprob);
gk1=grdfcn(n,m,x1,nprob);
gk12=grdfcn(n,m,x12,nprob);
j=0;
M=0;
ff0=gk'*dk;
while (j==0) &(M<50)
if (f1<=f0+p*a*gk'*dk)
gk1=grdfcn(n,m,x1,nprob);
ff1=gk1'*dk;
NGG=NGG+1;
if (ff1>=b*gk'*dk)&(ff1<=-e*b*gk'*dk)
j=-1;
else
aa=a+(a-a1)*gk1'*dk/((gk'-gk1')*dk);
a1=a;
f0=f1;
ff0=ff1;
a=aa;
end
else
tt=(f0-f1)/((a-a1)*ff0);
aa=a1+0.5*(a-a1)/(1+tt);
a2=a;
a=aa;
end
x1=x0+a*dk;
f1=objfcn(n,m,x1,nprob);
gk1=grdfcn(n,m,x1,nprob);
M=M+1;
NFF=NFF+1;
end
j=0;
M=0;
%ff02=gk2'*dk2;
while (j==0) &(M<50)
if (f12<=f02+p*a*gk2'*dk2)&(f12>=(1-p)*a*gk2'*dk2)
%gk12=grdfcn(n,m,x12,nprob);
%ff12=gk12'*dk2;
%NGG=NGG+1;
else
tt=(f02-f12)/((a-a1)*ff02);
aa=a1+0.5*(a-a1)/(1+tt);
a2=a;
a=aa;
end
x12=x0+a*dk2;
f12=objfcn(n,m,x12,nprob);
gk12=grdfcn(n,m,x12,nprob);
M=M+1;
NFF=NFF+1;
end
f1=objfcn(n,m,x1,nprob);
f12=objfcn(n,m,x12,nprob);
if f1<f12
x0=x1;
gk11=grdfcn(n,m,x0,nprob);
gk=grdfcn(n,m,x1,nprob);
dk0=dk;
yk=gk'*(gk-gk11);
k=(gk-gk11)'*dk0;
betak=yk/k;
q=norm(gk);
dk=(-1)*gk+betak*dk0;
if (gk1'*dk>ee2)
dk1=-gk1;
x1=x0+a*(-gk1);
gk1=grdfcn(n,m,x1,nprob);
end
else
x0=x12;
gk112=grdfcn(n,m,x0,nprob);
gk2=grdfcn(n,m,x12,nprob);
dk02=dk2;
yk2=gk2'*(gk2-gk112);
k2=(gk2-gk112)'*dk02;
betak2=yk2/k2;
q=norm(gk2);
dk2=(-1)*gk2+betak2*dk02;
if (gk12'*dk2>ee2)
dk12=-gk12;
x12=x0+a*(-gk12);
gk12=grdfcn(n,m,x12,nprob);
end
end
%betak=(gk'*gk)/(yk'*dk); % DY
%betak=-(gk'*yk)/(dk'*gk11); % LS
%betak=(gk'*yk)/(yk'*dk); % HS
% HS
NI=NI+1;
end
if (q<=ee)
Totle2=NFF+NGG*5;
NNN=max(Totle2,NNN);
else
Totle2=1;
number2=number2+1;
end
Ntotle2=Totle2*Ntotle2;
diary 001.m
sprintf('%d %d %d %d %d/%d/%d %d %d',nprob,n,m,f1,NI,NFF,NGG,Totle2,number2)
diary off
end
else
Ntotle2=0;
NNN=0;
number2=0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -