0% found this document useful (0 votes)
129 views27 pages

EE 553 Homeworks Moyo

This document contains summaries of 7 homework assignments completed by Larasmoyo Nugroho for an optimization methods course. The assignments cover topics such as coordinate descent methods, Newton's method for line search, secant method line search, Fibonacci method line search, comparing steepest descent and Newton's method on the Rosenbrock function, and gradient descent. Code implementations and analyses are provided for each homework problem.

Uploaded by

larasmoyo
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
129 views27 pages

EE 553 Homeworks Moyo

This document contains summaries of 7 homework assignments completed by Larasmoyo Nugroho for an optimization methods course. The assignments cover topics such as coordinate descent methods, Newton's method for line search, secant method line search, Fibonacci method line search, comparing steepest descent and Newton's method on the Rosenbrock function, and gradient descent. Code implementations and analyses are provided for each homework problem.

Uploaded by

larasmoyo
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 27

EE 553 Homeworks 4, 5, 6, 7, 8, 9 Larasmoyo Nugroho - 1837 087

Assignmen 4 11! "rogram o #m$%emen &oor'ina e (es)en *e ho' The following minimization problem with L1-regularization

Implementation of CGD method

coordinatedescent_moyo.m function coordl1bregdemo

% An example using Coordinate Descent Method % updated by Larasmoyo Nugroho 1837087 % N M A Construct A as a rand matrix. = 512*2; = N/2; = randn(M,N);

% Construct u_exact as a sparse vector. p = floor(0.05*N); u_exact = zeros(N,1); % u_exact has spikes at uniformly random locations with amplitudes % distributed uniformly in [0,1] a = randperm(N); % u_exact(a(1:p)) = a(p+1:2*p)*0.08+5; % 0.08 + 5 u_exact(a(1:p)) = rand(p,1)*N; %randn is fast. % Construct f = A*u_exact. f = A*u_exact; % Precompute B = A'*A. This step is not necessary. B = A'*A; % Initialize lambda. lambda = 10; % Call the main function COORDL1BREG. %[u,Energy] = coordl1breg(A,f,lambda,'B',B,'PlotFun',@myplotfun); [v,Energy] = coordlsl1(A,f,lambda,'B',B,'PlotFun',@myplotfun); % Plot the Energy function. figure(2); semilogy(Energy,'.-'); xlabel('Iteration'); ylabel('Energy'); % COORDL1BREG will call this function every iteration to plot intermediate solutions. % Show the comparison of the output u and u_exact. function myplotfun(v) figure(1); x = 1:length(v); plot(x,v,'.r',x,u_exact,'o'); xlim([1,length(v)]); end end

%The main Coordinate Direction Program


function [v,Energy] = coordlsl1(A,f,lambda,varargin) %COORDLSL1 Least-squares L1 minimization with coordinate descent % u = COORDLSL1(A,f,lambda) solves the minimization problem % % min_u ||u||_1 + lambda ||A*u - f||_2^2 % % where A is an MxN matrix and f is a vector of length M. % % COORDLSL1(...,'PARAM1',VALUE1,'PARAM2',VALUE2,...) can be used to % specify additional parameters: % u0 - Initial value of u (default 0) % B - Precomputed A'*A % Tol - Stopping tolerance: |du| < Tol (default 1e-4) % MaxIter - Maximum iterations (default 1e3) % PlotFun - A function handle with the syntax PlotFun(u) for % plotting intermediate solutions (default []) % Display - If equal to 1, displays convergence information when % solver converges (default 1) % % [u,Energy] = COORDLSL1(...) returns a vector of energy values at each % iteration (beginning with the first iteration). % % See also coordl1breg. % Updated by Larasmoyo Nugroho 2013 from Yingying Li 2009 %%% Default parameters %%% u0 = zeros(size(A,2),1); MaxIter = 1e3; Tol = 1e-4; PlotFun = []; B = []; Display = 1; %%% Parse inputs %%% if nargin >= 2 parseinput(varargin); end OutputEnergyFlag = (nargout >= 2); if isempty(B) B = A'*A; end w = diag(B); NormalizedFlag = all(w == 1); v = u0; C = A'*f; mu = 1/2/lambda; temp = C; if OutputEnergyFlag % Check if Energy is an output

