dassl

Scilab Function
Last update : 12/01/2004

dassl - differential algebraic equation

### Calling Sequence

  `[r [,hd]]=dassl(x0,t0,t [,atol,[rtol]],res [,jac] [,info] [,hd])`

### Parameters

- `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` : real column vector of initial conditions.
  - `ydot0` : real column vector of the time derivative of `y` at `t0` (may be an estimate).
- `t0` : real number is the initial instant.
- `t` : 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` .
- `atol,rtol` : real scalars or column vectors of same size as `y` . `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)` .
  - `function`

    : Its calling sequence 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.

  - `list` : it must be as follows:

        list(res,x1,x2,...)

    where the calling sequence 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,...)` .

  - `string` : it must refer to the name of a fortran subroutine (see source code of of `Ex-dassl.f` in routines/defaut/).
- `jac` : external (function or list or string). Computes the value of `dg/dy+cj*dg/dydot` for a given value of parameter `cj`
  - `function` : Its calling sequence 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
  - `list` : it must be as follows

        list(jac,x1,x2,...)

    where the calling sequence of the function `jac` is now

        r=jac(t,y,ydot,x1,x2,...)

    `jac` still returns `dg/dy+cj*dg/dydot` as a function of `(t,y,ydot,cj,x1,x2,...)` .

  - `character string` : it must refer to the name of a fortran subroutine (see source code of `Ex-dassl.f` in routines/defaut/).
- `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(4)=[]` 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

Detailed examples are given in SCIDIR/tests/dassldasrt.tst

### Examples

     deff('[r,ires]=chemres(t,y,yd)',[
             'r(1)=-0.04*y(1)+1d4*y(2)*y(3)-yd(1);';
             'r(2)=0.04*y(1)-1d4*y(2)*y(3)-3d7*y(2)*y(2)-yd(2);'
             'r(3)=y(1)+y(2)+y(3)-1;'
             'ires=0']);
     deff('[pd]=chemjac(x,y,yd,cj)',[
             'pd=[-0.04-cj , 1d4*y(3)               , 1d4*y(2);';
             '0.04    ,-1d4*y(3)-2*3d7*y(2)-cj ,-1d4*y(2);';
             '1       , 1                      , 1       ]'])

    y0=[1;0;0];
    yd0=[-0.04;0.04;0];
    t=[1.d-5:0.02:.4,0.41:.1:4,40,400,4000,40000,4d5,4d6,4d7,4d8,4d9,4d10];

    y=dassl([y0,yd0],0,t,chemres);

    info=list([],0,[],[],[],0,0);
    info(2)=1;
    y=dassl([y0,yd0],0,4d10,chemres,info);
    y=dassl([y0,yd0],0,4d10,chemres,chemjac,info);

### See Also

`ode` , `dasrt` , `impl` , `fort` , `link` , `external` ,