# 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 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`

.- y0
a real column vector of initial conditions.

- ydot0
a real column vector of the time derivative of

`y`

at`t0`

(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 of`y`

.- 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)`

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 nowr = 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:

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`

and`ipar`

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 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 nowr = 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:

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)`

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

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 is`list([],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 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)=[]`

.- 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 set`info(6)=0`

.- info(7)
set

`info(7)=1`

if`ydot0`

is just an estimation,`info(7)=0`

if`g(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)]`

where`t`

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 | Differential calculus, Integration | dassl >> |