Please note that the recommended version of Scilab is 2024.1.0. This page might be outdated.
However, this page did not exist in the previous stable version.
dassl
Equação diferencial algébrica
Seqüência de Chamamento
[r [,hd]]=dassl(x0,t0,t [,atol,[rtol]],res [,jac] [,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
.- 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
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,...)
.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
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
Em Fortran deve ser
subroutine jac(t,y,yd,pd,cj,rpar,ipar) double precision t, y(*),yd(*),pd(*),cj,rpar(*) integer ipar(*)
- info
lista opcional 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, ajusteinfo(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)] onde t é o índice do tempo para o qual a solução foi computada
Descrição
A função dassl integra a equação alegébrica-diferencial e retorna a
evolução dey
em pontos de tempo dados.
g(t,y,ydot)=0 y(t0)=y0 e ydot(t0)=ydot0
Exemplos
function [r, ires]=chemres(t, y, yd) r=[-0.04*y(1)+1d4*y(2)*y(3)-yd(1) 0.04*y(1)-1d4*y(2)*y(3)-3d7*y(2)*y(2)-yd(2) y(1)+y(2)+y(3)-1]; ires=0 endfunction function 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 ] endfunction 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; y1=dassl([y0,yd0],0,4d10,chemres,info); y2=dassl([y0,yd0],0,4d10,chemres,chemjac,info); //utilizando um argumento extra para parâmetros //----------------------------------- function [r, ires]=chemres(t, y, yd, a, b, c) r=[-a*y(1)+b*y(2)*y(3)-yd(1) a*y(1)-b*y(2)*y(3)-c*y(2)*y(2)-yd(2) y(1)+y(2)+y(3)-1]; ires=0 endfunction function pd=chemjac(x, y, yd, cj, a, b, c) pd=[-a-cj , b*y(3) , b*y(2); a ,-b*y(3)-2*c*y(2)-cj ,-b*y(2); 1 , 1 , 1 ] endfunction y3=dassl([y0,yd0],0,t,list(chemres,0.04,1d4,3d7),list(chemjac,0.04,1d4,3d7)); //utilizando código c //------------ // - criando o código C rescode=['void chemres(double *t, double y[], double yd[], double r[], int *ires, double rpar[], int ipar[])' ' {' ' r[0] = -0.04*y[0]+1.0e4*y[1]*y[2] -yd[0];' ' r[1] = 0.04*y[0]-1.0e4*y[1]*y[2]-3.0e7*y[1]*y[1]-yd[1];' ' r[2] = y[0]+y[1]+y[2]-1;' ' *ires = 0;' ' }']; jaccode=['void chemjac(double *t, double y[], double yd[], double pd[], double *cj, double rpar[], int ipar[])' ' {' ' /* primeira coluna*/' ' pd[0] = -0.04-*cj;' ' pd[1] = 0.04;' ' pd[2] = 1.0;' ' /* segunda coluna*/' ' pd[3] = 1.0e4*y[2];' ' pd[4] = -1.0e4*y[2]-2*3.0e7*y[1]-*cj;' ' pd[5] = 1.0;' ' /* terceira coluna*/' ' pd[6] = 1.0e4*y[1];' ' pd[7] = -1.0e4*y[1];' ' pd[8] = 1.0;' ' }']; mputl([rescode;jaccode],fullfile(TMPDIR,'mycode.c')) //create the C file // - compilando-o ilib_for_link(['chemres','chemjac'],fullfile(TMPDIR,'mycode.c'),[],'c','',fullfile(TMPDIR,'loader.sce'));//compilando // - ligando-o com o Scilab exec(fullfile(TMPDIR,'loader.sce')) //linking incremental // - chamada a dassl y4=dassl([y0,yd0],0,t,'chemres','chemjac');
Report an issue | ||
<< dasrt | Equações Diferenciais | diff >> |