| MATLAB Function Reference | ![]() |
Solve boundary value problems for ordinary differential equations
sol = bvp4c(odefun,bcfun,solinit)
sol = bvp4c(odefun,bcfun,solinit,options)
solinit = bvpinit(x, yinit,
params)
A function handle that evaluates
the differential equations
dydx = odefun(x,y) dydx = odefun(x,y,parameters) where x is a scalar corresponding to
| ||
A function handle that computes
the residual in the boundary conditions. For two-point boundary value
conditions of the form
res = bcfun(ya,yb) res = bcfun(ya,yb,parameters) where ya and yb are column vectors corresponding
to
See Multipoint Boundary Value Problems for a description of bcfun for multipoint boundary value problems. | ||
A structure containing the initial guess for a solution. You create solinit using the function bvpinit. solinit has the following fields. | ||
Ordered nodes of the initial mesh. Boundary conditions
are imposed at
| ||
Initial guess for the solution such that solinit.y(:,i) is a guess for the solution at the node solinit.x(i). | ||
Optional. A vector that provides an initial guess for unknown parameters. | ||
The structure can have any name, but the fields must be named x, y, and parameters. You can form solinit with the helper function bvpinit. See bvpinit for details. | ||
Optional integration argument. A structure you create using the bvpset function. See bvpset for details. | ||
sol = bvp4c(odefun,bcfun,solinit) integrates a system of ordinary differential equations of the form
![]()
on the interval [a,b] subject to two-point boundary value conditions
![]()
odefun and bcfun are function handles. See Function Handles in the MATLAB® Programming documentation for more information.
in the MATLAB mathematics documentation, explains how to provide additional parameters to the function odefun, as well as the boundary condition function bcfun, if necessary.
bvp4c can also solve multipoint boundary value problems. See Multipoint Boundary Value Problems. You can use the function bvpinit to specify the boundary points, which are stored in the input argument solinit. See the reference page for bvpinit for more information.
The bvp4c solver can also find unknown
parameters
for problems of the form
![]()
where
corresponds to parameters.
You provide bvp4c an initial guess for any unknown
parameters in solinit.parameters. The bvp4c solver returns the final values of these unknown
parameters in sol.parameters.
bvp4c produces a solution that is continuous on [a,b] and has a continuous first derivative there. Use the function deval and the output sol of bvp4c to evaluate the solution at specific points xint in the interval [a,b].
sxint = deval(sol,xint)
The structure sol returned by bvp4c has the following fields:
Mesh selected by bvp4c | |
Approximation to
| |
Approximation to
| |
Values returned by bvp4c for the unknown parameters, if any | |
The structure sol can have any name, and bvp4c creates the fields x, y, yp, parameters, and solver.
sol = bvp4c(odefun,bcfun,solinit,options) solves as above with default integration properties replaced by the values in options, a structure created with the bvpset function. See bvpset for details.
solinit = bvpinit(x, yinit, params) forms the initial guess solinit with the vector params of guesses for the unknown parameters.
bvp4c solves a class of singular boundary value problems, including problems with unknown parameters p, of the form
![]()
The interval is required to be [0, b] with
b > 0. Often such problems arise when computing a smooth solution
of ODEs that result from partial differential equations (PDEs) due
to cylindrical or spherical symmetry. For singular problems, you specify
the (constant) matrix S as the value of the 'SingularTerm' option of bvpset, and odefun evaluates only f(x, y, p). The boundary conditions must be consistent with the necessary
condition
and the initial guess should satisfy this condition.
bvp4c can solve multipoint boundary value
problems where
are boundary points in the interval
. The points
represent interfaces
that divide
into regions. bvp4c enumerates
the regions from left to right (from a to b), with indices starting from 1. In region k,
, bvp4c evaluates the derivative
as
yp = odefun(x, y, k)
In the boundary conditions function
bcfun(yleft, yright)
yleft(:, k) is the solution at the left boundary of
. Similarly, yright(:, k) is the solution at the right boundary of region k. In particular,
yleft(:, 1) = y(a)
and
yright(:, end) = y(b)
When you create an initial guess with
solinit = bvpinit(xinit, yinit),
use double entries in xinit for each interface point. See the reference page for bvpinit for more information.
If yinit is a function, bvpinit calls y = yinit(x, k) to get an initial guess for the solution at x in region k. In the solution structure sol returned by bpv4c, sol.x has double entries for each interface point. The corresponding columns of sol.y contain the left and right solution at the interface, respectively.
For an example of solving a three-point boundary value problem, type threebvp at the MATLAB command prompt to run a demonstration.
Note The bvp5c function is used exactly like bvp4c, with the exception of the meaning of error tolerances between the two solvers. If S(x) approximates the solution y(x), bvp4c controls the residual |S'(x) - f(x,S(x))|. This controls indirectly the true error |y(x) - S(x)|. bvp5c controls the true error directly. bvp5c is more efficient than bvp4c for small error tolerances. |
Boundary value problems can have multiple solutions and one purpose of the initial guess is to indicate which solution you want. The second-order differential equation
![]()
has exactly two solutions that satisfy the boundary conditions
![]()
Prior to solving this problem with bvp4c, you must write the differential equation as a system of two first-order ODEs

