Chebfun allows you to specify jump conditions in ODE BVPs. For example, a 2nd-order ODE would normally take two boundary conditions, like this advection-diffusion equation:

eta = 0.2; L = chebop(@(x,u) eta*diff(u,2) + diff(u), [0 1]); L.lbc = 0; L.rbc = 0;

But suppose we want a continuous solution whose derivative jumps by $-1/\eta$ at $x=1/2$? Mathematically, this is like having one 2nd-order BVP on $[0,1/2]$ coupled to another on $[1/2,1]$, and we will need four boundary conditions in total. The two additional boundary conditions will assert that at $x=1/2$, the derivative jumps by $-1/\eta$ whereas the function value is continuous. Chebfun allows you to specify these conditions like this:

L.bc = @(x,u) [jump(u,1/2) ; jump(diff(u),1/2)+eta]; plot(L\0), grid on

Incidentally, `jump`

is an abbreviation based on a more general Chebfun capability involving evaluations on the left and the right of a point. For example, we could do this:

L.bc = @(x,u) [feval(u,.7,'left')-2 ; feval(u,.7,'right')-1]; plot(L\0), grid on

Returning to the convenience of `jump`

, suppose we want a jump in the function value and continuity of the derivative. We could do this:

L.bc = @(x,u) [jump(u,.2)-1; jump(diff(u),.2)]; plot(L\0), grid on

Now a Green's function for a linear ODE is a solution to a homogeneous BVP with a derivative jump condition at a point $s$ in the interior. The configuration at the beginning of this example was of exactly this kind. Here is the same calculation but for $s=0.75$.

L.bc = @(x,u) [jump(u,0.75) ; jump(diff(u),0.75)+eta]; plot(L\0), grid on

Let's superimpose results for $s=0.5$ and $s=0.25$:

hold on for s = .5:-.25:.25 L.bc = @(x,u) [jump(u,s) ; jump(diff(u),s)+eta]; plot(L\0) end hold off

Actually, we can combine Matlab's anonymous functions and Chebfun's ODE capabilities to make a single object that constructs this Green function:

green = @(s) chebop(@(x,u) eta*diff(u,2) + diff(u), [0 1], ... @(x,u) [u(0); u(1); jump(u,s); jump(diff(u),s)+eta])\0;

Here is an illustration for $s = 0.1, 0.2, \dots, 0.9$.

for s = .1:.1:.9 plot(green(s)), hold on end grid on, hold off