function []=blatt6() z0=[5,5]; gamma=0.01; eta=0.9; beta=0.5; [a,b]=grad_pow_wol( @f, @gradf, z0, gamma, eta); [c,d]=gradarmijo( @f, @gradf, z0, beta, gamma); %Armijo konvergiert nicht, die Schrittweiten sind für die Suchrichtungen 2^-k nicht zulässig (es gilt 2^-k*gradf(x_k) -> 0, obwohl inf_k |gradf(x_k)|> 0) figure; hold on; X=[-6:0.01:6]; Y=[-6:0.01:6]; [X,Y]=meshgrid(X,Y); Z=1/8*(X.^2+Y.^2); contour(X,Y,Z,20); plot(a(:,1),a(:,2),'k--x') legend('Höhenlinien','Powell-Wolfe') xlabel('x') ylabel('y') figure; hold on; X=[-6:0.01:6]; Y=[-6:0.01:6]; [X,Y]=meshgrid(X,Y); Z=1/8*(X.^2+Y.^2); contour(X,Y,Z,20); plot(c(:,1),c(:,2),'k:x') legend('Höhenlinien','Armijo') xlabel('x') ylabel('y') end function [z, fz] = gradarmijo( f, gradf, z0, beta, gamma) i=1; z(i,:)=z0; fz(i)=f(z(i,:)); gradfz(i,:)=gradf( z(i,:) ); s(i)=1; while norm( gradfz(i,:) ) > 0.00001 s(i)=1; while f( z(i,:) - s(i)*2^(-i+1)*gradfz(i,:) ) - f( z(i,:) ) > - gamma*s(i)*2^(-i+1)*norm( gradfz(i,:) ) ^2 s(i)=1/2*s(i); end z(i+1,:) = z(i,:) - 2^(-i+1)*s(i)*gradfz(i,:); fz(i+1) = f(z(i+1,:)); gradfz(i+1,:) = gradf( z(i+1,:) ); i = i+1; %Abbruch bei zu vielen Iterationen if norm( 2^(-i+1)*gradfz(i,:) ) == 0 break else end end end function [z, fz] = grad_pow_wol( f, gradf, z0, gamma, eta) i=1; z(i,:)=z0; fz(i)=f(z(i,:)); gradfz(i,:)=gradf(z(i,:)); s(i)=1; while norm( gradfz(i,:) ) > 0.00001 smin(i)=1; while f( z(i,:) - smin(i)*2^(-i+1)*gradfz(i,:) ) - f( z(i,:) ) > - gamma*smin(i)*2^(-i+1)*norm( gradfz(i,:) )^2 smin(i)=1/2*smin(i); end smax(i)=2*smin(i); while f( z(i,:) - smax(i)*2^(-i+1)*gradfz(i,:) ) - f( z(i,:) ) <= - gamma*smax(i)*2^(-i+1)*norm( gradfz(i,:) )^2 smax(i)=2*smax(i); end while gradf( z(i,:) - smin(i)*2^(-i+1)*gradfz(i,:) ) *(-2^(-i+1)*gradfz(i,:))' < - eta*2^(-i+1)*norm( gradfz(i,:) )^2 s0(i) = (smin(i)+smax(i))/2; if f( z(i,:) - s0(i)*2^(-i+1)*gradfz(i,:) ) - f( z(i,:) ) <= - gamma*s0(i)*2^(-i+1)*norm( gradfz(i,:) )^2 smin(i) = s0(i); else smax(i) = s0(i); end end s(i) = smin(i); z(i+1,:) = z(i,:) - s(i)*2^(-i+1)*gradfz(i,:); fz(i+1)=f(z(i+1,:)); gradfz(i+1,:)=gradf( z(i+1,:) ); i=i+1; end end function y=f(z) y = 1/8*(z(1)^2+ z(2)^2); end function y=gradf(z) y = [ 1/4*z(1), 1/4*z(2) ]; end