# dasrt

Solucionador de equações diferenciais algébricas com cruzamento de zeros

## Seqüência de Chamamento

    [r,nn,[,hd]]=dasrt(x0,t0,t [,atol,[rtol]],res [,jac],ng, surf [,info] [,hd])

## Parâmetros

x0

  pode ser tanto `y0` (`ydot0` é estimado por `dassl` com a primeira estimativa sendo 0) ou a matriz `[y0 ydot0]`. `g(t,y0,ydot0)` deve ser igual a zero. Se você conhece apenas uma estimativa de `ydot0` faça `info(7)=1`

  y0

    vetor coluna de reais de condições iniciais

  ydot0

    vetor coluna de reais da derivada do tempo de `y` em `t0` (pode ser uma estimativa).

t0

  número real, é o instante inicial

t

  escalar real ou vetor. Fornece instantes para os quais você deseja uma solução. Note que você pode obter soluções para cada ponto de passo de dassl fazendo `info(2)=1`.

nn

  um vetor com duas entradas `[times num]` `times` é o valor do tempo no qual a superfície é cruzada, `num` é o número da superfície cruzada

atol, rtol

  escalares reais ou vetores colunas com o mesmo tamanho que `y`. `atol, rtol` fornecem respectivamente as tolerâncias de erros absolutos e relativos da solução. Se forem vetores, as tolerâncias são especificadas para cada elemento de `y`.

res

  função, lista ou string externos. Computa o valor de `g(t,y,ydot)`. Pode ser :

  - Uma função do Scilab

    Sua seqüência de chamamento pode ser `[r,ires]=res(t,y,ydot)` e `res` e deve retornar o resíduo `r=g(t,y,ydot)` e o indicador de erro `ires`. `ires = 0` se `res` obtiver sucesso ao computar `r`, `=-1` se o resíduo é indefinido localmente para `(t,y,ydot)`, `=-2` se os parâmetros estão fora do intervalo admissível.

  - Uma lista

    Esta forma permite passar outros parâmetros além de t,y,ydot à função. Deve ser como segue:

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

    Onde a seqüência de chamamento da função `res` é agora

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

    `res` ainda retorna `r=g(t,y,ydot)` como função de `(t,y,ydot,x1,x2,...)`.

    Warning: this form must not be used if there is no extra argument to pass to `the function.`

  - Um string

    Deve se referir ao nome subrotina C ou Fortran ligada ao Scilab.

    Em C a seqüência de chamamento:

        void res(double *t, double y[], double yd[], double r[],
                 int *ires, double rpar[], int ipar[])

    Em Fortran deve ser:

        subroutine res(t,y,yd,r,ires,rpar,ipar)
        double precision t, y(*),yd(*),r(*),rpar(*)
        integer ires,ipar(*)

    Os arrays `rpar` e `ipar` devem estar presentes, mas não podem ser utilizados.

jac

  função, lista ou string externos. Computa o valor de `dg/dy+cj*dg/dydot` para um dado valor do parâmetro `cj`

  - Uma função do Scilab

    Sua seqüência de chamamento deve ser `r=jac(t,y,ydot,cj)` e a função `jac` deve retornar `r=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydot` onde `cj` é um escalar real.

  - Uma lista

    Deve ser como segue

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

    Onde a seqüência de chamamento da função `jac` é agora

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

    `jac` ainda retorna `dg/dy+cj*dg/dydot` como uma função de `(t,y,ydot,cj,x1,x2,...)`.

  - Um string

    Deve se referir ao nome de uma subrotina C ou Fortran ligada ao Scilab

    Em C, a seqüência de chamamento deve ser

        void jac(double *t, double y[], double yd[],
                 double pd[], double *cj, double rpar[], int ipar[])

    Em Fortran deve ser

        subroutine jac(t,y,yd,pd,cj,rpar,ipar)
        double precision t, y(*),yd(*),pd(*),cj,rpar(*)
        integer ipar(*)

surf

  função, lista ou string externo. Computa o valor do vetor coluna `surf(t,y)` com componentes `ng`. Cada componente define uma superfície. Pode ser definido por:

  - Uma função Scilab

    Sua seqüência de chamamento deve ser `surf(t,y)`

  - Uma lista

    Deve ser como segue:

        list(surf,x1,x2,...)

    onde a seqüência de chamamento `surf` é agora

        r=surf(t,y,x1,x2,...)

  - Um string

    Deve se referir ao nome de uma subrotina C ou Fortran ligada ao Scilab

    Em C a seqüência de chamamento deve ser:

        void surf(int *ny, double *t, double y[], int *ng, double gout[])

    Em Fortran deve ser

        subroutine surf(ny,t,y,ng,gout)
        double precision t, y(*),gout(*)
        integer ny,ng

info

  lista que contém `7` elementos, o valor padrão é list([],0,[],[],[],0,0)

  info(1)

    escalar real que fornece o tempo máximo para o qual se permite avaliar `g`, ou uma matriz vazia `[]` se não houver limites impostos sobre o tempo.

  info(2)

    indica se `dassl` retorna seus valores intermediários computados (`flag=1`) ou apenas os valores de pontos tempo especificados pelo usuário (`flag=0`).

  info(3)

    vetor de dois componentes que fornece a definição `[ml,mu]` de matriz de bandas computada por `jac`; `r(i - j + ml + mu + 1,j) = "dg(i)/dy(j)+cj*dg(i)/dydot(j)"` .Se `jac` retorna uma matriz cheia, faça `info(3)=[]`.

  info(4)

    escalar real que fornece o tamanho de passo máximo. Faça `info(4)=[]` se não houver limitação.

  info(5)

    escalar real que fornece o passo inicial. Faça `info(5)=[]` se não for especificado.

  info(6)

    faça `info(6)=1` caso se saiba que a soulução não é negativa, em outro caso, ajuste. `info(6)=0`.

  info(7)

    faça `info(7)=1` se `ydot0` é apenas uma estimativa, `info(7)=0` se `g(t0,y0,ydot0)=0`.

hd

  vetor de reais que permite armazenar o contexto de `dassl` e retomar integração

r

  matriz de reais . Cada coluna é o vetor `[t;x(t);xdot(t)]` onde `t` é o índice do tempo para o qual a solução foi computada

## Descrição

Solução da equação diferencial implícita

    g(t,y,ydot)=0
    y(t0)=y0  e   ydot(t0)=ydot0

Retorna os instantes de cruzamento da superfície e o número da superfície alcançada em `nn`.

Exemplos detalhados podem ser encontrados em SCIDIR/tests/unit_tests/dassldasrt.tst

## Exemplos

    //dy/dt = ((2*log(y)+8)/t -5)*y,  y(1) = 1,  1&lt;=t&lt;=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);
    //(Deveria retornar nn=[2.4698972 2])

## Ver Também

- ode
- dassl
- impl
- fort
- link
- external