Solucionador de equações diferenciais algébricas com cruzamento de zeros
[r,nn,[,hd]]=dasrt(x0,t0,t [,atol,[rtol]],res [,jac],ng, surf [,info] [,hd])
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
vetor coluna de reais de condições iniciais
vetor coluna de reais da derivada do tempo de
y em t0 (pode ser uma
estimativa).
número real, é o instante inicial
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.
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
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.
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:
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.
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
Em Fortran deve ser
subroutine jac(t,y,yd,pd,cj,rpar,ipar) double precision t, y(*),yd(*),pd(*),cj,rpar(*) integer ipar(*)
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:
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:
Em Fortran deve ser
lista que contém 7 elementos, o valor
padrão é list([],0,[],[],[],0,0)
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.
indica se dassl retorna seus valores
intermediários computados (flag=1) ou
apenas os valores de pontos tempo especificados pelo usuário
(flag=0).
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)=[].
escalar real que fornece o tamanho de passo máximo. Faça
info(4)=[] se não houver limitação.
escalar real que fornece o passo inicial. Faça
info(5)=[] se não for especificado.
faça info(6)=1 caso se saiba que a
soulução não é negativa, em outro caso, ajuste.
info(6)=0.
faça info(7)=1 se
ydot0 é apenas uma estimativa,
info(7)=0 se
g(t0,y0,ydot0)=0.
vetor de reais que permite armazenar o contexto de
dassl e retomar integração
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
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
//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]) | ![]() | ![]() |