dasrt
DAE solver with zero crossing
Syntax
[r,nn,[,hd]] = dasrt(x0,t0,t [,atol,[rtol]],res [,jac],ng, surf [,info] [,hd])
Arguments
- x0
is either
y0
(ydot0
is estimated bydassl
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 ofydot0
setinfo(7)=1
.- y0
a real column vector of initial conditions.
- ydot0
a real column vector of the time derivative of
y
att0
(may be an estimate).
- t0
a real number, it is the initial instant.
- t
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
.- nn
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.- atol, rtol
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 ofy
.- res
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)
andres
must return the residuer=g(t,y,ydot)
and error flagires
.ires = 0
ifres
succeeds to computer
,=-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 nowr = res(t,y,ydot,x1,x2,...)
res
still returnsr=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:
void res(double *t, double y[], double yd[], double r[], int *ires, double rpar[], int ipar[])
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
andipar
arrays must be present but cannot be used.
- jac
external (function or list or string). Computes the value of
dg/dy + cj*dg/dydot
for a given value of parametercj
.A Scilab function.
Its syntax must be
r=jac(t,y,ydot,cj)
and thejac
function must returnr=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydot
wherecj
is a real scalar.A list.
It must be as follows
list(jac,x1,x2,...)
where the syntax of the function
jac
is nowr = jac(t,y,ydot,cj,x1,x2,...)
jac
still returnsdg/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:
void jac(double *t, double y[], double yd[], double pd[], double *cj, double rpar[], int ipar[])
In Fortran it must be:
subroutine jac(t,y,yd,pd,cj,rpar,ipar) double precision t, y(*),yd(*),pd(*),cj,rpar(*) integer ipar(*)
- surf
external (function or list or string). Computes the value of the column vector
surf(t,y)
withng
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
list(surf,x1,x2,...)
where the syntax of the function
surf
is nowr = 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:
void surf(int *ny, double *t, double y[], int *ng, double gout[])
In Fortran it must be:
subroutine surf(ny,t,y,ng,gout) double precision t, y(*),gout(*) integer ny,ng
- info
list which contains
7
elements. Default value islist([],0,[],[],[],0,0)
.- info(1)
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.- info(2)
flag which indicates if
dassl
returns its intermediate computed values (flag=1
) or only the user specified time point values (flag=0
).- info(3)
2
components vector which give the definition[ml,mu]
of band matrix computed byjac
;r(i - j + ml + mu + 1,j) = "dg(i)/dy(j)+cj*dg(i)/dydot(j)"
.Ifjac
returns a full matrix setinfo(3)=[]
.- info(4)
real scalar which gives the maximum step size. Set
info(4)=[]
if no limitation.- info(5)
real scalar which gives the initial step size. Set
info(5)=[]
if not specified.- info(6)
set
info(6)=1
if the solution is known to be non negative, else setinfo(6)=0
.- info(7)
set
info(7)=1
ifydot0
is just an estimation,info(7)=0
ifg(t0,y0,ydot0)=0
.
- hd
real vector which allows to store the
dassl
context and to resume integration.- r
real matrix . Each column is the vector
[t;x(t);xdot(t)]
wheret
is time index for which the solution had been computed.
Description
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
Examples
// 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])
See also
Report an issue | ||
<< daskr | Intégration - dérivation | dassl >> |