The Nullspace of Linear Operators

Nick Hale & Stefan Güttel, 12th December 2011

Contents

(Chebfun example ode-eig/NullSpace.m)

We've recently introduced some new functionality in Chebfun for computing the nullspace of differential operators. Let's explore this with a couple of simple examples!

Simple Example #1

Let's start as simply as we can, and take

u"(x) = 0, for x in [-1 1]
L = chebop(@(u) diff(u,2));

Clearly the nullspace, that is the nontrivial functions v for which

L(v) = 0,

for this operator is spanned the two functions

v = [1 chebfun('x')];
norm(L*v)
ans =
0

Supposing we didn't know this, we could compute the space with the new NULL function.

V = null(L)
plot(V)
V'*V
norm(L*V)
V =
chebfun column 1 (1 smooth piece)
interval       length   endpoint values
[      -1,       1]        7     -1.4     0.44
vertical scale = 1.4
chebfun column 2 (1 smooth piece)
interval       length   endpoint values
[      -1,       1]        7     0.29     -1.3
vertical scale = 1.3
ans =
1.0000    0.0000
0.0000    1.0000
ans =
7.3130e-12 where we find that V'V = I and LV ~ 0 as required.

Clearly V doesn't correspond directly to 1 and x, since there is some freedom in how we orthogonalise the basis. However, we can check that V and {1,x} correspond to the the same spaces by computing the angle between the spaces with the SUBSPACE command.

subspace(v,V)
ans =
5.4439e-13

Incomplete boundary conditions

Now let's consider the more complicated 2nd-order operator

Lu = u'' + .1*(1-x.^2)u' - sin(x)u, x in [-pi pi]                (*)
dom = [-pi pi];
L = chebop(@(x,u) diff(u,2) + .1*x.*(1-x.^2).*diff(u) + sin(x).*u, dom);
x = chebfun('x',dom);

As before, it has a nullspace of rank 2.

V = null(L)
plot(V)
V'*V
norm(L(x,V(:,1)))
norm(L(x,V(:,2)))
V =
chebfun column 1 (1 smooth piece)
interval       length   endpoint values
[    -3.1,     3.1]       39     -1.8   -0.044
vertical scale = 1.8
chebfun column 2 (1 smooth piece)
interval       length   endpoint values
[    -3.1,     3.1]       40   -0.011      1.3
vertical scale = 1.3
ans =
1.0000    0.0000
0.0000    1.0000
ans =
1.1447e-10
ans =
4.9739e-11 However, now suppose we impose ONE boundary condition, say Dirichlet at the left. This removes ONE degree of freedom, and we are now left with a rank 1 nullspace.

L.lbc = 0;
L.rbc = [];
v = null(L)
plot(v), shg
v'*v
norm(L(x,v))
v =
chebfun column (1 smooth piece)
interval       length   endpoint values
[    -3.1,     3.1]       40 -3.4e-15      1.3
vertical scale = 1.3
ans =
1.0000
ans =
4.9698e-11 Clearly this null vector must satisfy the given condition v(-pi) = 0.

An application

Where might this be useful? Well, suppose we were interested in equation (*) with a homogeneous Dirichlet condition at the left, and wanted to know what inhomogenous Dirichlet condition gave the minimal 2-norm of the solution to Lu = 1.

Rather than solving the linear system for a number of different boundary conditions (which would be computationally expensive) we could simply solve for one, say again homogenous Dirichlet

L.rbc = 0;
u = L\1;
hold on, plot(u,'--r'), hold off; and compute the rest by adding a scalar multiple of the null-function v.

E = chebfun(@(c) norm(u+c*v,2),'vectorise',[-10 10],'splitting','on');
plot(E) We compute the 2-norm as a chebfun in the unknown variable c, which we can then minimise to obtain the minimal energy solution

[minE c_star] = min(E)
u_star = u + c_star*v
plot(u_star)
minE =
4.1220
c_star =
3.1438
u_star =
chebfun column (1 smooth piece)
interval       length   endpoint values
[    -3.1,     3.1]       44 -5.7e-15        4
vertical scale =   4 So the condition we require is that u(pi) = bc_star, where

bc_star = u_star(pi)
bc_star =
3.9894

Exotic constraints

The NULL function can also handle the exotic types of boundary conditions that can be enforced in Chebfun (see ). For example, suppose we wish to again compute the null-space of the 3rd-order piecewise-smoooth ODE

Lu := 0.001u''' + sign(x)*u'' + u, x in [-1 1]

with the 'boundary' condition that

sum(u) = u(0).
dom = [-1 1];
L = chebop(@(x,u) 1e-2*diff(u,3) + sign(x).*diff(u,2) + u);
L.lbc = []; L.rbc = [];
L.bc = @(u) sum(u)-u(0);
x = chebfun('x',dom);

Here NULL has no problems!

V = null(L)
plot(V), shg
V'*V
V =
chebfun column 1 (2 smooth pieces)
interval       length   endpoint values
[      -1,       0]       65     0.84     0.98
[       0,       1]       64     0.98    -0.75
Total length = 129   vertical scale = 0.98
chebfun column 2 (2 smooth pieces)
interval       length   endpoint values
[      -1,       0]       65       -1     0.72
[       0,       1]       65     0.72     0.84
Total length = 130   vertical scale =   1
ans =
1.0000   -0.0000
-0.0000    1.0000 sum(V(:,1))-V(0,1)
norm(L(x,V(:,1)),1)
sum(V(:,2))-V(0,2)
norm(L(x,V(:,2)),1)
ans =
1.4380e-12
ans =
4.8847e-09
ans =
-7.6439e-13
ans =
4.5108e-09