% m23b.m - m23_fminunc again, with two changes: a harder function % (Rosenbrock), and a gradient supplied function m23b() x = [-3:.1:3]; y = x; [xx,yy] = meshgrid(x,y); ff = (1-xx).^2 + 100*(yy-xx.^2).^2; % Rosenbrock function levels = 0:20:500; hold off, contour(xx,yy,ff,levels) % contour plot colorbar, grid on, hold on LW = 'linewidth'; MS = 'markersize'; plot(1,1,'.k',MS,30) % the solution x = input('initial x? '); y = input('initial y? '); xold = x; yold = y; opts = optimset('gradobj','on'); X = fminunc(@f,[x;y],opts) % minimisation function [f,g] = f(X) % compute function and gradient x = X(1), y = X(2) f = (1-x)^2 + 100*(y-x^2)^2; g = [-2*(1-x)-400*x*(y-x^2); 200*(y-x^2)]; plot([xold x],[yold y],'-r',LW,1.2) % plot line to current point plot(x,y,'.r',MS,15) % plot current point disp(' '), pause xold = x; yold = y; end end