%steepest ascent Method for Multiple Variable Functions
%faridani@gmail.com
%11/16/2008
%University of California, Berkeley
clc;
close all;
clear all;
format long;
disp('Steepest Accent Method');
disp('=============');
%Starting points
x01=-1;
x02=0;
%Function F in Symbolic Format
a='(3*x1+x2+6*x1*x2-2*(x1^2)+2*(x2^2))';
%Insert the desired magnitude of final direction vector (0.0001 is fine)
eserror=0.0001;
%Leave the rest unchanged
%=================================
syms x1 x2
% Hessian Of F
disp( sprintf('Function = %s', a));
A=[diff(diff(a,x1),x1),diff(diff(a,x1),x2);...
diff(diff(a,x2),x1),diff(diff(a,x2),x2)];
%First Order Derivative of F
B=[diff(a,x1);diff(a,x2)];
disp 'Hessian......';
pretty(simplify(A))
disp 'Gradient......';
pretty(simplify(B))
disp('Eigen Values');
[v,d]=eig(A);
disp(d);
num_of_iterations=1;
syms alpha
f=(subs(subs(a,x1,x01),x2,x02));
disp(sprintf('f(x0)=%f',f));
while (num_of_iterations<7)
disp('_________________________________________');
disp(sprintf('Iteration = %d', num_of_iterations));
temp=(subs(subs(B,x1,x01),x2,x02));
disp(sprintf('Gradient of X%d', num_of_iterations-1));
disp(temp);
temp4=([x01;x02]);
disp(sprintf('X%d =', num_of_iterations-1));
disp(temp4);
temp = temp4+alpha.*(temp);
disp(sprintf('X%d - alpha. gradient(X%d) =', num_of_iterations-1, num_of_iterations-1));
disp(temp);
f_alpha= subs(subs(a,x1, temp(1,1)), x2, temp(2,1));
disp(sprintf('f(X%d - alpha. gradient(X%d)) =', num_of_iterations-1, num_of_iterations-1));
disp(f_alpha);
diff_f_alpha = diff(f_alpha,alpha);
disp(sprintf('diff(f(X%d - alpha. gradient(X%d)))/diff alpha =', num_of_iterations-1, num_of_iterations-1));
disp(diff_f_alpha);
alphaval=solve(diff_f_alpha, 'alpha')
alphaval2=eval(alphaval)
if alphaval2<0
disp 'Diverges';
break;
end
newxkplus1 = [x01;x02]+alphaval2.*(subs(subs(B,x1,x01),x2,x02));
x01 = newxkplus1(1,1);
x02 = newxkplus1(2,1);
disp(sprintf('x%d =',num_of_iterations));
disp(newxkplus1)
num_of_iterations=num_of_iterations+1;
f=(subs(subs(a,x1,x01),x2,x02));
disp(sprintf('f(x%d)=%f',num_of_iterations,f));
end