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 pordassl
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 deydot0
façainfo(7)=1
- y0
vetor coluna de reais de condições iniciais
- ydot0
vetor coluna de reais da derivada do tempo de
y
emt0
(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 dey
.- 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)
eres
e deve retornar o resíduor=g(t,y,ydot)
e o indicador de erroires
.ires = 0
seres
obtiver sucesso ao computarr
,=-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
é agorar=res(t,y,ydot,x1,x2,...)
res
ainda retornar=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
eipar
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âmetrocj
Uma função do Scilab
Sua seqüência de chamamento deve ser
r=jac(t,y,ydot,cj)
e a funçãojac
deve retornarr=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydot
ondecj
é um escalar real.Uma lista
Deve ser como segue
list(jac,x1,x2,...)
Onde a seqüência de chamamento da função
jac
é agorar = jac(t,y,ydot,cj,x1,x2,...)
jac
ainda retornadg/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 componentesng
. 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
é agorar=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 porjac
;r(i - j + ml + mu + 1,j) = "dg(i)/dy(j)+cj*dg(i)/dydot(j)"
.Sejac
retorna uma matriz cheia, façainfo(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
seydot0
é apenas uma estimativa,info(7)=0
seg(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)]
ondet
é 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])
Report an issue | ||
<< daskr | Equações Diferenciais | dassl >> |