Contents
% Author: Darren Rowland % Version: 1.0 % Date: 8 November 2010
Points with equal spacing
When the x-values are equally spaced, the derivatives at the interior points as calculated by DIFFXY are approximated in the same way as the native Matlab function GRADIENT, i.e. using the central difference method. The endpoints are different because DIFFXY uses a higher-order approximation.
x = linspace(-1,2,20); y = exp(x); dy = diffxy(x,y); dy2 = diffxy(x,dy); % Or, could use >> dy2 = diffxy(x,y,[],2); figure('Color','white'); plot(x,(y-dy)./y,'b*',x,(y-dy2)./y,'b^') Dy = gradient(y)./gradient(x); Dy2 = gradient(Dy)./gradient(x); hold on plot(x,(y-Dy)./y,'r*',x,(y-Dy2)./y,'r^') title('Relative error in derivative approximation') legend('diffxy: dy/dx','diffxy: d^2y/dx^2',... 'gradient: dy/dx','gradient: d^2y/dx^2') hold off

Points with unequal spacing
DIFFXY was developed specifically to cope with unevenly spaced data. Consider the result when GRADIENT attempts to approximate the derivative of y=exp(x) when the x-values are randomly distributed.
x = 3*sort(rand(20,1))-1; y = exp(x); plot(x,y,x,gradient(y)./gradient(x),'r') title('Approximation of d(exp(x))/dx by GRADIENT')

Compare this to the approximation obtained by DIFFXY
plot(x,y,x,diffxy(x,y))
title('Approximation of d(exp(x))/dx by DIFFXY')

The distinction is even more pronounced as higher-order derivatives are approximated.
dy2 = diffxy(x,y,[],2); Dy = gradient(y)./gradient(x); Dy2 = gradient(Dy)./gradient(x); plot(x,y,x,dy2,x,Dy2) title('Approximation of d^2(exp(x))/dx^2 for unequally spaced x') legend('analytical','diffxy: d^2y/dx^2','gradient: d^2y/dx^2',... 'Location','NorthWest')

N-dimensional data
As well as operating on univariate data as above, DIFFXY can be used in general multidimensional space, obtaining the derivative in any single dimension one-at-a-time. This is different to GRADIENT, which returns the approximate derivatives in each coordinate direction simultaneously.
x = sort(rand(10,1)); y = sort(rand(15,1)); [X,Y] = ndgrid(x,y); f = sqrt(X).*Y.*cos(2*Y); % Exact partial derivatives f_x = f./(2*X); f_y = sqrt(X).*(cos(2*Y)-2*Y.*sin(2*Y)); dfdx = diffxy(x,f,1); dfdy = diffxy(y,f,2); mesh(X,Y,f_x) hold on plot3(X,Y,dfdx,'b*') hold off view(gca,[-68.5 40]);

mesh(X,Y,f_y) hold on plot3(X,Y,dfdy,'b*') hold off view(gca,[-68.5 40]);