Energy = zeros(MaxIter,1); end %%% Main Loop %%% for j = 1:MaxIter if NormalizedFlag tilde_v = min(temp + mu, dEnergy = lambda*(v.^2 2*lambda*temp.*(v-tilde_v); else tilde_v = min(temp + mu, dEnergy = lambda*(v.^2 2*lambda*temp.*(v-tilde_v); end

max(0,temp - mu)); tilde_v.^2) + abs(v) - abs(tilde_v) -

max(0,temp - mu))./w; tilde_v.^2).*w + abs(v) - abs(tilde_v) -

[dvchange,i] = max((dEnergy)); if OutputEnergyFlag Energy(j) = norm(A*v-f,2)^2*lambda + sum(abs(v)); end if ~isempty(PlotFun) PlotFun(v); end dv = (v(i)-tilde_v(i)); if abs(dv) < Tol if Display fprintf('Converged in %d iterations with |du| = %.4e < %.4e.\n',... j,abs(dv),Tol); end break; end temp = temp + dv*B(:,i); if NormalizedFlag temp(i) = temp(i) - dv; else temp(i) = temp(i) - dv*w(i); end v(i) = tilde_v(i); end if OutputEnergyFlag Energy = Energy(1:j); end return;

function parseinput(pvlist) %PARSEINPUT Parse varargin list of property/value pairs

Property = {'u0','MaxIter','Tol','PlotFun','B','Display'}; for k = 1:2:length(pvlist)-1 if ~ischar(pvlist{k}) error('Invalid property'); end i = find(strcmpi(pvlist{k},Property)); if length(i) ~= 1 error('Invalid property'); elseif ischar(pvlist{k+1}) error('Invalid value'); else assignin('caller',pvlist{k},pvlist{k+1}); end end return;

Minimization of Energy Cost

12. 12. NEWTON METHOD FOR LINE SEARCH newtonmethod_moyo.m


%% Newton Method for Line Search % by Larasmoyo Nugroho 2013 n=0; %initialize iteration counter eps=1; %initialize error x=[-2]; %set starting value f=inline('x^3-2*x-5') % OBJECTIVE FUNCTION f_x1=f(x) % Find f(x) plot(x,f_x1,'bs') hold on D = diff(sym(f),'x') %differentiate the inline function wrt x subs(D,x) %evaluate D(x) DD=diff(D) eps=abs(f(x)) %Computation loop % while eps>1e-10 & n<200 & subs(DD,x)<0 while n<200 f_x0=f(x) y=x-(subs(D,x)/subs(DD,x)); min) % y=x-(f_x0/subs(D,x)); subs(DD,x) x=y; f_x1=f(x); eps=abs(subs(D,x)) plot(x,f_x1,'bs') n=n+1;

%to find Dfx = 0 (could be max or %to find fx=0 %first derivative value %update x %value of function(x) %error %iterate

end n,x,f_x1,eps fplot(f,[-5 2]) title('Newton Method',... 'FontWeight','bold')

Assignmen 5 se)an +moyo!m


%Secant Method Line Search Larasmoyo Nugroho 1837087 n=0; %initialize iteration counter eps=1; %initialize error x=[-2]; %set starting value x0=[-1]; %set 2b=nd starting value f=inline('x^3-2*x-5') f_x1=f(x) % Find f(x) plot(x,f_x1,'bs') hold on D = diff(sym(f),'x') %differentiate the inline function wrt x subs(D,x) %evaluate D(x) DD=diff(D) eps=abs(f(x)) %Computation loop % while eps>1e-10 & n<200 & subs(DD,x)<0 while n<20 f_x0a=f(x) f_x0b=f(x0) y=x-(x-x0)/(f_x0a-f_x0b)*(f_x0a); %to find fx=0 subs(DD,x) %first derivative value x=y; %update x f_x1a=f(x); %value of function(x) f_x1b=f(x0); %value of function(x) eps=abs(subs(D,x)) %error plot(x,f_x1a,'gx',x,f_x1b,'bx') n=n+1; %iterate end n,x,f_x1,eps fplot(f,[-5 2]) title('Secant Method Line Search','Fontsize',10);

