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
abs(z(v)-z(u)) <= tol(j)*abs(z(u)) +tol(j) ltol(j) ltol(j)
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
t f(x,z(u(x))) = (f ,...,f ) 1 ncomp
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
t z(u(x))=(z(1),...,z(mstar))
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
df(i,j) = dfi / dzj, i=1,...,ncomp j=1,...,mstar.
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
(m(i)) u = f ( x; z(u(x)) ) i = 1, ... ,ncomp i i aleft < x < aright,
g ( zeta(j); z(u(zeta(j))) ) = 0 j = 1, ... ,mstar j mstar = m(1)+m(2)+...+m(ncomp),
where
t u = (u , u , ... ,u ) 1 2 ncomp
is the exact solution vector
(mi) u is the mi=m(i) th derivative of u i i
(1) (m1-1) (mncomp-1) z(u(x)) = ( u (x),u (x),...,u (x),...,u (x) ) 1 1 1 ncomp
f (x,z(u)) i
is a (generally) nonlinear function of z(u)=z(u(x))
.
g (zeta(j);z(u)) j
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