Nonlinear Boundary Value Problem

There is preliminary support for nonlinear equations, via Newton iteration in function space. Here is a simple two-point boundary value problem:

We solve

\[Du = 0.001u^{\prime\prime} + 6(1-x^2)u^{\prime} + u^2 - 1 = 0,\]

subject to the boundary conditions $u(-1)=1$ and $u(1)=-0.5$.

using ApproxFun
using LinearAlgebra

Define the vector that collates the differential equation and the boundary conditions

N1(u, x = Fun()) = [u(-1.)-1., u(1.)+0.5, 0.001u'' + 6(1-x^2)u' + u^2 - 1];

Solve the equation using Newton iteration

function nbvpsolver()
    x = Fun()
    u0 = 0 * x # starting value

    newton(N1, u0)

u = nbvpsolver();

We plot the solution

import Plots
Plots.plot(u; title = "Solution", xlabel="x", ylabel="u(x)", legend=false)
Example block output

System of nonlinear differential equations

One can also solve a system of nonlinear ODEs with potentially nonlinear boundary conditions:

using ApproxFun
using LinearAlgebra

N2(u1, u2) = [u1'(0) - 0.5*u1(0)*u2(0);
                u2'(0) + 1;
                u1(1) - 1;
                u2(1) - 1;
                u1'' + u1*u2;
                u2'' - u1*u2]

function nbvpsolver2()
    x = Fun(0..1)
    u10 = one(x)
    u20 = one(x)
    newton(N2, [u10,u20])
u1,u2 = nbvpsolver2();

Plot the solutions

import Plots
Plots.plot(u1, label="u1", xlabel="x")
Plots.plot!(u2, label="u2")
Example block output

This page was generated using Literate.jl.