,i-ona))i+moyo+ es !m
fibonacci_moyo(f,-5,5,.05,.02) fplot(f,[-5 2]) title('Fibonacci Method Line Search','Fontsize',10); %Fibonacci Method Line search - Larasmoyo Nugroho 1837087 % clear function X=fibonacci(f,a,b,tol,e) clf %Input - f, the object function % - a, the left endpoint of the interval % - b, the right endpoint of the interval % - tol, length of uncertainty % - e, distinguishability constant %Output - X, x and y coordinates of minimum %Note this function calls the m-file fib.m %If f is defined as an M-file function use the @ notation % call X=fibonacci(@f,a,b,tol,e). %If f is defined as an anonymous function use the % call X=fibonacci(f,a,b,tol,e). %Determine n i=1; F=1; while F<=(b-a)/tol F=fib(i); i=i+1; end %Initialize values n=i-1; A=zeros(1,n-2);B=zeros(1,n-2); A(1)=a; B(1)=b; c=A(1)+(fib(n-2)/fib(n))*(B(1)-A(1)); d=A(1)+(fib(n-1)/fib(n))*(B(1)-A(1)); k=1; %plot()s plot(a,c,'bs') % plotting x hold on plot(b,d,'bx') %Compute Iterates while k<=n-3 if f(c)>f(d) A(k+1)=c; B(k+1)=B(k); c=d; d=A(k+1)+(fib(n-k-1)/fib(n-k))*(B(k+1)-A(k+1)); f_x1=f(d); plot(d,f_x1,'gs'); else A(k+1)=A(k); B(k+1)=d; d=c;

c=A(k+1)+(fib(n-k-2)/fib(n-k))*(B(k+1)-A(k+1)); f_x2=f(c); plot(c,f_x2,'gx') end k=k+1; end %Last iteration using distinguishability constant e if f(c)>f(d) A(n-2)=c; B(n-2)=B(n-3); c=d; d=A(n-2)+(0.5+e)*(B(n-2)-A(n-2)) f_x1=f(d) plot(d,f_x1,'ks') else A(n-2)=A(n-3); B(n-2)=d; d=c; c=A(n-2)+(0.5-e)*(B(n-2)-A(n-2)) f_x2=f(d) plot(c,f_x2,'ko') end

Assignment 6 steepdescentwnewton_moyo.m %Larasmoyo Nugroho 1837087 - steep descent method vs Newton Method for Rosenbrock
clear all clf n=0; %initialize iteration counter eps=1; %initialize error % a=0.001; %set iteration parameter syms alpha; x=[-2 1]'; %set starting value y=[0 0]' %Computation loop using STEEP DESCENT while eps>1e-4&n<10 % g=[100*(x(2)-x(1)^2)^2 + (1-x(1))^2] %g(x) gradf=[2*x(1)-400*x(1)*(-x(1)^2+x(2))-2 ;-200*x(1)^2+200*x(2)]; % gradf=[100*(x(2)-x(1)^2)^2 + (1-x(1))^2]; %gradf(x) x0=x; %save current x as x0 y=x-alpha.*gradf; %x temporary x=y %update x phi=100*(x(2)-x(1)^2)^2 + (1-x(1))^2; %steep descent function alphaoptim=secant_subroutine_moyo(phi) %minimizing steep descent function using secant y=x0-alphaoptim.*gradf; %x+1 x=y; %update x n=n+1; %counter+1 xx(n+1)=x(1); yy(n+1)=x(2); end iteration=n,x,error=eps, alpha_optimal=alphaoptim %display end values clf nn = 30; %# of contours format long g xgrid=[-1:.2:2]; ygrid=[-1.4:.2:4]; [X,Y] = meshgrid(xgrid,ygrid); %Z = (2*X - 1).^2 + 4.*(4 - 1024.*X).^4; Z = 100*(Y-X.^2).^2 + (-X+1).^2; %Then, generate a contour plot of Z. [C,h] = contour(X,Y,Z,nn);hold on plot(xx,yy); clabel(C,h),xlabel('x_1','Fontsize',18),ylabel('x_2','Fontsize',18),title('ro senbrock w steepest descent vs Newton Method ','Fontsize',18); grid on

n=0; eps=1; x=[0;0];

%initialize iteration counter %initialize error %set starting value

%Computation loop using NEWTON METHOD while eps>1e-6&n<1000 g=[100*(x(2)-x(1)^2)^2 + (1-x(1))^2] eps=abs(g(1))

%g(x) %error

