ode
solveur d'équations différentielles ordinaires
Syntaxe
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)
Paramètres
- y0
vecteur ou matrice réelle (conditions initiales).
- t0
réel (instant initial).
- t
vecteur réel (instants où la solution est renvoyée).
- f
fonction externe (fonction Scilab ou chaîne de caractères ou liste).
- type
une des chaînes de caractères :
"adams","stiff","rk","rkf","fix","discrete","root"- atol, rtol
tolérances absolue et relative sur les valeurs de la solution
y(décimaux). Siatolourtolest un scalaire, sa valeur est utilisée pour chaque composante dey. Sinon, elle doit être un vecteur de taille size(y), et est appliquée aux composantes respectives dey.- jac
fonction externe (fonction Scilab, chaîne de caractères ou liste).
- ng
entier
- g
fonction externe (fonction Scilab, chaîne de caractères ou liste).
- k0
entier (instant initial).
- kvect
vecteur d'entiers.
- y
vecteur ou matrice réel: la solution.
- rd
vecteur de réels.
- w, iw
vecteurs de réels. Voir les options de sortie de ode().
Description
ode est la fonction utilisée pour approcher la
solution d'une équation différentielle ordinaire (EDO) explicite du
premier ordre en temps, définie par : dy/dt=f(t,y) , y(t0)=y0. Il s'agit
d'une interface vers diverses bibliothèques, en particulier ODEPACK. Le type
du problème et la méthode utilisée dépendent de la valeur du premier
argument optionnel type qui peut être égal à :
- <aucun> :
le solveur
lsodadu package ODEPACK est utilisé par défaut. Il choisit automatiquement entre un schéma prédicteur-correcteur d'Adams et un schéma adapté au systèmes raides (stiff) de type "Backward Differentiation Formula" (BDF). Initialement le schéma adapté aux système non raides est choisi puis la méthode adaptée est ensuite choisie dynamiquement.- "adams" :
Problèmes non raides. Le solveur
lsodedu package ODEPACK est utilisé (schéma d'Adams).- "stiff" :
Pour les systèmes raides. Le solveur
lsodedu package ODEPACK est utilisé avec le schéma BDF.- "rk" :
Schéma de Runge-Kutta adaptatif d'ordre 4 (RK4).
- "rkf" :
Formules de Shampine et Watts basées sur les paires de Runge-Kutta Fehlberg d'ordre 4 et 5 (RKF45). Bien pour les problèmes non raides ou moyennement raides, lorsque le calcul du second membre n'est pas trop coûteux. Cette méthode est à éviter si l'on recherche une très grande précision.
- "fix":
Identique à
"rkf", mais l'interface est simplifiée, i.e. uniquementrtoletatolsont communiqués au solveur.- "root":
Solveur d'EDO avec recherche de racines. Le solveur
lsodardu package ODEPACK est utilisé. C'est une variante delsodapermettant la recherche d'une racine d'une fonction vectorielle donnée. Voir ode_root pour plus de détails.- "discrete":
Simulation en temps discret. Voir ode_discrete pour plus de détails.
Ici on ne décrit l'usage de ode que pour des EDO
explicites.
L'appel le plus simple de
odeest du type :y=ode(y0,t0,t,f)oùy0est le vecteur des conditions initiales,t0est le temps initial, ettest le vecteur des instants où l'on veut une approximation de la solution.yest calculée etyest la matricey=[y(t(1)),y(t(2)),...].Le paramètre d'entrée
fdeodedéfinit le membre de droite de l'équation différentielle du premier ordre dy/dt=f(t,y). C'est un external qui peut être :Soit une fonction Scilab, sa syntaxe doit être
ydot = f(t,y)oùtest un scalaire (le temps),yun vecteur (l'état). Cette fonction renvoie le second membre de l'équation différentielle dy/dt=f(t,y).Soit une chaîne de caractères, elle désigne le nom d'une subroutine Fortran ou une procédure C, i.e. si
ode(y0,t0,t,"fex")est la commande, alors la procedurefexest appelée.Si c'est une subroutine Fortran, sa liste d'appel doit être
subroutine fex(n,t,y,ydot) integer n double precision t,y(*),ydot(*)
Si c'est une fonction C son prototype doit être:
void fex(int *n,double *t,double *y,double *ydot)
Cet external peut être compilé par l'utilitaire ilib_for_link et chargé dynamiquement par la fonction link.
Soit une liste avec la structure suivante
list(vrai_f,u1,u2,...un)oùvrai_fest une fonction avec la syntaxeydot = vrai_f(t,y,u1,u2,...,un)Cette syntaxe permet de passer des paramètres sous forme d'arguments supplémentaires de
vrai_f.
La fonction
fpeut renvoyer une matricep x qau lieu d'un vecteur. Dans ce cas, on résout le système d'EDOn=p+qdY/dt=F(t,Y)oùYest une matricep x q. La condition initialeY0doit aussi être une matricep x qmatrix et le résultat renvoyé parodeest la matrice:p x q(T+1)égale à[Y(t_0),Y(t_1),...,Y(t_T)].Des paramètres optionnels contrôlent la tolérance du schéma :
rtoletatolsont des valeurs seuil sur les erreurs estimées (relative et absolue) L'erreur estimée sury(i)estrtol(i)*abs(y(i))+atol(i)Si
rtolet/ouatolsont des constantesrtol(i)et/ouatol(i)prennent ces valeurs. Les valeurs par défaut dertoletatolsont respectivementrtol=1.d-5etatol=1.d-7pour la plupart des solveurs etrtol=1.d-3etatol=1.d-4pour"rfk"et"fix".Pour les problèmes raides, il est recommandé de fournir la jacobienne du second membre sous forme de l'argument optionnel
jac. Le paramètrejacdeodeest par exemple une fonction Scilab, dont la syntaxe est imposée, ou le nom d'une subroutine Fortran ou C (chaîne de caractères) ou une liste.Si
jacest une fonction Scilab sa syntaxe doit êtreJ=jac(t,y)où
test un scalaire (le temps) etyun vecteur (l'état). La matriceJdoit renvoyer df/dx i.e.J(k,i) = dfk /dxiavecfk= k-ième composante de f.Si
fest une chaîne de caractères, elle désigne le nom d'une subroutine Fortran ou C.En Fortran, Cette routine doit avoir la liste d'appel suivante :
subroutine fex(n,t,y,ml,mu,J,nrpd) integer n,ml,mu,nrpd double precision t,y(*),J(*)
Si c'est une fonction C son prototype doit être:
void fex(int *n,double *t,double *y,int *ml,int *mu,double *J,int *nrpd,)
Dans la plupart des cas il n'est pas nécessaire d'utiliser
ml,muetnrpd, qui sont relatifs à la possibilité de stockage "bande" du JacobienSi
jacest une liste, les mêmes conventions que pourfs'appliquent.Les arguments optionnels
wetiwsont des vecteurs dans lesquels le solveur stocke des informations sur son état (voir ode_optional_output pour plus de détails) . Lorsque ces paramêtres sont utilisés comme argument d'entrée, ils permettent de redémarrer l'intégration au point où elle s'était arrêtée à la sortie d'un appel précédent àode.Plus d'options peuvent être passées aux solveurs d'ODEPACK en utilisant la variable
%ODEOPTIONS. Voir odeoptions.
Exemples
// ---------- EDO Simple (external : fonction 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 Simple (external : code 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') //create the C file cd TMPDIR ilib_for_link('myode','myode.c',[],'c',[],'loader.sce');//compile exec('loader.sce') //incremental linking y0=0;t0=0;t=0:0.1:%pi; y=ode(y0,t0,t,'myode'); // ---------- Simulation de dx/dt = A x(t) + B u(t) avec u(t)=sin(omega*t), // x0=[1;0] // solution x(t) desired at t=0.1, 0.2, 0.5 ,1. // A and u function are passed to RHS function in a list. // B and omega are passed as global variables 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)) // ----------Integration de l'équation différentielle de Riccati (état matriciel) // Xdot=A'*X + X*A - X'*B*X + C , X(0)=Identity // Solution at 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) // ---------- Calcul de exp(A) (état matriciel) 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) // ---------- Calcul de exp(A) (état matriciel, cas raide, jacobien fourni) 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)
Voir aussi
- odeoptions — set options for ode solvers
- ode_optional_output — ode solvers optional outputs description
- ode_root — ordinary differential equation solver with roots finding
- ode_discrete — ordinary differential equation solver, discrete time simulation
- dae — Solveur de système d'Equations Différentielles Algébriques
- impl — differential algebraic equation
- odedc — discrete/continuous ode solver
- csim — simulation (time response) of linear system
- ltitr — discrete time response (state space)
- rtitr — discrete time response (transfer matrix)
- intg — intégration numérique adaptative
Bibliographie
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.
Fonctions Utilisées
Les sous-programmes associés se trouvent dans le répertoire SCI/modules/differential_equations/src/fortran/: lsode.f lsoda.f lsodar.f
| Report an issue | ||
| << numderivative | Equations différentielles | ode_discrete >> |