Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - 日本語 - Русский

Please note that the recommended version of Scilab is 6.0.1. This page might be outdated.
See the recommended documentation of this function

Ajuda do Scilab >> Equações Diferenciais > dasrt

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<=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);
//(Deveria retornar nn=[2.4698972 2])
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Wed Apr 01 10:24:14 CEST 2015