Jg=[2*x(1)-400*x(1)*(-x(1)^2+x(2))-2 ,-200*x(1)^2+200*x(2)]; %Jacobian y=x-Jg\g; %iterate x=y; %update x n=n+1; %counter+1 xxx(n+1)=x(1); yyy(n+1)=x(2); end n,x,eps

%clear,clf,clc clf nn = 30; %# of contours format long g xgrid=[-1:.2:2]; ygrid=[-1.4:.2:4]; [X,Y] = meshgrid(xgrid,ygrid); %Z = (2*X - 1).^2 + 4.*(4 - 1024.*X).^4; Z = 100*(Y-X.^2).^2 + (-X+1).^2; %Then, generate a contour plot of Z. [C,h] = contour(X,Y,Z,nn);hold on plot(xx,yy,xxx,yyy); clabel(C,h),xlabel('x_1','Fontsize',18),ylabel('x_2','Fontsize',18),title('ro senbrock w steepest descent vs Newton Method ','Fontsize',18); grid on

Asssignmen 7 gra'+'es)en +moyo!m


function [xopt,fopt,niter,gnorm,dx] = grad_descent(varargin) % grad_descent.m demonstrates how the gradient descent method can be used % to solve a simple unconstrained optimization problem. Taking large step % sizes can lead to algorithm instability. The variable alpha below % specifies the fixed step size. Increasing alpha above 0.32 results in % instability of the algorithm. An alternative approach would involve a % variable step size determined through line search. % % Updated by Larasmoyo Nugroho 1837087 from James Allison if nargin==0 % define starting point x0 = [3 3]'; elseif nargin==1 % if a single input argument is provided, it is a user-defined starting % point. x0 = varargin{1}; else error('Incorrect number of input arguments.') end % termination tolerance tol = 1e-6; % maximum number of allowed iterations maxiter = 1000; % minimum allowed perturbation dxmin = 1e-6; % step size ( 0.33 causes instability, 0.2 quite accurate) alpha = 0.1; % initialize gradient norm, optimization vector, iteration counter, perturbation gnorm = inf; x = x0; niter = 0; dx = inf; % define the objective function: % f = @(x1,x2) x1.^2 + x1.*x2 + 3*x2.^2; f = @(x1,x2) 100*(x2-x1^2)^2 + (1-x1)^2; % plot objective function contours for visualization: figure(1); clf; ezcontour(f,[-5 5 -5 5]); axis equal; hold on % redefine objective function syntax for use with optimization: f2 = @(x) f(x(1),x(2)); % gradient descent algorithm: while and(gnorm>=tol, and(niter <= maxiter, dx >= dxmin)) % calculate gradient: g = grad(x); gnorm = norm(g);

% take step: xnew = x - alpha*g; % check step if ~isfinite(xnew) display(['Number of iterations: ' num2str(niter)]) error('x is inf or NaN') end % plot current point plot([x(1) xnew(1)],[x(2) xnew(2)],'ko-') refresh drawnow % update termination metrics niter = niter + 1; dx = norm(xnew-x); x = xnew;

end xopt = x; fopt = f2(xopt); niter = niter - 1; % define the gradient of the objective function g = grad(x) g = [2*x(1) + x(2); x(1) + 6*x(2)]; % g=[2*x(1)-400*x(1)*(-x(1)^2+x(2))-2 ;-200*x(1)^2+200*x(2)];

Assignmen 8 $ena% y+a%ag+e.am+moyo!m


clear clf syms x1 x2 miu %primal problem % objective=(x1-6).^2+(x2-7).^2 % equality=x1+x2-7 % objective=(x1-2).^4+(x1-2*x2).^2 % equality=x1.^2-x2 objective=2*x1.^3+15*x2.^2-8*x1*x2+15 equality=x1.^2+x1*x2+1 inequality=4*x1-x2.^2-4 %will not be used because the x optimal is inside this constrain %composite / augmented / penalized objective function theta=objective+ miu*equality %drawing function yequality=solve(equality,x2) inlineequality=char(yequality) yinequality=solve(inequality,x2) inlineinequality1=char(yinequality(1)) inlineinequality2=char(yinequality(2))

%take y out of the equality eqn %convert sym to inline format %take y out of the equality eqn %convert sym to inline format %convert sym to inline format

%range of subset S x=[-3:0.25:3]; y=[-4:0.25:4]; [X,Y]=meshgrid(x,y); %objective function Z=subs(objective,{x1, x2}, {X, Y}); %substitute both variables using meshgrid data % X.^2+Y.^2; [C,h] = contour(X,Y,Z,30); hold on; %finding minimal point for objective fvalue=min(min(Z)) [row,col]=find(Z==min(min(Z))); xo=x(col) yo=y(row) plot(xo,yo,'r*'); text(xo,yo,['\leftarrowx_m_i_n{objective function} (',num2str(xo),',',num2str(yo),')'],'FontSize',12) %constraint function f=inline(inlineequality); fplot(f,[-3,3]); text(-1,2,['\leftarrowx1.^2+x1*x2+1=0'],'FontSize',12) g=inline(inlineinequality1); fplot(g,[-3,3]); text(2,-1.9,['4*x1-x2.^24>=0\rightarrow'],'FontSize',12,'HorizontalAlignment','right') g=inline(inlineinequality2); fplot(g,[-3,3]);

title('Penalty Function using KKT Lagrange Multiplier at Optimality',... 'FontWeight','bold') % break

%Jacobian dtheta1=diff(theta,x1) dtheta2=diff(theta,x2) %xmiu finding process from Jacobian delt1a=solve(dtheta1,x2) %find x2(x1,miu) delt2b=subs(dtheta2,x2,delt1a) %eliminate x2 with x1 x1miu=solve(delt2b,x1) %pop out x1miu x2miu=subs(delt1a,x1,x1miu) %pop out x2miu x2miu=simplify(x2miu) %simplify x2miu ff=objective gg=inequality hh=equality disp(sprintf(' mu x1miu x2miu f(xmiu) alpha=h^2 penalty lagrange_multiplier ')) disp(sprintf(' ------ ------------------------------- ------------ ----------- -------- --------------------')) %put miu into xmiu miu10=[-2:1:7]; for i=1:1:4 miusubstituter=5^miu10(i); x1miu1=subs(x1miu(2),miu,miusubstituter); x2miu1=subs(x2miu(2),miu,miusubstituter); plot(x1miu1(1), x2miu1(1),'r*') %and plot xmiu; text(x1miu1(1), x2miu1(1),['\leftarrowxmu,',num2str(i),' (',num2str(x1miu1(1)),',',num2str(x2miu1(1)),')'],'FontSize',8) % hhx1=subs(hh,x1,x1miu1(1)); hhx=subs(hhx1,x2,x2miu1(1)); alpha=hhx^2; fxa=subs(ff,x1,x1miu1(1)); fx=subs(fxa,x2,x2miu1(1)); penalty=fx+miusubstituter*alpha; lagrangemultiplier=2*miusubstituter*hhx; disp(sprintf('%1.5f (%3.12f,%3.12f) %2.10f %2.10f %2.10f %2.10f',miusubstituter,x1miu1(1),x2miu1(1),fx,alpha,penalty,lagrangemultiplie r)) end % break %Hessian ddtheta11=diff(dtheta1,x1); ddtheta12=diff(dtheta1,x2); ddtheta21=diff(dtheta2,x1);

ddtheta22=diff(dtheta2,x2); hesstheta=[ddtheta11 ddtheta12;ddtheta21 ddtheta22]; %finding the eigenvalue of the Hessian matrix lambda=eig(hesstheta); %put miu, xo, yo to eigenvalues x1miu_hess_miu=subs(lambda,miu,0.1); x1miu_hess_xo=subs(x1miu_hess_miu,x1,xo); x1miu_hess_yo=subs(x1miu_hess_xo,x2,yo);

-arrier+moyo1!m
clear clf syms x1 x2 miu %primal problem % objective=(x1-6).^2+(x2-7).^2 % equality=x1+x2-7 % objective=(x1-2).^4+(x1-2*x2).^2 % equality=x1.^2-x2 % objective=2*x1.^3+15*x2.^2-8*x1*x2+15 % equality=x1.^2+x1*x2+1 % inequality=4*x1-x2.^2-4 %will not be used because the x optimal is inside this constrain objective=1/3*(x1+1).^3+x2 inequality1=-x1+1 %it will be used, because x optimal is inside this constraint inequality2=-x2 %it will be used because the x optimal is inside this constrain inequality=inequality1+inequality2; %composite / augmented / penalized objective function theta=objective-miu/(inequality1+inequality2) %drawing function yequality=solve(inequality,x2) %take y out of the equality eqn inlineequality=char(yequality) %convert sym to inline format x=[-3:0.25:3]; y=[-4:0.25:4]; [X,Y]=meshgrid(x,y); %objective function Z=subs(objective,{x1, x2}, {X, Y}); %substitute both variables using meshgrid data % X.^2+Y.^2; [C,h] = contour(X,Y,Z,30); hold on; %% finding the optimum point inside the constraint fvalue=min(min(Z)) [row,col]=find(Z==min(min(Z))); xo=x(col) yo=y(row) plot(xo,yo,'r*'); text(xo,yo,['\leftarrowx_m_i_n{objective function} (',num2str(xo),',',num2str(yo),')'],'FontSize',16) %constraint function f=inline(inlineequality); fplot(f,[-3,3]); text(-1,2,['\leftarrow-x1+1< =0'],'FontSize',12) title('Barrier Function using KKT Lagrange Multiplier at Optimality',... 'FontWeight','bold') % break

%Jacobian

dtheta1=diff(theta,x1) dtheta2=diff(theta,x2) %xmiu finding process from Jacobian delt1a=solve(dtheta1,x2) %find x2(x1,miu) delt2b=subs(dtheta2,x2,delt1a) %eliminate x2 with x1 x1miu=solve(delt2b,x1) %pop out x1miu x2miu=subs(delt1a,x1,x1miu) %pop out x2miu x2miu=simplify(x2miu) %simplify x2miu ff=objective gg=inequality % hh=equality disp(sprintf(' miu x1miu x2miu f(xmiu) B(xmiu) barrier(theta) miu*B lagrange_multiplier ')) disp(sprintf(' ------ ----------------------- ------------ --------- ------------- ---------- ----------')) %put miu into xmiu miu10=[-2:1:7]; for i=1:1:7 miusubstituter=.1^miu10(i); x1miu1=subs(x1miu(2),miu,miusubstituter); x2miu1=subs(x2miu(2),miu,miusubstituter); plot(x1miu1(1), x2miu1(1),'ko') %and plot xmiu; text(x1miu1(1), x2miu1(1),['\leftarrowxmu,',num2str(i),' (',num2str(x1miu1(1)),',',num2str(x2miu1(1)),')'],'FontSize',6)

% ggx1=subs(gg,x1,x1miu1(1)); ggx=subs(ggx1,x2,x2miu1(1)); alpha=ggx^2; fxa=subs(ff,x1,x1miu1(1)); fx=subs(fxa,x2,x2miu1(1)); penalty=fx+miusubstituter*alpha; lagrangemultiplier=2*miusubstituter*ggx; disp(sprintf('%1.5f (%3.7f,%3.7f) %2.5f %2.10f %2.10f %2.10f %2.10f',miusubstituter,x1miu1(1),x2miu1(1),fx,alpha,penalty,miusubstituter*al pha,lagrangemultiplier)) end % break %Hessian ddtheta11=diff(dtheta1,x1); ddtheta12=diff(dtheta1,x2); ddtheta21=diff(dtheta2,x1); ddtheta22=diff(dtheta2,x2); hesstheta=[ddtheta11 ddtheta12;ddtheta21 ddtheta22]; %finding the eigenvalue of the Hessian matrix lambda=eig(hesstheta);

%put miu, xo, yo to eigenvalues x1miu_hess_miu=subs(lambda,miu,0.1); x1miu_hess_xo=subs(x1miu_hess_miu,x1,xo); x1miu_hess_yo=subs(x1miu_hess_xo,x2,yo);

