📄 armijo.m
字号:
%用armijo方法求步长
function lamda=armijo(A,Y,w,r,m,n,kk,G,d);
%G为梯度
%d为搜索方向
D=diag(Y);
e=ones(m,1);
DA=D*A;
De=D*e;
V=e-(DA*w)+(De*r);
switch kk
case 1
for i=1:n
if (V(i)<=-0.01)
V(i)=0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=V(i)^2*25+V(i)*0.5+0.0025;
end
end
case 2
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(100*V(i)-3)*(-1/1600);
end
end
case 3
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(10000*V(i)^3-300*V(i)^2+V(i)+0.05)*(1/32);
end
end
end
f1=0.5*(V'*V+w'*w+r^2);
t=1;
w2=w+t*d(1:n);
r2=r+t*d(n+1);
V=e-(DA*w2)+(De*r2);
switch kk
case 1
for i=1:n
if (V(i)<=-0.01)
V(i)=0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=V(i)^2*25+V(i)*0.5+0.0025;
end
end
case 2
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(100*V(i)-3)*(-1/1600);
end
end
case 3
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(10000*V(i)^3-300*V(i)^2+V(i)+0.05)*(1/32);
end
end
end
f2=0.5*(V'*V+w2'*w2+r2^2);
ff=f1-f2;
while(ff<-0.25*t*G'*d &t>10^-12)
t=t*0.5;
w2=w+t*d(1:n);
r2=r+t*d(n+1);
V=e-(DA*w2)+(De*r2);
switch kk
case 1
for i=1:n
if (V(i)<=-0.01)
V(i)=0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=V(i)^2*25+V(i)*0.5+0.0025;
end
end
case 2
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(100*V(i)-3)*(-1/1600);
end
end
case 3
for i=1:n
if V(i)<=-0.01
V(i) = 0;
elseif V(i)<0.01&V(i)>-0.01
V(i)=(100*V(i)+1)^3*(10000*V(i)^3-300*V(i)^2+V(i)+0.05)*(1/32);
end
end
end
f2=0.5*(V'*V+w2'*w2+r2^2);
ff=f1-f2;
end
lamda=t;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -