%% CHEBFUN GUIDE 7: LINEAR DIFFERENTIAL OPERATORS AND EQUATIONS
% Tobin A. Driscoll, November 2009, revised February 2011
%% 7.1 Introduction
% Chebfun has powerful capabilities for solving ordinary differential
% equations as well as partial differential equations involving one space
% and one time variable. The present chapter is devoted to chebops, the
% fundamental Chebfun tools for solving differential (or integral)
% equations. In particular we focus here on the linear case. We shall see
% that one can solve a linear two-point boundary value problem to high
% accuracy by a single "backslash" command. Nonlinear extensions are
% described in Section 7.9 and in Chapter 10, and PDEs in Chapter 11.
%%
% Let's set the clock running, so we can measure at the end how long it
% took to produce this chapter.
tic
%% 7.2 About linear chebops
% A chebop represents a differential or integral operator that acts on
% chebfuns. This chapter focusses on the linear case, though from a user's
% point of view linear and nonlinear problems are quite similar. One thing
% that makes linear operators special is that EIGS and EXPM can be applied
% to them, as we shall describe in Sections 7.5 and 7.6.
%%
% Like chebfuns, chebops are built on the premise of appoximation by
% piecewise Chebyshev polynomial interpolants; in the context of
% differential equations such techniques are called spectral collocation
% methods. As with chebfuns, the discretizations are chosen automatically
% to achieve the maximum possible accuracy available from double precision
% arithmetic.
%%
% The linear part of the chebop package was conceived at Oxford by
% Bornemann, Driscoll, and Trefethen [Driscoll, Bornemann & Trefethen
% 2008], and the implementation is due to Driscoll, Hale, and Birkisson
% [Birkisson & Driscoll 2011, Driscoll & Hale 2011] . Much of the
% functionality of linear chebops is actually implemented in a class called
% linop, but users generally do not need to deal with linops directly.
%% 7.3 Chebop syntax
% A chebop has a domain, an operator, and sometimes boundary conditions.
% For example, here is the chebop corresponding to the second-derivative
% operator on [-1,1]:
L = chebop(-1,1);
L.op = @(x,u) diff(u,2);
%%
% (For scalar operators like this, one may also dispense with the x and
% just write L.op = @(u) diff(u,2).) This operator can now be applied to
% chebfuns defined on [-1,1]. For example, taking two derivatives of
% sin(3x) multiplies its amplitude by 9:
u = chebfun('sin(3*x)');
norm(L(u),inf)
%%
% Both the notations L*u and L(u) are allowed, with the same meaning.
min(L*u)
%%
% Mathematicians
% generally prefer L*u if L is linear and L(u) if it is nonlinear.
%%
% A chebop can also have left and/or right boundary conditions. For a
% Dirichlet boundary condition it's enough to specify a number:
L.lbc = 0;
L.rbc = 1;
%%
% More complicated boundary conditions can be specified with anonymous
% functions, which are then forced to take zero values at the boundary. For
% example, the following sequence imposes the conditions u=0 at the left
% boundary and u'=1 at the right:
L.lbc = @(u) u;
L.rbc = @(u) diff(u)-1;
%%
% We can see a summary of L by typing the name without a semicolon:
L
%%
% Boundary conditions are needed for solving differential equations, but
% they have no effect when a chebop is simply applied to a chebfun. Thus,
% despite the boundary conditions just specified, L*u gives the same answer
% as before:
norm(L*u,inf)
%%
% Here is an example of an integral operator, the operator that maps u
% defined on [0,1] to its indefinite integral:
L = chebop(0,1);
L.op = @(x,u) cumsum(u);
%%
% For example, the indefinite integral of x is x^2/2:
x = chebfun('x',[0,1]);
hold off, plot(L*x)
%%
% Chebops can be specified in various ways, including all in a
% single line. For example we could write
L = chebop(@(x,u) diff(u)+diff(u,2),[-1,1])
%%
% Or we could include boundary conditions:
L = chebop(@(x,u) diff(u)+diff(u,2),[-1,1],@(u) 0,@(u) diff(u))
%%
% Here are the fields of a chebop:
disp(L)
%%
% For operators applying to more than one variable (needed for solving
% systems of differential equations), see Section 7.8.
%% 7.4 Solving differential and integral equations
% In Matlab, if A is a square matrix and b is a vector, then the command
% x=A\b solves the linear system of equations A*x=b. Similarly in Chebfun,
% if L is a differential operator and f is a Chebfun, then u=L\f solves the
% differential equation L(u)=f. More generally L might be an integral or
% integro-differential operator. (Of course, just as you can solve Ax=b
% only if A is nonsingular, you can solve L(u)=f only if the problem is
% well-posed.)
%%
% For example, suppose we want to solve the differential equation u"+x^3*u
% = 1 on the interval [-3,3] with Dirichlet boundary conditions. Here is a
% Chebfun solution:
L = chebop(-3,3);
L.op = @(x,u) diff(u,2) + x.^3.*u;
L.lbc = 0; L.rbc = 0;
u = L\1; plot(u)
%%
% We confirm that the computed u satisfies the differential equation to
% high accuracy:
norm(L(u)-1)
%%
% Let's change the right-hand boundary condition to u'=0 and see how this
% changes the solution:
L.rbc = @(u) diff(u);
u = L\1;
hold on, plot(u,'r')
%%
% An equivalent to backslash is the SOLVEBVP command.
v = solvebvp(L,1);
norm(u-v)
%%
% Periodic boundary conditions can be imposed with the special boundary
% condition string L.bc='periodic', which will find a periodic solution,
% provided that the right-side function is also periodic.
L.bc = 'periodic';
u = L\1;
hold off, plot(u)
%%
% A command like L.bc=100 imposes the corresponding Dirichlet condition at
% both ends of the domain:
L.bc = 100;
plot(L\1)
%%
% Boundary conditions can also be specified in a single line, like this
% specification of an operator on [-1,1] mapping u to u"+10000u:
L = chebop(@(x,u) diff(u,2)+10000*u,[-1,1],0,@(u) diff(u))
%%
% Thus it is possible to set up and solve a differential equation
% and plot the solution with a single line of Chebfun:
plot(chebop(@(x,u) diff(u,2)+50*(1.2+sin(x)).*u,[-20,20],0,0)\1)
%%
% When Chebfun solves differential or integral equations, the coefficients
% may be piecewise smooth rather than globally smooth. (This is new in
% Chebfun Version 4.) For example, here is a problem involving a
% coefficient that jumps from +1 for negative x to -1 for positive x:
L = chebop(-60,60);
L.op = @(x,u) diff(u,2) - sign(x).*u;
L.lbc = 1; L.rbc = 0;
u = L\0;
plot(u)
%% 7.5 Eigenvalue problems -- EIGS
% In Matlab, EIG finds all the eigenvalues of a matrix whereas EIGS finds
% some of them. A differential or integral operator normally has
% infinitely many eigenvalues, so one could not expect an overload of EIG
% for chebops. EIGS, however, has been overloaded. Just like Matlab EIGS,
% Chebfun EIGS finds 6 eigenvalues by default, together with eigenfunctions
% if requested. (For full details see [Driscoll, Bornemann & Trefethen
% 2008].) Here's an example involving sine waves.
L = chebop(@(x,u) diff(u,2),[0,pi]);
L.bc = 0;
[V,D] = eigs(L);
diag(D)
clf, plot(V(:,1:4))
%%
% By default, eigs tries to find the six eigenvalues whose eigenmodes are
% "most readily converged to", which approximately means the smoothest
% ones. You can change the number sought and tell eigs where to look for
% them. Note, however, that you can easily confuse eigs if you ask for
% something unreasonable, like the largest eigenvalues of a differential
% operator.
%%
% Here we compute 10 eigenvalues of the Mathieu equation and plot
% the 9th and 10th corresponding eigenfunctions, known as an elliptic
% cosine and sine. Note the imposition of periodic boundary conditions.
q = 10;
A = chebop(-pi,pi);
A.op = @(x,u) diff(u,2) - 2*q*cos(2*x).*u;
A.bc = 'periodic';
[V,D] = eigs(A,16,'LR'); % eigenvalues with largest real part
subplot(1,2,1), plot(V(:,9)), title('elliptic cosine')
subplot(1,2,2), plot(V(:,10)), title('elliptic sine')
%%
% Eigs can also solve generalized eigenproblems, that is, problems of the
% form A*u = lambda*B*u. For these one must specify two linear chebops A
% and B, with the boundary conditions all attached to A. Here is an
% example of eigenvalues of the Orr-Sommerfeld equation of hydrodynamic
% linear stability theory at a Reynolds number close to the critical value
% for eigenvalue instability [Schmid & Henningson 2001]. This is a
% fourth-order generalized eigenvalue problem, requiring two conditions at
% each boundary.
Re = 5772;
B = chebop(-1,1);
B.op = @(x,u) diff(u,2) - u;
A = chebop(-1,1);
A.op = @(x,u) (diff(u,4)-2*diff(u,2)+u)/Re - 1i*(2*u+(1-x.^2).*(diff(u,2)-u));
A.lbc = @(u) [u diff(u)];
A.rbc = @(u) [u diff(u)];
lam = eigs(A,B,60,'LR');
clf, plot(lam,'r.'), grid on, axis equal
spectral_abscissa = max(real(lam))
%% 7.6 Exponential of a linear operator -- EXPM
% In Matlab, EXPM computes the exponential of a matrix, and this command
% has been overloaded in Chebfun to compute the exponential of a linear
% operator. If L is a linear operator and E(t) = expm(t*L), then the
% partial differential equation u_t = Lu has solution u(t) = E(t)*u(0).
% Thus by taking L to be the 2nd derivative operator, for example, we can
% use expm to solve the heat equation u_t = u_xx:
A = chebop(@(x,u) diff(u,2),[-1,1]);
f = chebfun('exp(-1000*(x+0.3).^6)');
clf, plot(f,'r'), hold on, c = [0.8 0 0];
for t = [0.01 0.1 0.5]
E = expm(t*A & 'dirichlet');
plot(E*f,'color',c), c = 0.5*c;
ylim([-.1 1.1])
end
%%
% Here is a more fanciful analogous computation with a complex initial
% function obtained from the "scribble" command introduced in Chapter 5.
% (As it happens, expm does not map discontinuous data with the usual
% Chebfun accuracy, so warning messages are generated.)
f = scribble('BLUR'); clf
D = chebop([-1,1],@(x,u) diff(u,2));
k = 0;
for t = [0 .0001 .001 .01]
k = k+1; subplot(2,2,k)
if t==0, Lf = f; else L = expm(t*D & 'neumann'); Lf = L*f; end
plot(Lf,'linewidth',3,'color',[.6 0 1])
xlim(1.05*[-1 1]), axis equal
text(.3,.7,sprintf('t = %6.4f',t),'fontsize',12), axis off
end
%% 7.7 Algorithms and accuracy
%%
% We'll say a word, just a word, about how Chebfun carries out these
% computations. The methods involved are Chebyshev spectral methods on
% adaptive grids. The general ideas are presented in [Trefethen 2000],
% [Driscoll, Bornemann & Trefethen 2008], and [Driscoll 2010], but Chebfun
% actually uses modifications of these methods to be described in [Driscoll
% & Hale 2011] involving a novel mix of Chebyshev grids of the first and
% second kinds.
%%
% The basic idea is that linear differential (or integral) operators are
% disretized by spectral differentiation (or integration) matrices. Such a
% matrix applies the desired operator to polynomials via interpolation at
% Chebyshev points, with certain rows of the matrix modified to impose
% boundary conditions. When a differential equation is solved in Chebshev,
% the problem is solved on a sequence of grids of size 9, 17, 33, ... until
% convergence is achieved in the usual Chebfun sense defined by decay of
% Chebyshev expansion coefficients. Much more than just this is really
% going on, however, including the decomposition of intervals into
% subintervals to handle coefficients that are only piecewise smooth.
%%
% One matter you might not guess was challenging is the determination of
% whether or not an operator is linear! In Chebfun the operator is defined
% by an anonymous function, but if it is linear, special actions should be
% possible such as application of EIGS and EXPM and solution of
% differential equations in a single step without iteration. Chebfun
% includes special devices to determine whether a chebop is linear so that
% these effects can be realized.
%%
% As mentioned, the discretization length of a Chebfun solution is chosen
% automatically according to the instrinsic resolution requirements.
% However, the matrices that arise in Chebyshev spectral methods are
% notoriously ill-conditioned. Thus the final accuracy in solving
% differential equations in Chebfun is rarely close to machine precision.
% Typically one loses two or three digits for second-order differential
% equations and five or six for fourth-order problems.
%% 7.8 Block operators and systems of equations
% Some problems involve several variables coupled together. In Chebfun,
% these are treated with the use of quasimatrices, that is, chebfuns with
% several columns.
%%
% For example, suppose we want to solve the coupled system u'=v, v'=-u with
% initial data u=1 and v=0 on the interval [0,10*pi]. (This comes from
% writing the equation u"=-u in first-order form, with v=u'.) We can solve
% the problem like this:
L = chebop(0,10*pi);
L.op = @(x,u,v) [diff(u)-v, diff(v)+u];
L.lbc = @(u,v) [u-1,v];
rhs = [0, 0];
U = L\rhs;
%%
% The solution U is an "infinity-by-2" Chebfun quasimatrix with columns
% u=U(:,1) and v=U(:,2). Here is a plot:
clf, plot(U)
%%
% The overloaded "spy" command helps clarify the structure of this operator
% we just made use of:
spy(L)
%%
% This image shows that L maps a pair of functions [u;v] to a pair of
% functions [w;y], where the dependences of w on u and y on v are global
% (because of the derivative) whereas the dependences of w on v and y on u
% are local (diagonal). Note that for such interpretations we think of
% [u;v] and [w;y] as 2-vectors oriented columnwise, but the Chebfun syntax
% actually builds them as [u,v] and [w,y]. This is potentially confusing
% but was necessary since [u;v] has the quite different meaning in Chebfun
% of a concatenation of two functions into a single function on a longer
% interval.
%%
% To illustrate the solution of an eigenvalue problem involving a block
% operator, we can take much the same idea. The eigenvalue problem u"=c^2u
% with u=0 at the boundaries can be written in first order form as u'=cv,
% v'=cu. Here are the first 7 eigenvalues:
L = chebop(0,10*pi);
L.op = @(x,u,v) [diff(v), diff(u)];
L.lbc = @(u,v) u;
L.rbc = @(u,v) u;
[U,V,D] = eigs(L,7);
eigenvalues = diag(D)
%%
% Notice that two eigenfunction quasimatrices U and V have been specified
% among the output variables. (If just one had been specified, the output
% would have been a cell array containing two quasimatrices.) To see the u
% eigenfunctions, we can plot U. As it happens, the eigenfunctions as
% computed by eigs are imaginary, so before plotting we divide by 1i to
% make them real, and take the real part to filter out rounding errors:
eigenfunctions = real(U/1i);
plot(eigenfunctions)
%%
% The operator in this eigenvalue problem has a simpler structure
% than before:
spy(L)
%% 7.9 Nonlinear equations by Newton iteration
% As mentioned at the beginning of this chapter, nonlinear differential
% equations are discussed in Chapter 10. As an indication of some of the
% possibilities, however, we now illustrate how a sequence of linear
% problems may be useful in solving nonlinear problems. For example, the
% nonlinear BVP
%
% 0.001u'' - u^3 = 0, u(-1)=1, u(1)=-1
%
% could be solved by Newton iteration as follows.
L = chebop(-1,1);
L.op = @(x,u) 0.001*diff(u,2);
J = chebop(-1,1);
x = chebfun('x');
u = -x; nrmdu = Inf;
while nrmdu > 1e-10
r = L*u - u.^3;
J.op = @(du) .001*diff(du,2) - 3*u.^2.*du;
J.bc = 0;
du = -(J\r);
u = u+du; nrmdu = norm(du)
end
clf, plot(u)
%%
% Note the beautifully fast convergence, as one expects with Newton's
% method. The chebop J defined in the WHILE loop is a Jacobian operator
% (=Frechet derivative), which we have constructed explicitly by
% differentiating the nonlinear operator defining the ODE. In Section 10.4
% we shall see that this whole Newton iteration can be automated by use of
% Chebfun's "nonlinear backslash" capability, which utilizes Automatic
% Differentiation (AD) to construct the Frechet derivative automatically.
% In fact, all you need to type is
N = chebop(-1,1);
N.op = @(x,u) 0.001*diff(u,2) - u.^3;
N.lbc = 1; N.rbc = -1;
v = N\0;
%%
% The result is the same as before to many digits of accuracy:
norm(u-v)
%%
% Here is how long it took to execute this chapter:
fprintf('Time to execute this chapter: %3.1f seconds',toc)
%% 7.10 BVP Systems with Unknown Paramters
% It is sometimes the case that ODEs or systems of ODEs contain unknown
% parameter values which must be computed for as part of the solution. An
% example of this is Matlab's builti-in MAT4BVP example. These parameters
% can always be included in system as unkowns with zero derivatives, but
% this can be computationally inefficient. Chebfun allows the option of
% explicit treatment of the parameters. Often the dependence of the
% solution on these parameters is nonlinear (such as in the case below),
% and this discussion might better have been left to Chapter 10, but since,
% from the user perspective, ther is little difference in this case, we
% include it here.
%%
% Below is an example of such a paramterised problem, which is represents a
% linear pendulum with a forcing sine-wave term of an unknown frequency T.
% The task is to compute the solution for which u(-pi)=u(pi)=u'(pi)=1;
N = chebop(@(x,u,T) diff(u,2) - u - sin(T.*x/pi),[-pi pi]);
N.lbc = @(u,T) u-1;
N.rbc = @(u,T) [u-1, diff(u)-1];
uT = N\0;
u = uT(:,1); T = uT(0,2)
plot(u)
%%
% As the system is nonlinear in T, we can expect that there will be more
% than one solution. Indeed, if we choose a different initial guess for T,
% we can converge to one of these.
N.init = [1,7];
uT = N\0;
u = uT(:,1); T = uT(0,2)
plot(u)
%%
% Unfortunately, this functionality is not yet available for eigenvalue
% problem.
%% 7.11 References
%
% [Birkisson & Driscoll 2011] A. Birkisson and T. A. Driscoll, Automatic
% Frechet differentiation for the numerical solution of boundary-value
% problems, ACM Transactions on Mathematical Software, to appear
%
% [Driscoll 2010] T. A. Driscoll, Automatic spectral collocation for
% integral, integro-differential, and integrally reformulated differential
% equations, Journal of Computational Physics 229 (2010), 5980-5998.
%
% [Driscoll, Bornemann & Trefethen 2008] T. A. Driscoll, F. Bornemann, and
% L. N. Trefethen, "The chebop system for automatic solution of
% differential equations", BIT Numerical Mathematics 46 (2008),701-723.
%
% [Driscoll & Hale 2011] T. A. Driscoll and N. Hale, manuscript in
% preparation, 2011.
%
% [Fornberg 1996] B. Fornberg, A Practical Guide to Pseudospectral Methods,
% Cambridge University Press, 1996.
%
% [Schmid & Henningson 2001] P. J. Schmid and D. S. Henningson, Stability
% and Transition in Shear Flows, Springer, 2001.
%
% [Trefethen 2000] L. N. Trefethen, Spectral Methods in MATLAB, SIAM, 2000.