DAE solver with zero crossing
[r,nn,[,hd]]=dasrt(x0,t0,t [,atol,[rtol]],res [,jac],ng, surf [,info] [,hd])
is either y0
(ydot0
is
estimated by dassl
with zero as first estimate)
or the matrix [y0 ydot0]
.
g(t,y0,ydot0)
must be equal to zero. If you only
know an estimate of ydot0
set
info(7)=1
.
a real column vector of initial conditions.
a real column vector of the time derivative of
y
at t0
(may be an
estimate).
a real number, it is the initial instant.
a real scalar or vector. Gives instants for which you want the
solution. Note that you can get solution at each dassl's step point
by setting info(2)=1
.
a vector with two entries [times num]
times
is the value of the time at which the
surface is crossed, num
is the number of the
crossed surface.
real scalars or column vectors of same size as
y
or both of size 1. atol, rtol
give respectively
absolute and relative error tolerances of solution. If vectors, the
tolerances are specified for each component of
y
.
external (function or list or string). Computes the value of
g(t,y,ydot)
. It may be :
A Scilab function.
Its syntax must be
[r,ires]=res(t,y,ydot)
and
res
must return the residue
r=g(t,y,ydot)
and error flag
ires
. ires = 0
if
res
succeeds to compute r
,
=-1
if residue is locally not defined for
(t,y,ydot)
, =-2
if
parameters are out of admissible range.
A list.
This form allows to pass parameters other than t,y,ydot to the function. It must be as follows:
list(res,x1,x2,...)
where the syntax of the function
res
is now
r=res(t,y,ydot,x1,x2,...)
res
still returns
r=g(t,y,ydot)
as a function of
(t,y,ydot,x1,x2,...)
.
![]() | Warning: this form must not be used if there is no extra
argument to pass to the function. |
A string.
It must refer to the name of a C or Fortran subroutine linked with Scilab.
In C The syntax must be:
In Fortran it must be:
subroutine res(t,y,yd,r,ires,rpar,ipar) double precision t, y(*),yd(*),r(*),rpar(*) integer ires,ipar(*)
The rpar
and ipar
arrays must be present but cannot be
used.
external (function or list or string). Computes the value of
dg/dy + cj*dg/dydot
for a given value of parameter
cj
.
A Scilab function.
Its syntax must be
r=jac(t,y,ydot,cj)
and the
jac
function must return
r=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydot
where
cj
is a real scalar.
A list.
It must be as follows
list(jac,x1,x2,...)
where the syntax of the function
jac
is now
r=jac(t,y,ydot,cj,x1,x2,...)
jac
still returns
dg/dy + cj*dg/dydot
as a function of
(t,y,ydot,cj,x1,x2,...)
.
A character string.
It must refer to the name of a Fortran subroutine linked with scilab
In C The syntax must be:
In Fortran it must be:
subroutine jac(t,y,yd,pd,cj,rpar,ipar) double precision t, y(*),yd(*),pd(*),cj,rpar(*) integer ipar(*)
external (function or list or string). Computes the value of
the column vector surf(t,y)
with
ng
components. Each component defines a surface.
It may be defined by:
A Scilab function.
Its syntax must be
surf(t,y)
A list.
It must be as follows
where the syntax of the function
surf
is now
r=surf(t,y,x1,x2,...)
A character string.
It must refer to the name of a Fortran subroutine linked with scilab.
In C the syntax must be:
In Fortran it must be:
list which contains 7
elements. Default
value is list([],0,[],[],[],0,0)
.
real scalar which gives the maximum time for which
g
is allowed to be evaluated or an empty
matrix []
if no limits imposed for
time.
flag which indicates if dassl
returns
its intermediate computed values (flag=1
)
or only the user specified time point values
(flag=0
).
2
components vector which give the
definition [ml,mu]
of band matrix computed
by jac
; r(i - j + ml + mu + 1,j) =
"dg(i)/dy(j)+cj*dg(i)/dydot(j)"
.If jac
returns a full matrix set
info(3)=[]
.
real scalar which gives the maximum step size. Set
info(4)=[]
if no limitation.
real scalar which gives the initial step size. Set
info(5)=[]
if not specified.
set info(6)=1
if the solution is
known to be non negative, else set
info(6)=0
.
set info(7)=1
if
ydot0
is just an estimation,
info(7)=0
if
g(t0,y0,ydot0)=0
.
real vector which allows to store the dassl
context and to resume integration.
real matrix . Each column is the vector [t;x(t);xdot(t)]
where
t
is time index for which the solution had been computed.
Solution of the implicit differential equation.
g(t,y,ydot)=0 y(t0)=y0 and ydot(t0)=ydot0
Returns the surface crossing instants and the number of the surface
reached in nn
.
Detailed examples can be found in SCIDIR/tests/unit_tests/dassldasrt.tst
//dy/dt = ((2*log(y)+8)/t -5)*y, y(1) = 1, 1<=t<=6 //g1 = ((2*log(y)+8)/t - 5)*y //g2 = log(y) - 2.2491 y0=1;t=2:6;t0=1;y0d=3; atol=1.d-6;rtol=0;ng=2; deff('[delta,ires]=res1(t,y,ydot)','ires=0;delta=ydot-((2*log(y)+8)/t-5)*y') deff('[rts]=gr1(t,y)','rts=[((2*log(y)+8)/t-5)*y;log(y)-2.2491]') [yy,nn]=dasrt([y0,y0d],t0,t,atol,rtol,res1,ng,gr1); //(Should return nn=[2.4698972 2]) | ![]() | ![]() |