logo for matrixlab-examples.com
leftimage for matrixlab-examples.com

Gradient - calculate it with Matlab





We are going to include the concepts in our Derivative function created before, to develop a Matlab function to calculate the gradient of a multidimensional scalar function. The function is going to have the following functionality:


% Usage: g = Grad(fun, x0)
%     fun: name of the multidimensional scalar function
%          (string). This 
function takes a vector argument of
%          length n and returns a 
scalar.
%     x0: point of interest (vector of length n)
%     g: column vector containing the gradient of fun at x0. The
%        size(g) = size(x)
 
function g = Grad(fun, x0)
% |delta(i)| is relative to |x0(i)|
delta = x0 / 1000;             
for i = 1 : length(x0)
    if x0(i) == 0
          % avoids delta(i) = 0 (**arbitrary value**)
        delta(i) = 1e-12;      
    end
     % recovers original x0
    u = x0;                    
    u(i) = x0(i) + delta(i);
     % fun(x0(i-1), x0(i)+delta(i), x0(i+1), ...)
    f1 = feval ( fun, u );     
    u(i) = x0(i) - delta(i);
     % fun(x0(i-1), x0(i)-delta(i), x0(i+1), ...)
    f2 = feval ( fun, u );     
   
     % partial derivatives in column vector
    g(i,1) = (f1 - f2) / (2 * delta(i)); 
end

We can try this algorithm, creating a function bowl (which includes two variables) in an separate m-file, as follows:

function y = bowl(x)
y = (x(1)-6)^2 + (x(2)-4.5)^4 / 25;

Then, we can test it from the command window:

x = [0 0]
f = 'bowl'
Grad(f, x)
Expected: [-12 -14.58]'    Obtained: [-12.0011 -14.5803]'

x = [1 1]
Grad(f, x)
Expected: [-10 -6.86]'    Obtained: [-10.0000 -6.8600]'

x = [6 4.5]
Grad(f, x)
Expected: [0 0]'        Obtained: [0 0]'

x = [2 1.5]
Grad(f, x)
Expected: [-8 -4.32]'    Obtained: [-8.0000 -4.3200]'

Now, another test with a different multivariable function:

function y = semirosen(x)
y = 100 * ( x(2) - x(1)^2 ) + ( 1 - x(1) )^2 ;


x = [0 0]
f = 'semirosen'
Grad(f, x)
Expected: [-2 100]'      Obtained: [-2.0001 100.0000]'

x = [1 1]
Grad(f, x)
Expected: [-200 100]'    Obtained: [-200.0000 100.0000]'

x = [9 15]
Grad(f, x)
Expected: [-1784 100]'   Obtained: 1.0e+003 *[-1.7840    0.1000]'


 From 'Gradient' to home

 From 'Gradient' to 'Matlab Cookbook'

 Calculus

Top

Derivative

Curve Fitting

Math Optimization




footer for gradient page