Please note that the recommended version of Scilab is 2026.0.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 por- dasslcom 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- ydot0faça- info(7)=1- y0
- vetor coluna de reais de condições iniciais 
- ydot0
- vetor coluna de reais da derivada do tempo de - yem- 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.
- atol,rtol
- escalares reais ou vetores colunas com o mesmo tamanho que - y.- atol,rtolfornecem 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- resdeve retornar o resíduo- r=g(t,y,ydot)e o indicador de erro- ires.- ires = 0se- resobtiver sucesso ao computar- r,- =-1se o resíduo é indefinido localmente para- (t,y,ydot),- =-2se 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,...) - resainda retorna- r=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 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/dydotpara 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- jacdeve retornar- r=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydotonde- 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,...) - jacainda retorna- dg/dy+cj*dg/dydotcomo 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 - 7elementos. 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 - dasslretorna 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- jacretorna 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)=1caso se saiba que a soulução não é negativa, em outro caso, ajuste- info(6)=0.
- info(7)
- faça - info(7)=1se- ydot0é apenas uma estimativa,- info(7)=0se- g(t0,y0,ydot0)=0.
 
- hd
- vetor de reais que permite armazenar o contexto de - dassle 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 deyem 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; y=dassl([y0,yd0],0,4d10,chemres,info); y=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 y=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],TMPDIR+'/mycode.c') //create the C file // - compilando-o ilib_for_link(['chemres','chemjac'],'mycode.c',[],'c',TMPDIR+'/Makefile',TMPDIR+'/loader.sce');//compilando // - ligando-o com o Scilab exec(TMPDIR+'/loader.sce') //linking incremental // - chamada a dassl y=dassl([y0,yd0],0,t,'chemres','chemjac');
| << dasrt | Equações Diferenciais | feval >> |