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)
end
u = nbvpsolver();
We plot the solution
import Plots
Plots.plot(u; title = "Solution", xlabel="x", ylabel="u(x)", legend=false)
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])
end
u1,u2 = nbvpsolver2();
Plot the solutions
import Plots
Plots.plot(u1, label="u1", xlabel="x")
Plots.plot!(u2, label="u2")
This page was generated using Literate.jl.