% File: dss002.m
%
function [ux]=dss002(xl,xu,n,u)
%
% Function dss002 computes the first derivative, u , of a
% x
% variable u over the spatial domain xl le x le xu.
%
% Argument list
%
% xl Lower boundary value of x (input)
%
% xu Upper boundary value of x (input)
%
% n Number of grid points in the x domain including the
% boundary points (input)
%
% u One-dimensional array containing the values of u at
% the n grid point points for which the derivative is
% to be computed (input)
%
% ux One-dimensional array containing the numerical
% values of the derivatives of u at the n grid points
% (output)
%
% Function dss002 computes the first derivative, u , of a
% x
% variable u over the spatial domain xl le x le xu from the
% classical three-point, second-order finite difference approxi-
% tions
%
% 2
% u1 = (1/2dx)(-3u1 + 4u2 - u3) + O(dx ) (left boundary, (1)
% x x = xl)
%
% 2
% ui = (1/2dx)(ui+1 - ui-1) + O(dx ) (interior point, (2)
% x x ne xl, xu)
%
% 2
% un = (1/2dx)(3un - 4un-1 + un-2) + O(dx ) (right boundary, (3)
% x x = xu)
%
% Equations (1) to (3) apply over a grid in x with corresponding
% values of the function u(x) represented as
%
% u1 u2 u3 ui un-2 un-1 un
%
% x=xl x=xl+dx x=xl+2dx ... X=xi ... X=xu-2dx x=xu-dx x=xu
%
% The origin of equations (1) to (3) is outlined below.
%
% Consider the following polynomial in x of arbitrary order
%
% 2 3
% u(x) = a0 + a1(x - x0) + a2(x - x0) + a3(x - x0) + .... (4)
%
% We seek the values of the coefficients a0, a1, a2, ... for a
% particular function u(x). If x = x0 is substituted in equation
% (4), we have immediately a0 = u(x0). Next, if equation (4) is
% differentiated with respect to x,
%
% 2
% du(x)/dx = u (x) = a1 + 2a2(x - x0) + 3a3(x - x0) + ... (5)
% x
%
% Again, with x = x0, a1 = du(x0)/dx = u (x0). Differentiation
% x
% of equation (5) in turn gives
%
% d2u(x)/dx2 = u (x) = 2a2 + 6a3(x - x0) + ...
% 2x
%
% And for x = x0, a2 = u (x0)/2f (2f = 1*2, i.e., 2 factorial).
% 2x
%
% We can continue this process of differentiation followed by the
% substitution x = x0 to obtain the successive coefficients in
% equation (4), a3, a4, ... Finally, substitution of these co-
% efficients in equation (4) gives
%
% 2
% u(x) = u(x0) + u (x0)(x - x0) + u (x0)(x - x0) +
% x 1f 2x 2f
% (6)
% 3 4
% U (x0)(x - x0) + u (x0)(x - x0) + ...
% 3x 3f 4x 4f
%
% The correspondence between equation (6) and the well-known
% Taylor series should be clear. Thus the expansion of a
% function, u(x), around a neighboring point x0 in terms of u(x0)
% and the derivatives of u(x) at x = x0 is equivalent to approxi-
% mating u(x) near x0 by a polynomial.
%
% Equation (6) is the starting point for the derivation of the
% classical finite difference approximations of derivatives such
% as the three-point formulas of equations (1), (2) and (3). We
% will now consider the derivation of these three-point formulas
% in a standard format that can then be extended to higher
% multi-point formulas in other subroutines, e.g., five-point
% formulas in routine dss004.
%
% Three-point formulas
%
% (1) Left end, point i = 1
%
% If equation (6) is written around the points x = xl for x = xl +
% dx and x = xl + 2dx, for which the corresponding values of u(x)
% are u1, u2 and u3 (u1 and u2 are separated with respect to x by
% distance dx as are u2 and u3, i.e., we assume a uniform grid
% spacing, dx, for independent variable x)
%
% 2 3
% u2 = u1 + u1 ( dx) + u1 ( dx) + u1 ( dx) + ... (7)
% x 1f 2x 2f 3x 3f
%
% 2 3
% u3 = u1 + u1 (2dx) + u1 (2dx) + u1 (2dx) + ... (8)
% x 1f 2x 2f 3x 3f
%
% We can now take a linear combination of equations (7) and (8)
% by first multiplying equation (7) by a constant, a, and equa-
% tion (8) by constant b
%
% 2 3
% a(u2 = u1 + u1 ( dx) + u1 ( dx) + u1 ( dx) + ...) (9)
% x 1f 2x 2f 3x 3f
%
% 2 3
% b(u3 = u1 + u1 (2dx) + u1 (2dx) + u1 (2dx) + ...) (10)
% x 1f 2x 2f 3x 3f
%
% Constants a and b are then selected so that the coefficients of
% the u1 terms sum to one (since we are interested in obtaining
% x
% a finite difference approximation for this first derivative).
% Also, we select a and b so that the coefficients of the u1
% 2x
% terms sum to zero in order to drop out the contribution of this
% second derivative (the basic idea is to drop out as many of the
% derivatives as possible in the Taylor series beyond the deri-
% vative of interest, in this case u1 , in order to produce a
% x
% finite difference approximation for the derivative of maximum
% accuracy). In this case we have only two constants, a and b,
% to select so we can drop out only the second derivative, u1 ,
% 2x
% in the Taylor series (in addition to retaining the first deri-
% vative). This procedure leads to two linear algebraic equa-
% tions in the two constants
%
% a + 2b = 1
%
% a + 4b = 0
%
% Solution of these equations for a and b gives
%
% a = 2, b = -1/2
%
% Solution of equations (9) and (10) for u1 with these values of
% a and b gives equation (1) x
%
% 2
% u1 = (1/2dx)(-3u1 + 4u2 - u3) + O(dx ) (1)
% x
% 2
% The term O(dx ) indicates a principal error term due to trunca-
% 2
% tion of the Taylor series which is of order dx . This term in
% 2
% fact equals u1 dx /3f, which is easily obtained in deriving
% 3x
% equation (1).
%
% This same basic procedure can now be applied to the derivation
% of equations (2) and (3).
%
% (2) Interior point i
%
% 2 3
% a(ui-1 = ui + ui (-dx) + ui (-dx) + ui (-dx) + ...)
% x 1f 2x 2f 3x 3f
%
% 2 3
% b(ui+1 = ui + ui ( dx) + ui ( dx) + ui ( dx) + ...)
% x 1f 2x 2f 3x 3f
%
% -a + b = 1
%
% a + b = 0
%
% a = 1/2, b = -1/2
% 2
% ui = (1/2dx)(ui+1 - ui-1) + O(dx ) (2)
% x
%
% (3) Right end, point i = n
%
% 2 3
% a(un-2 = un + un (-2dx) + un (-2dx) + un (-2dx) + ...)
% X 1f 2x 2f 3x 3f
%
% 2 3
% b(un-1 = un + un ( -dx) + un ( -dx) + un ( -dx) + ...)
% x 1f 2x 2f 3x 3f
%
% -2a - b = 1
%
% 4a + b = 0
%
% a = -2, b = 1/2
% 2
% un = (1/2dx)(3un - 4un-1 + un-2) + O(dx ) (3)
% x
%
% The weighting coefficients for equations (1), (2) and (3) can
% be summarized as
%
% -3 4 -1
%
% 1/2 -1 0 1
%
% 1 -4 3
%
% Which are the coefficients reported by Bickley for n = 2, m =
% 1, p = 0, 1, 2 (Bickley, W. G., Formulae for Numerical Differ-
% entiation, Math. Gaz., vol. 25, 1941).
%
% Equations (1), (2) and (3) can now be programmed to generate
% the derivative u (x) of u(x).
% x
%
% Compute the spatial increment
dx=(xu-xl)/(n-1);
r2fdx=1./(2.*dx);
nm1=n-1;
%
% Equation (1) (note - the rhs of the finite difference approxi-
% tions, equations (1), (2) and (3) have been formatted so that
% the numerical weighting coefficients can be more easily associ-
% ated with the Bickley matrix listed above)
ux(1)=r2fdx*...
( -3. *u( 1) +4. *u( 2) -1. *u( 3));
%
% Equation (2)
for i=2:nm1
ux(i)=r2fdx*...
( -1. *u(i-1) +0. *u( i) +1. *u(i+1));
end
%
% Equation (3)
ux(n)=r2fdx*...
( 1. *u(n-2) -4. *u(n-1) +3. *u( n));