Assignment 9 and 4 13. 13. CONJUGATE DIRECTION FLETCHER REEVES & QUASI NEWTON BFGS quasi_newton_conjugate_direction_moyo2.m function quasi_newton_conjugate_direction_moyo() clf nn = 30; %# of contours format long g xgrid=[-2:.2:2]; ygrid=[-2:.2:4]; [X,Y] = meshgrid(xgrid,ygrid); %Z = (2*X - 1).^2 + 4.*(4 - 1024.*X).^4; Z = 100*(Y-X.^2).^2 + (-X+1).^2; %Then, generate a contour plot of Z. [C,h] = contour(X,Y,Z,nn);hold on clabel(C,h),xlabel('x_1','Fontsize',10),ylabel('x_2','Fontsize',10),... title('Conjugate Direction Method-FletcherReeves & QuasiNewton BFGS','Fontsize',10); grid on
xstart=[3 2]' k=0; H=eye(2); x=xstart g = gradf(x); d = -H*g; while norm(g)>1e-6 k funct(x) xzero=x; alpha=linesearch_secant('gradf',x,d); x = x + alpha*d; g1 = gradf(x); delx = alpha*d; delg = g1-g; % switch am % case 7 % rank-1 % z = delx - H*delg; % H1 = H + (z*z')/(delg'*z); % case 8 % DFP % H1 = H + (delx*delx')/(delx'*delg) (H*delg)*(H*delg)'/(delg'*H*delg); % case 9 % BFGS H1 = H + (1+(delg'*H*delg)/(delg'*delx))*(delx*delx')/(delx'*delg) ... (H*delg*delx'+(H*delg*delx')')/(delg'*delx); % end k = k+1; if rem(k,6)==0 H1 = eye(2); end H = H1; g = g1; d = -H*g; x % xd = get(l,'xdata'); yd=get(l,'ydata');

% set(l,'xdata',[xd(:); x(1)],'ydata',[yd(:); x(2)]) plot([xzero(1) x(1)],[xzero(2) x(2)],'go-','linewidth',1.5) drawnow end %%Conjugate Direction Method-FletcherReeves n=0; %initialize iteration counter x=xstart; %set starting position value g=gradf(x); direc=-g; eps=norm(g) while eps>1e-6 alpha=linesearch_secant('gradf',x,direc); xzero=x; x = x + alpha*direc; g1 = gradf(x); % fletcher-reeves beta = (g1'*g1)/(g'*g); n = n+1 if rem(n,6)==0 beta = 0; end g = g1; direc = -g + beta*direc; xdirec=xzero; plot([xzero(1) x(1)],[xzero(2) x(2)],'bo-','linewidth',1.5) drawnow eps=norm(g); end xopt=xdirec fopt=funct(xopt) plot(xopt(1),xopt(2),'ro','linewidth',2.5) function f=funct(x) % rosenblatt's "banana" function f = 100*(x(2,:)-x(1,:).^2).^2+(1-x(1,:)).^2; function g=gradf(x) % Gradient of rosenblatt's "banana" function g = [-400*(x(2,:)-x(1,:).^2).*x(1,:)-2*(1-x(1,:)); 200*(x(2,:)-x(1,:).^2) ]; function hf=hessf(x) % Hessian of rosenblatt's "banana" function hf = [-400*(x(2,:)-3*x(1,:).^2)+2 -400*x(1,:); -400*x(1,:) 200]; %-----------------------------------------------------------function alpha=linesearch_secant(grad,x,d) %Line search using secant method %Note: I'm not checking for alpha > 0. epsilon=10^(-5); %line search tolerance max = 200; %maximum number of iterations

alpha_curr=0; alpha=10^(-5); dphi_zero=feval(grad,x)'*d; dphi_curr=dphi_zero; i=0; while abs(dphi_curr)>epsilon*abs(dphi_zero), alpha_old=alpha_curr; alpha_curr=alpha; dphi_old=dphi_curr; dphi_curr=feval(grad,x+alpha_curr*d)'*d; alpha=(dphi_curr*alpha_old-dphi_old*alpha_curr)/(dphi_curr-dphi_old); i=i+1; if (i >= max) & (abs(dphi_curr)>epsilon*abs(dphi_zero)), disp('Line search terminating with number of iterations:'); disp(i); break; end end %while

The codes implementing DFP and Pola !ibiere algorithms are generall" the same# e$cept in following lines%
% DFP H1 = H + (delx*delx')/(delx'*delg) -(H*delg)*(H*delg)' /(delg'*H*delg);

% polak-ribiere beta = g1'*(g1-g)/(g'*g);

The codes implementing !an -1and Powell algorithms are generall" the same# e$cept in following lines%
% rank-1 z = delx - H*delg; H1 = H + (z*z')/(delg'*z); % powell beta = max(0,g1'*(g1-g)/(g'*g));

You might also like