bvode — boundary value problems for ODE
[z]=bvode(points,ncomp,m,aleft,aright,zeta,ipar,ltol,tol,fixpnt,... fsub1,dfsub1,gsub1,dgsub1,guess1)
The solution of the ode evaluated on the mesh given by points
an array which gives the points for which we want the solution
number of differential equations (ncomp <= 20)
a vector of size ncomp
.
m(j)
gives the order of the j-th differential
equation
left end of interval
right end of interval
zeta(j)
gives j-th side condition point
(boundary point). must have
zeta(j) <= zeta(j+1)
all side condition points must be mesh points in all meshes
used, see description of ipar(11)
and
fixpnt
below.
an integer array dimensioned at least 11. a list of the
parameters in ipar
and their meaning follows some
parameters are renamed in bvode; these new names are given in
parentheses.
0 if the problem is linear, 1 if the problem is nonlinear
= number of collocation points per subinterval (= k ) where
max m(i) <= k <= 7 .
if ipar(2)=0
then bvode sets
k = max ( max m(i)+1, 5-max m(i)
)
= number of subintervals in the initial mesh ( = n ). if
ipar(3) = 0
then bvode arbitrarily sets
n = 5
.
= number of solution and derivative tolerances. ( = ntol ) we require
0 < ntol <= mstar.
= dimension of fspace
( = ndimf ) a
real work array. its size provides a constraint on nmax.
choose ipar(5) according to the formula:
ipar(5)>=nmax*nsizef
where
nsizef=4+3*mstar+(5+kd)*kdm+(2*mstar-nrec)*2*mstar
.
= dimension of ispace ( = ndimi )an integer work array.
its size provides a constraint on nmax, the maximum number of
subintervals. choose ipar(6)
according to
the formula:
ipar(6)>=nmax*nsizei
where
nsizei=3 + kdm
with
kdm=kd+mstar
; kd=k*ncomp
; nrec
=number of right end
boundary conditions.
output control ( = iprint )
for full diagnostic printout
for selected printout
for no printout
( = iread )
causes bvode to generate a uniform initial mesh.
Other values are not implemented yet in Scilab
if the initial mesh is provided by the user. it is defined in fspace as follows: the mesh
will occupy fspace(1), ...,
fspace(n+1)
. the user needs to supply only
the interior mesh points fspace(j) = x(j),
j = 2, ..., n.
as with ipar(8)=1
, and in
addition no adaptive mesh selection is to be
done.
( = iguess )
if no initial guess for the solution is provided.
if an initial guess is provided by the user in
subroutine guess
.
if an initial mesh and approximate solution coefficients are provided by the user in fspace. (the former and new mesh are the same).
if a former mesh and approximate solution coefficients are provided by the user in fspace, and the new mesh is to be taken twice as coarse; i.e.,every second point from the former mesh.
if in addition to a former initial mesh and approximate solution coefficients, a new mesh is provided in fspace as well. (see description of output for further details on iguess = 2, 3, and 4.)
if the problem is regular
if the first relax factor is =rstart, and the nonlinear iteration does not rely on past covergence (use for an extra sensitive nonlinear problem only).
if we are to return immediately upon (a) two successive nonconvergences, or (b) after obtaining error estimate for the first time.
= number of fixed points in the mesh other than
aleft
and aright
. ( =
nfxpnt , the dimension of fixpnt
) the code
requires that all side condition points other than
aleft
and aright
(see
description of zeta ) be included as fixed points in
fixpnt
.
an array of dimension ipar(4)
.
ltol(j) = l
specifies that the j-th tolerance in
tol controls the error in the l-th component of
z(u)
. also require that:
1 <= ltol(1) < ltol(2) < ... < ltol(ntol)
<= mstar
an array of dimension ipar(4)
.
tol(j)
is the error tolerance on the
ltol(j)
-th component of z(u)
.
thus, the code attempts to satisfy for j=1:ntol
on each subinterval
if v(x)
is the approximate solution
vector.
an array of dimension ipar(11)
. it contains
the points, other than aleft
and
aright
, which are to be included in every
mesh.
The function fsub,dfsub,gsub,dgsub,guess
are Scilab externals i.e. functions (see syntax below) or the name
of a Fortran subroutine (character string) with specified calling
sequence or a list. An external as a character string refers to the
name of a Fortran subroutine. The Fortran coded function interface
to bvode are specified in the file fcol.f
.
name of subroutine for evaluating
at a point x in (aleft,aright)
. it
should have the heading [f]=fsub(x,z)
where
f
is the vector containing the value of
fi(x,z(u))
in the i-th component and
is defined as above under purpose .
name of subroutine for evaluating the Jacobian of
f(x,z(u))
at a point x. it should have the
heading [df]=dfsub (x , z )
where
z(u(x))
is defined as for
fsub
and the (ncomp
) by
(mstar
) array df should be filled by the
partial derivatives of f, viz, for a particular call one
calculates
name of subroutine for evaluating the i-th component of
g(x,z(u(x))) = g (zeta(i),z(u(zeta(i))))
at a point x = zeta(i)
where
1<=i<=mstar.
it should have the heading[g]=gsub(i,
z)
where z(u)
is as for
fsub
, and i
and
g=gi
are as above. Note that in contrast to
f
in fsub
, here only
one value per call is returned in g
.
name of subroutine for evaluating the i-th row of the
Jacobian of g(x,u(x))
. it should have the
heading [dg]=dgsub(i, z)
where
z(u)
is as for fsub, i as for gsub and the
mstar-vector dg
should be filled with the
partial derivatives of g, viz, for a particular call one
calculates
name of subroutine to evaluate the initial approximation
for z(u(x))
and for
dmval(u(x))
= vector of the mj-th
derivatives of u(x)
. it should have the
heading [z,dmval]= guess (x )
note that
this subroutine is used only if ipar(9) =
1
, and then all mstar
components
of z and ncomp components of dmval should be specified for any
x,
aleft <= x <= aright .
this package solves a multi-point boundary value problem for a mixed order system of ode-s given by
where
is the exact solution vector
is a (generally) nonlinear function of
z(u)=z(u(x))
.
is a (generally) nonlinear function used to represent a boundary condition.
the boundary points satisfy
aleft <= zeta(1) <= .. <= zeta(mstar) <=
aright
.
the orders mi
of the differential equations
satisfy
1<=m(i)<=4
.
deff('df=dfsub(x,z)','df=[0,0,-6/x**2,-6/x]') deff('f=fsub(x,z)','f=(1 -6*x**2*z(4)-6*x*z(3))/x**3') deff('g=gsub(i,z)','g=[z(1),z(3),z(1),z(3)];g=g(i)') deff('dg=dgsub(i,z)',['dg=[1,0,0,0;0,0,1,0;1,0,0,0;0,0,1,0]'; 'dg=dg(i,:)']) deff('[z,mpar]=guess(x)','z=0;mpar=0')// unused here //define trusol for testing purposes deff('u=trusol(x)',['u=0*ones(4,1)'; 'u(1) = 0.25*(10*log(2)-3)*(1-x) + 0.5 *( 1/x + (3+x)*log(x) - x)' 'u(2) = -0.25*(10*log(2)-3) + 0.5 *(-1/x^2 + (3+x)/x + log(x) - 1)' 'u(3) = 0.5*( 2/x^3 + 1/x - 3/x^2)' 'u(4) = 0.5*(-6/x^4 - 1/x/x + 6/x^3)']) fixpnt=0;m=4; ncomp=1;aleft=1;aright=2; zeta=[1,1,2,2]; ipar=zeros(1,11); ipar(3)=1;ipar(4)=2;ipar(5)=2000;ipar(6)=200;ipar(7)=1; ltol=[1,3];tol=[1.e-11,1.e-11]; res=aleft:0.1:aright; z=bvode(res,ncomp,m,aleft,aright,zeta,ipar,ltol,tol,fixpnt,... fsub,dfsub,gsub,dgsub,guess) z1=[];for x=res,z1=[z1,trusol(x)]; end; z-z1