Please note that the recommended version of Scilab is 2026.0.0. This page might be outdated.
See the recommended documentation of this function
ode
Solucionador de equações diferenciais ordinárias
Seqüência de Chamamento
y=ode(y0,t0,t,f) [y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw]) [y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw]) y=ode("discrete",y0,k0,kvect,f)
Parâmetros
- y0
matriz ou vetor de reais (condições iniciais).
- t0
escalar real (tempo inicial).
- t
vetor de reais (tempos nos quais a solução é computada).
- f
função externa (função, lista ou string).
- type
um dos strings seguintes:
"adams" "stiff" "rk" "rkf" "fix" "discrete" "roots"- rtol,atol
constantes reais ou vetores com o mesmo tamanho que
y.- jac
função externa (função, lista ou string).
- w,iw
vetores de reais
- ng
inteiro
- g
função externa (função, lista ou string).
- k0
inteiro (tempo inicial).
- kvect
vetor de inteiros.
Descrição
ode é a função padrão para se resolver sistemas
de EDO explícitos definidos por: dy/dt=f(t,y) , y(t0)=y0. É uma interface
entre vários solucionadores, em particular a ODEPACK. O tipo de problema
resolvido e o método a ser utilizado dependem do primeiro argumento
opcional type que pode ser um dos strings
seguintes:
- <not given>:
O lsoda, solucionador do pacote ODEPACK é chamado por padrão. Ele escolhe automaticamente entre o método preditor-corretor não-rígido de Adams e a Fórmula de Diferenciação Retroativa (FDR) rígida. Ele utiliza o método não rígido inicialmente e monitora os dados para decidir qual método utilizar.- "adams":
Este é para problemas não rígidos. O solucionador
lsodedo pacote ODEPACK é chamado e utiliza o método de Adams.- "stiff":
Este é para problemas rígidos. O solucionador
lsodedo pacote ODEPACK é chamado e é utilizado o método FDR.- "rk":
Método adaptativo de Runge-Kutta de ordem 4 (RK4).
- "rkf":
O programa de Shampine e Watts baseado no par Runge-Kutta de Fehlberg de ordem 4 e 5 (RKF45) é utilizado. Este é utilizado para problemas não-rígidos e mediamente rígidos quando as computações de derivação não são custosas. Este método não é recomendado ser utilizado quando o usuário requer uma maior precisão.
- "fix":
Mesmo solucionador que "rkf", mas a interface do usuário é bem simples, i.e. apenas os parâmetros
rtoleatolpodem ser passados ao solucionador. Este é o método mais simples a se tentar.- "root":
Solucionador de EDOs com capacidade de encontrar raízes. O solucionador
lsodardo pacote ODEPACK é utilizado. É uma variante do solucionadorlsodaonde se acha raízes de uma dada função vetorial. Ver ajuda em ode_root para mais detalhes.- "discrete":
Simulação de tempo discreto. Ver ajuda em ode_discrete para mais detalhes.
Nesta ajuda podemos apenas descrever o uso de ode
para sistemas padrões explícitos EDOs .
A chamada mais simples a
odeé:y=ode(y0,t0,t,f)ondey0é o vetor de condições iniciais,t0é o tempo inicial,té o vetor de tempos onde a soluçãoyé computada eyé a matriz de vetores soluçõesy=[y(t(1)),y(t(2)),...].O argumento de entrada
fdefine o lado direito da equação diferencial de primeira ordem: dy/dt=f(t,y). É uma função externa, isto é, uma função com sintaxe especificada, ou o nome de uma subrotina Fortran ou uma subfunção C (string) com seqüência de chamamento especificada, ou uma lista:Se
ffor uma função do Scilab, a sua sintaxe deve serydot = f(t,y), ondeté um escalar real (tempo) eyé um vetor de reais (estado).ydoté um vetor de reais (dy/dt)Se
fé um string ele se refere ao nome de uma subrotina Fortran ou uma subfunção C, i.e. Seode(y0,t0,t,"fex")for o comando, então a subrotinafexserá chamada.A rotina Fortran deve ter a seguinte seqüência de chamamento:
fex(n,t,y,ydot), com n um inteiro, t um escalar de dupla precisão, y e ydot vetores de dupla precisão.A função C deve ter o seguinte protótipo:
fex(int *n,double *t,double *y,double *ydot)té o tempo,yo estado eydota derivada do estado (dy/dt)Esta função externa pode ser construída em um SO de modo indpendente através de ilib_for_link e ligada dinamicamente através da função do Scilab link.
O argumento
ftambém pode ser uma lista com a seguinte estrutura:lst=list(realf,u1,u2,...un)onderealfé uma função do Scilab com a sintaxe:ydot = f(t,y,u1,u2,...,un)Esta sintaxe permite utilizar parâmetros como argumentos de
realf.
A função
fpode retornar uma matrizp x qao invés de um vetor. Com esta notação de matriz, nos resolvemos o sisteman=p+qde EDOsdY/dt=F(t,Y)ondeYé uma matrizp x qmatrix. Então, as condições iniciais,Y0, também devem ser uma matrizp x qe o resultado deodeé a matrizp x q(T+1)[Y(t_0),Y(t_1),...,Y(t_T)].Argumentos de entrada opcionais podem ser fornecidos para o erro da solução:
rtoleatolsão limiares para os erros relativos e absolutos estimados. O erro estimado emy(i)é:rtol(i)*abs(y(i))+atol(i)e uma intergração é feita enquanto este erro é pequeno para todos os componentes do estado. Se
rtole/ouatolfor uma constantertol(i)e/ouatol(i)são ajustados para esta constante. Os valores padrões parartoleatolsão respectivamentertol=1.d-5eatol=1.d-7para a maior parte dos solucionadoresrtol=1.d-3eatol=1.d-4para"rfk"e"fix".Para problemas rígidos, é melhor fornecer o Jacobiano da função do lado direito da equação como o argumento opcional
jac. É uma função externa, istoé i.e. uma função com sintaxe especificada, ou o nome de uma subrotina Fortran ou uma subfunção C (string) com seqüência de chamamento especificada, ou uma lista.Se
jacfor uma função, a sintaxe deve serJ=jac(t,y)onde
té um escalar real (tempo),yé um vetor de reais (estado). A matriz resultanteJdeve fornecer df/dx i.e.J(k,i) = dfk/dxicomfk= k-ésimo componente de f.Se
jacfor um sting, ele se refere a uma subrotina Fortran, ou uma subfunção C, com as seguinte seqüência de chamamento:No caso Fortran:
subroutine fex(n,t,y,ml,mu,J,nrpd) integer n,ml,mu,nrpd double precision t,y(*),J(*)
No caso C:
jac(n,t,y,ml,mu,J,nrpd). Na maior parte dos casos, você não tem que se referir aml,muenrpd.Se
jacfor uma lista, as mesmas convenções que parafse aplicam.Os argumentos opcionais
weiwe vetores para armazenamento de informações podem ser retornados pela rotina de integração (ver ode_optional_output para detalhes). Queando esses vetores são fornecidos no lado direito deode, a integração reinicia com os mesmos parâmetros da parada anteiror.Mais opções podem ser fornecidas a solucionadores ODEPACK utilizando-se a variável
%ODEOPTIONS. Ver odeoptions.
Exemplos
// ---------- EDO simples de uma dimensão (função externa do Scilab) // dy/dt=y^2-y sin(t)+cos(t), y(0)=0 function ydot=f(t, y),ydot=y^2-y*sin(t)+cos(t),endfunction y0=0;t0=0;t=0:0.1:%pi; y=ode(y0,t0,t,f) plot(t,y) // ---------- EDO simples de uma dimensão (função externa codificada em C) ccode=['#include <math.h>' 'void myode(int *n,double *t,double *y,double *ydot)' '{' ' ydot[0]=y[0]*y[0]-y[0]*sin(*t)+cos(*t);' '}'] mputl(ccode,TMPDIR+'/myode.c') //criando o arquivo C ilib_for_link('myode','myode.c',[],'c',TMPDIR+'/Makefile',TMPDIR+'/loader.sce');//compilando exec(TMPDIR+'/loader.sce') //linking incremental y0=0;t0=0;t=0:0.1:%pi; y=ode(y0,t0,t,'myode'); // ---------- Simulação de dx/dt = A x(t) + B u(t) com u(t)=sin(omega*t), // x0=[1;0] // solução x(t) desejada em t=0.1, 0.2, 0.5 ,1. // A e a função u são passados para a função do lado direito em uma lista. // B e omega são passados como variáveis globais function xdot=linear(t, x, A, u),xdot=A*x+B*u(t),endfunction function ut=u(t),ut=sin(omega*t),endfunction A=[1 1;0 2];B=[1;1];omega=5; ode([1;0],0,[0.1,0.2,0.5,1],list(linear,A,u)) // ---------- Integração com notação matricial da equação diferencial de Ricatti // Xdot=A'*X + X*A - X'*B*X + C , X(0)=Identity // Solução em t=[1,2] function Xdot=ric(t, X),Xdot=A'*X+X*A-X'*B*X+C,endfunction A=[1,1;0,2]; B=[1,0;0,1]; C=[1,0;0,1]; t0=0;t=0:0.1:%pi; X=ode(eye(A),0,t,ric) // ---------- Notação matricial, computação de exp(A) A=[1,1;0,2]; function xdot=f(t, x),xdot=A*x;,endfunction ode(eye(A),0,1,f) ode("adams",eye(A),0,1,f) // ---------- Notação de matriz, computação de exp(A) com matriz rígida, Jacobian fornecida A=[10,0;0,-1]; function xdot=f(t, x),xdot=A*x,endfunction function J=Jacobian(t, y),J=A,endfunction ode("stiff",[0;1],0,1,f,Jacobian)
Ver Também
- ode_discrete — solucionador de equações diferenciais ordinárias, simulação de tempo discreto
- ode_root — solucionador de EDOs com busca de raízes
- dassl — Equação diferencial algébrica
- impl — equações diferenciais algébricas
- odedc — solucionador de EDOs contínuas/discretas
- odeoptions — ajusta opções para solucionadores de EDO
- csim — simulation (time response) of linear system
- ltitr — discrete time response (state space)
- rtitr — discrete time response (transfer matrix)
Autor
- Alan C. Hindmarsh
, mathematics and statistics division, l-316 livermore, ca 94550.19
Bibliografia
Alan C. Hindmarsh, lsode and lsodi, two new initial value ordinary differential equation solvers, acm-signum newsletter, vol. 15, no. 4 (1980), pp. 10-11.
Funções Utilizadas
As rotinas associadas podem ser encontradas no diretório SCI/modules/differential_equations/src/fortran:
lsode.f lsoda.f lsodar.f
| << intl | Equações Diferenciais | ode_discrete >> |