Here
and
. This system has the required form
![]()
The function
and the boundary conditions
are coded in MATLAB software
as functions twoode and twobc.
function dydx = twoode(x,y)
dydx = [ y(2)
-abs(y(1))];
function res = twobc(ya,yb)
res = [ ya(1)
yb(1) + 2];Form a guess structure consisting of an initial mesh of five
equally spaced points in [0,4] and a guess of constant values
and
with the command
solinit = bvpinit(linspace(0,4,5),[1 0]);
Now solve the problem with
sol = bvp4c(@twoode,@twobc,solinit);
Evaluate the numerical solution at 100 equally spaced points
and plot
with
x = linspace(0,4); y = deval(sol,x); plot(x,y(1,:));

You can obtain the other solution of this problem with the initial guess
solinit = bvpinit(linspace(0,4,5),[-1 0]);

This boundary value problem involves an unknown parameter. The
task is to compute the fourth (
) eigenvalue
of Mathieu's
equation
![]()
Because the unknown parameter
is present, this second-order differential
equation is subject to three boundary conditions

It is convenient to use subfunctions to place all the functions required by bvp4c in a single M-file.
function mat4bvp
lambda = 15;
solinit = bvpinit(linspace(0,pi,10),@mat4init,lambda);
sol = bvp4c(@mat4ode,@mat4bc,solinit);
fprintf('The fourth eigenvalue is approximately %7.3f.\n',...
sol.parameters)
xint = linspace(0,pi);
Sxint = deval(sol,xint);
plot(xint,Sxint(1,:))
axis([0 pi -1 1.1])
title('Eigenfunction of Mathieu''s equation.')
xlabel('x')
ylabel('solution y')
% ------------------------------------------------------------
function dydx = mat4ode(x,y,lambda)
q = 5;
dydx = [ y(2)
-(lambda - 2*q*cos(2*x))*y(1) ];
% ------------------------------------------------------------
function res = mat4bc(ya,yb,lambda)
res = [ ya(2)
yb(2)
ya(1)-1 ];
% ------------------------------------------------------------
function yinit = mat4init(x)
yinit = [ cos(4*x)
-4*sin(4*x) ];The differential equation (converted to a first-order system) and the boundary conditions are coded as subfunctions mat4ode and mat4bc, respectively. Because unknown parameters are present, these functions must accept three input arguments, even though some of the arguments are not used.
The guess structure solinit is formed with bvpinit. An initial guess for the solution
is supplied in the form of a function mat4init.
We chose
because it satisfies the boundary conditions
and has the correct qualitative behavior (the correct number of sign
changes). In the call to bvpinit, the third argument
(lambda = 15) provides an initial guess for the
unknown parameter
.
After the problem is solved with bvp4c,
the field sol.parameters returns the value
, and the plot
shows the eigenfunction associated with this eigenvalue.

bvp4c is a finite difference code that implements the three-stage Lobatto IIIa formula. This is a collocation formula and the collocation polynomial provides a C1-continuous solution that is fourth-order accurate uniformly in [a,b]. Mesh selection and error control are based on the residual of the continuous solution.
[1] Shampine, L.F., M.W. Reichelt, and J. Kierzenka, "Solving Boundary Value Problems for Ordinary Differential Equations in MATLAB with bvp4c," available at http://www.mathworks.com/bvp_tutorial
function_handle (@), bvp5c,bvpget, bvpinit, bvpset, bvpxtend, deval
![]() | bsxfun | bvp5c | ![]() |
| © 1984-2008- The MathWorks, Inc. - Site Help - Patents - Trademarks - Privacy Policy - Preventing Piracy - RSS |