# How to use the Finite Difference Method to get the gradient?

79 views (last 30 days)
Aaronne on 20 May 2011
Hi there,
I need to calculate the gradient (partial derivative) of a function. I found that Matlab has got a '.p' file/function called 'finitedifferences' to do this.
However, I am not sure how to use it. For example, I found that Matlab do it like,
but what is funfcn{3} here?
Suppose I have a simple function like,
function F = myfun(x)
F = sin(x) + 3;
in which, x is a vector contains 6 elements. Then how to use the finitedifferences to get the gradient w.r.t each of this 6 elements? Thanks very much!
wbr, Aaron

Andrew Newell on 20 May 2011
Here is an example of a function that uses gradest correctly:
function [F, g] = myfun(x)
fun = @(y) 2*sum(sin(y)) + 3;
F = fun(x);
The key differences are:
1. the name of the function fun is different from myfun
2. fun and its gradient are both evaluated at x.
Also, I have made it more efficient in a couple of other ways. Now you can test this directly using:
x = rand(4,1);
ganalytic = 2*cos(x)'; % This is the analytic gradient
[F,g] = myfun(x);
max(abs(g-ganalytic))
The last line tells you the maximum difference between the analytic and numerical gradients.

Arnaud Miege on 20 May 2011
Have you looked at the gradient function?
Arnaud

Andrew Newell on 20 May 2011
EDIT: Note that this package has functions for calculating gradient and Hessian.

Aaronne on 20 May 2011
Hi Andrew,
Thanks very much. I believe it is a very useful tool!
I wrote a test function as:
% myfun.m
function F = myfun(x)
F = 2*sin(x) + 3;
And the test:
% myfunTest.m
clear all;
xi = [4 2 3 4];
gradvec = derivest(@(x) myfun(x), xi(1), 'd', 1)
Then I can get the derivative at xi(1). That works perfectly!
However, another problem is I will use it in my optimization case. For example, my 'myfun.m' will return both function value and gradient at the same time, something like:
% myfun.m
function [g, F] = myfun(x)
F = 2*sin(x) + 3;
% Get the gradient here...(How to?)
g = [g_1, g_2, g_3, g_4]
and my test is:
% myfunTest.m
clear all;
xi = [4 2 3 4]; % Initialization
options = optimset('LargeScale', 'off', 'Display', 'iter-detailed', 'TolX', 0.0001, 'TolFun', 0.0000001, 'GradObj', 'on');
xMin = fminunc(@(x) myfun(x), xi, options);
Then may I ask how to get the g_1, g_2, g_3, g_4 using derivest please? Use the inline mode? Please give me some tips. Thanks a lot and have a nice day.
wbr, Aaron

Aaronne on 20 May 2011
Sorry Arnaud,
I didn't see you post before. Thanks for your reply. Please read my last post. The same question is if I use 'gradient' then how to get the g_1, g_2, g_3, g_4 in the function call?
Thanks very much.
wbr, Aaron
Arnaud Miege on 23 May 2011
I think that's because your function myfun outputs a scalar and gradient needs a vector of values to work out what the gradient is at each point:
>> [F, g] = myfun([1 2 3 4])
F =
5.2702
g =
0

Aaronne on 20 May 2011
Sorry, the F should be
function F = myfun(x)
F = 2*sin(x(1)) + 2*sin(x(2)) + 2*sin(x(3)) + 2*sin(x(4)) + 3;
Andrew Newell on 20 May 2011
Not a problem! You already format your code nicely, which really helps.

Aaronne on 20 May 2011
Now I have problems:
My function is:
% myfun.m
function [F, g] = myfun(x)
F = 2*sin(x(1)) + 2*sin(x(2)) + 2*sin(x(3)) + 2*sin(x(4)) + 3;
g1 = derivest(@(x) myfun(x), x(1), 'd', 1);
g2 = derivest(@(x) myfun(x), x(2), 'd', 1);
g3 = derivest(@(x) myfun(x), x(3), 'd', 1);
g4 = derivest(@(x) myfun(x), x(4), 'd', 1);
g = [g_1, g_2, g_3, g_4];
My test is:
% myfunTest.m
clc; clf; clear all; close all;
xi = [4 2 3 4];
% gradvec = derivest(@(x) myfun(x), xi(1), 'd', 1)
options = optimset('LargeScale', 'off', 'Display', 'iter-detailed', ...
'TolX', 0.0001, 'TolFun', 0.0000001, 'GradObj', 'on');
xMin = fminunc(@(x) myfun(x), xi, options);
Then by running the optimization I got the errors:
??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit. Be aware that exceeding your available stack space can
Error in ==> iscellstr
Caused by:
Failure in initial user-supplied objective function evaluation. FMINUNC
cannot continue.
I know it is a weird way to do this way. But thanks a lot for any help!
wbr, Aaron
##### 2 CommentsShowHide 1 older comment
Aaronne on 20 May 2011
Hi Andrew,
I still haven't found a clue how to do it. I have a simple test function:
1.
% myfunTest.m
clc; clf; clear all; close all;
xi = [4 2 3 4];
% gradvec = derivest(@(x) myfun(x), xi(1), 'd', 1)
options = optimset('LargeScale', 'off', 'Display', 'iter-detailed', ...
'TolX', 0.0001, 'TolFun', 0.0000001, 'GradObj', 'on');
xMin = fminunc(@(x) myfun(x), xi, options);
2.
% myfun.m
function [F, g] = myfun(x)
F = 2*sin(x(1)) + 2*sin(x(2)) + 2*sin(x(3)) + 2*sin(x(4)) + 3;