Code covered by the BSD License

# Chebfun

30 Apr 2009 (Updated 05 Apr 2012)

Numerical computation with functions instead of numbers.

### Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

Time-independent Schr&ouml;dinger eqn reflection coefficients

# Time-independent Schrödinger eqn & reflection coefficients

Sheehan Olver, 27 September 2010

(Chebfun example ode/ReflectionCoefficient.m)

The reflection coefficient acts as the "Fourier transform" for nonlinear integrable PDEs, such as KdV and NLS. For an initial condition q(x), if u solves the time independent Schrodinger equation

   d2u/d2x + (w^2 + q) u = 0

on (-inf, inf) so that

   u ~ exp(-i w x)

at -inf, then

   u ~ a exp(-i w x) + b exp(i w x)

at inf, where a and b are constants. The reflection coefficient is then the ratio b/a.

Here we we compute u on (-inf,0] by writing

   u = (p + 1) exp(-i w x),

and solving the non-oscillatory ODE for p

   p'' - 2i*w*p' + q p = q.

We likewise find solutions to the time independent Schrodinger equation phip and phim on [0,inf) which satisfy

   phip ~ exp(i w x) and phim ~ exp(-i w x)

We then write

   u = a phim + b phip

on [0,inf) by solving

   u(0) = a phim(0) + b phip(0) and u'(0) = a phim'(0) + b phip'(0)
warnstate = warning;

tic
w = 2.0;
dneg = domain([-inf,0]);

Dneg = diff(dneg);
qneg = chebfun('sech(x).^2',dneg);
Lneg = Dneg^2 - 2i*w*Dneg+diag(qneg);
Lneg.lbc(1) = 0;

p = Lneg\(-qneg);
pD = diff(p);

dpos = domain([0,inf]);

Dpos = diff(dpos);
qpos = chebfun('sech(x).^2',dpos);
Lposp = Dpos^2 + 2i*w*Dpos+diag(qpos);
Lposp.rbc = 0;
Lposm = Dpos^2 - 2i*w*Dpos+diag(qpos);
Lposm.rbc = 0;

phip = Lposp \ (-qpos);
phim = Lposm \ (-qpos);

phipD = diff(phip);
phimD = diff(phim);

ab = [[phim(0)+1, phip(0)+1],
[phimD(0)-1i.*w.*(phim(0)+1), phipD(0)+1i.*w.*(phip(0)+1)]] \ ...
[1 + p(0); pD(0) - 1i.*w.*(p(0)+1)];

soln = ab(2)/ab(1)

Warning: Operator may not have the correct number of boundary conditions.
Warning: Problem may be ill-posed. Check the boundary conditions.
Warning: Operator may not have the correct number of boundary conditions.
Warning: Problem may be ill-posed. Check the boundary conditions.
Warning: Operator may not have the correct number of boundary conditions.
Warning: Problem may be ill-posed. Check the boundary conditions.
soln =
-0.0016 + 0.0031i


The exact reflection coefficient for this initial condition can be found in [Drazin & Johnson 1989]:

truesoln = -0.0016078067215641416 + 0.00308747394810661i

truesoln =
-0.0016 + 0.0031i


This matches the computed result to 7 digits.

error = abs(soln - truesoln)
toc

warning(warnstate)

error =
2.2027e-10
Elapsed time is 2.361702 seconds.