The Allen-Cahn equation is a reaction-diffusion that arises in material science:

$$ u_{tt} = \varepsilon u'' +u-u^3, $$

where $\varepsilon$ is a small parameter. Here as an ODE boundary-value problem we shall consider a steady-state version of this problem on the interval $[0,10]$ with a sinusoidal forcing term:

$$ \varepsilon u'' + u - u^3 = \sin(x),\qquad u(0) = 1,~~ u(10) = -1. $$

If we try a very small value of $\varepsilon$ without a well-chosen initial guess, Chebfun will not converge. Instead let's begin by solving the problem with the rather large value $\varepsilon = 2$.

Eps = 2; dom = [0, 10]; x = chebfun('x', dom); f = sin(x); cheboppref.setDefaults('plotting', 0.01) N = chebop(@(u) Eps*diff(u,2) + u - u.^3,dom, 1, -1); tic, u = N\f; t = toc; LW = 'linewidth'; lw = 1.6; FS = 'fontsize'; fs = 14; close, plot(u,LW,lw) s = 'Eps = %5.1e length(u) = %d time = %3.1f secs'; title(sprintf(s,Eps,length(u),t),FS,fs)

We now progressively reduce $\varepsilon$ to get sharper and sharper solutions. We use a simple continuation method, in which the initial guess for each iteration is the previous solution. For each value of $\varepsilon$, the solution for the previous value of $\varepsilon$ is a good initial guess of the new solution, so we can turn off damping for the Newton iteration:

cheboppref.setDefaults('damping', 0) Epsvec = [1 .5 .2 .1 .03 .01 .003]; for j = 1:length(Epsvec) close all Eps = Epsvec(j); N = chebop(@(u) Eps*diff(u,2)+u-u.^3,dom,1,-1); N.init = u; tic, u = N\f; t = toc; close, plot(u,LW,lw) title(sprintf(s,Eps,length(u),t),FS,fs), snapnow end