dae
Solveur de système d'Equations Différentielles Algébriques
Séquence d'appel
y = dae(y0, t0, t, res) [y [,hd]] = dae(y0, t0, t [[,rtol], atol], res [,jac] [,hd]) [y, rd] = dae("root", y0, t0, t, res, ng, surface) [y, rd [,hd]] = dae("root", y0, t0, t [[,rtol], atol], res [,jac], ng, surface [,hd]) [y, rd] = dae("root2", y0, t0, t, res, ng, surface) [y, rd [,hd]] = dae("root2", y0, t0, t [[,rtol], atol], res [,jac], ng, surface [, psol, pjac] [, hd]) y = dae("stiff"|"adams", y0, t0, t, res, adda) [y [,hd]] = dae("stiff"|"adams", y0, t0, t [[,rtol], atol], res [,jac], adda [,hd])
Paramètres
- y0
vecteur colonne ou matrix. Peut valoir
x0
ou[x0, xdot0]
, oùx0
est la valeur de l'état au temps initialt0
etxdot0
est la valeur (ou une estimation) de l'état dérivé au temps initial (voir ci-après).- t0
réel, le temps initial.
- t
scalaire ou vecteur réel. Les instants auxquels la solution est voulue. La solution peut s'obtenir à chaque étape de dae en initialisant
%DAEOPTIONS(2)=1
.- rtol
un scalaire ou vecteur colonne réel de même taille que
x0
, la tolérance relative de la solution. Siatol
est un vecteur, les tolérances sont spécifiées pour chaque composante de l'état.- atol
un scalaire ou vecteur colonne réel de même taille que
x0
, la tolérance absolue de la solution. Siatol
est un vecteur, les tolérances sont spécifiées pour chaque composante de l'état.- res
une fonction external, calcule la valeur de
g(t, y, ydot)
. Peut être une fonction, liste ou chaîne de caractères. La syntaxe diffère en fonction du solveur utilisé. Pour plus d'informations, voir la section description "résidu".- jac
une fonction external, calcule la valeur Jacobien de la fonction
g(t, y, ydot)
. Elle peut être une fonction, liste ou chaîne de caractères. La syntaxe diffère en fonction du solveur utlisé. Pour plus de détails, voir la section ci-dessous "decription jacobien"- surface
une fonction external (fonction, liste ou chaîne de caratères), calcule a valeur du vecteur colonne
surface(t,x)
àng
éléments. Chaque élément définit une surface. Utilisée uniquement avec les solveurs dasrt ("root") and daskr ("root2"). Pour plus d'informations, voir la section "description surface"- adda
une fonction external (fonction, liste ou chaîne de caratères), calcule
p = p + a
aveca = a(t,y)
. Utilisée uniquement avec les solveurs stiff and adams. Pour plus d'informations, voir la section "description adda".- psol
external (fonction, liste ou chaîne de caractères). Utilisée uniquement avec le solveur "root2" (daskr). Résout le système linéaire
P*x=b
, avec P le préconditionneur factorisé que la routinepjac
a calculé et stocké danswp
etiwp
. Voir la section de description de psol pour plus de détails.- pjac
external (fonction, liste ou chaîne de caractères). Utilisée uniquement avec le solveur "root2" (daskr). Calcule la valeur de
dg/dy + cj*dg/dydot
pour une valeur donnée du paramètrecj
et la factorise en LU dans deux tableaux, réel et entier. Voir la section de description de pjac pour plus de détails.- y
matrice réelle. Si
%DAEOPTIONS(2)=1
, chaque colonne est le vecteur[t;x(t);xdot(t)]
oùt
est le temps auquel la solution à été calculée. Sinony
est le vecteur[x(t);xdot(t)]
.- rd
un vecteur à deux entrées
[times num]
oùtimes
est la valeur des temps auquel les surfaces sont traversées,num
est le nombre de surfaces traversées.- hd
vecteur réel, stocke en sortie le contexte de
dae
. Peut être utilisé comme paramètre d'entrée pour reprendre l'intégration (reprise à chaud).
Description
La fonction dae
résout l'équation différentielle algébrique et renvoie l'évolution
de y à des moments donnés
g(t, x, xdot) = 0 x(t0) = x0 and xdot(t0) = xdot0
Si xdot0
n'est pas donné en paramètre initial,
dae
tente de la calculer en résolvant
g(t,x0,xdot0)=0
.
Si xdot0
est donné en paramètre initial, il peut soit
satifaire g(t,x0,xdot0)=0
, soit en être une approximation.
Dans le dernier cas,
%DAEOPTIONS(7) doit être initialisé à 1.
Les solveurs
Le type de problème résolu et la méthode utilisée dépendent de la valeur du
premier argument optionnel type
qui peut être l'une des
chaînes suivantes :
- <non donné>:
le solveur dassl.
- "root":
le solveur dasrt. Voir l'aide dae_root pour plus de détails.
- "root2":
le solveur daskr. Voir l'aide dae_root pour plus de détails.
- "adams":
Pour les problèmes non rigides. Le solveur
lsodi
du package ODEPACK est appelé et utilise la méthode Adams.- "stiff":
Pour les problèmes rigides. Le solveur
lsodi
du package ODEPACK est appelé et utilise la méthode BDF.
Fonction résidu
L'argument d'entrée res
retourne le résidu du DAE. C'est un
external c'est-à-dire soit une fonction avec une syntaxe
spécifique, soit un nom de la fonction Fortran ou C, soit une liste. La séquence d'appel de la fonction
diffère selon le solveur utilisé quand res
est une chaîne de caractère.
- une fonction Scilab
Dans ce cas, la séquence d'appel doit être
[r, ires] = res(t, y, ydot)
où
res
doit retourner le résidu et le drapeau d'erreurires
.ires = 0
sires
est bien parvenu à calculerr
.ires = -1
so le résidu est localement non-défini pourg(t, x, xdot)
.ires =-2
si les paramètres sont hors de la plage admissible.Si le solveur adams ou stiff est utilisé, cette fonction doit retourner
r = g(t,y)-A(t,y)*ydot
- une liste
Cette forme permet de passer des paramètres à la fonction. Elle doit se présenter comme suit:
list(res, p1, p2, ...)
où la séquence d'appel de la fonction
res
estr = res(t, y, ydot, p1, p2, ...)
res
retourne toujours le résidu comme fonction de(t, x, xdot, x1, x2, ...)
, etp1, p2,...
sont des paramètres de la fonction.- une chaîne de caractère
Elle doit se référer au nom d'une routine C ou Fortran. En fonction du solveur, la séquence d'appel est différente. Supposant que <
r_name
> est le nom donné,Si le solveur dassl, dasrt ("root") ou daskr ("root2") est utilisé,
res
peut êtreLa séquence d'appel en Fortran doit être
subroutine <r_name>(t, x, xdot, res, ires, rpar, ipar) double precision t, x(*), xdot(*), res(*), rpar(*) integer ires, ipar(*)
La séquence d'appel en C doit être
où
t
est la valeur actuelle du tempsx
est la valeur de l'étatxdot
est la valeur de l'état dérivéres
la valeur du résiduires
indicateur de complétionrpar
est un vecteur de paramètres nécéssaires mais non initialisables pardae
.ipar
est un vecteur de paramètres entiers nécéssaires mais non initialisables pardae
Si le solveur adams ou stiff est utilisé,
res
peut êtreLa séquence d'appel en Fortran doit être
subroutine <r_name>(neq, t, x, xdot, res, ires) double precision t, x(*), xdot(*), res(*) integer neq, ipar(*)
La séquence d'appel en C doit être
où
neq
est le nombre d'équation du systèmet
est la valeur actuelle du tempsx
est la valeur de l'étatxdot
est la valeur de l'état dérivéres
la valeur du résiduires
indicateur de complétion
La fonction jacobienne
L'arugment d'entrée jac
calcule le jacobien. Comme res
, jac
est un external c'est-à-dire soit une fonction avec une syntaxe
spécifique, soit un nom de la fonction Fortran ou C, soit une liste. La séquence d'appel de la fonction
diffère selon le solveur utilisé.
Si le solveur dassl, dasrt ("root") ou
daskr ("root2") est utilisé, jac
calcule la valeur de
dg/dx + cj * dg/dxdot
pour une valeur donnée du paramètre cj
. Elle
peut être
- une fonction Scilab
Dans ce cas, sa séquence d'appel doit être
j = jac(t, y, ydot, cj)
où la fonction
jac
doit retournerj = dg(t, x, xdot)/dy + cj * dg(t, x, xdot)/dxdot
où
cj
est une réel scalaire.- une liste
Cette forme d'external sert à p asser des paramètres à la fonction. Elle doit se présenter comme suit::
list(jac, p1, p2, ...)
où la séquence d'appel de la fonction
jac
estr = jac(t, x, xdot, cj, p1, p2, ...)
jac
retourne toujoursdg/dx+cj*dg/dxdot
comme fonction de(t,x,xdot,cj,p1,p2,...)
.- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran. Supposant que <
j_name
> est le nom donné,La séquence d'appel en Fortran doit être
subroutine <j_name>(t, x, xdot, r, cj, ires, rpar, ipar) double precision t, x(*), xdot(*), r(*), cj, rpar(*) integer ires, ipar(*)
La séquence d'appel en C doit être
où
t, x, xdot, ires, rpar, ipar
ont une définition similaire à celle ci-dessus,r
est le tableau de résultats.
Pour les solveurs adams et
stiff, jac
peut être
- une fonction Scilab
Dans ce cas, sa séquence d'appel doit être
j = jac(t, y, ydot)
où la fonction
jac
doit retourner le Jacobien der = g(t,y)-A(t,y)*ydot
par rapport à y.- une liste
Cette forme d'external sert à passer des paramètres à la fonction. Elle doit se présenter comme suit::
list(jac, p1, p2, ...)
où la séquence d'appel de la fonction
jac
estr = jac(t, y, ydot, p1, p2, ...)
- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran. Supposant que <
j_name
> est le nom donné,La séquence d'appel en Fortran doit être
subroutine <j_name>(neq, t, x, xdot, ml, mu, j, nrpd) double precision t, x(*), xdot(*), j(*) integer neq, ml, mu, nrpd
La séquence d'appel en C doit être
la fonction surface
L'argument d'entrée surface
, utilisé seulement avec les solveurs
dassl,
dasrt ("root") et
daskr ("root2"), calcule la valeur du vecteur colonne
surface(t,x)
avec ng
éléments. Chaque élément définit une surface. Comme res
,
surface
est une fonction external qui peut être
- une fonction Scilab
Sa séquence d'appel doit être
r=surface(t,x)
cette fonction doit retourner un vecteur colonne à
ng
éléments.- une liste
Cette forme d'external est utilisée pour passer des paramètres à la fonction. Elle doit se présenter comme suit:
list(surface,p1,p2,...)
où la séquence d'appel de la fonction
surface
estr = surface(t,x,p1,p2,...)
- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran. Supposant que <s_name> est le nom donné,
La séquence d'appel en Fortran doit être
subroutine <s_name>(nx, t, x, ng, r, rpar, ipar) double precision t, x(*), r(*), rpar(*) integer nx, ng,ipar(*)
La séquence d'appel en C doit être
où
t, x, rpar, ipar
ont les mêmes définitions qu'au-dessus,ng
est le nombre de surfaces,nx
est la dimension de l'état etr
est le vecteur résultat.
la fonction adda
l'argument d'entrée adda
, utilisé uniquement avec les solveurs
adams et
stiff, calcule r = A(t,y) + p où p est une matrice à ajouter à A(t,y).
Comme res
, adda
est une fonction external. Elle peut être
- une fonction Scilab
Sa séquence d'appel doit être
r=adda(t, y, p)
- une liste
Cette forme d'external sert à passer des paramètres à la fonction. Elle doit se présenter comme suit:
list(adda,p1,p2,...)
où la séquence d'appel de la fonction
adda
estadda(t,x,p1,p2,...)
- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran. Supposant que <a_name> est le nom donné,
La séquence d'appel en Fortran doit être
subroutine <a_name>(nx, t, x, ml, mu, p, nrpd) double precision t, x(*), p(*) integer nx, ml, mu, nrpd
La séquence d'appel en C doit être
Dans la plupart des cas, vous n'êtes pas obligé de référer ml, mu and nrpd.
la function psol
L'argument d'entrée psol
, utilisé uniquement avec le solveur
daskr, résout le système linéaire
P*x = b
Comme res
, psol
est une fonction external. Elle peut être
- une fonction Scilab
Sa séquence d'appel doit être
[r, ier] = psol(wp, iwp, b)
et doit renvoyer la solution du système dans
r
et l'indicateur d'erreurier
.- une liste
Cette forme d'external sert à passer des paramètres à la fonction. Elle doit se présenter comme suit:
list(psol,p1,p2,...)
où la séquence d'appel de la fonction
psol
estpsol(wp, iwp, b, x1, x2, ...)
- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran
La séquence d'appel en Fortran doit être
subroutine psol (neq, t, y, ydot, savr, wk, cj, wght, wp, iwp, b, eplin, ier, rpar, ipar) double precision t,y(*), ydot(*), savr(*), wk(*), cj, wght(*), wp(*), b(*), eplin, rpar(*) integer neq, iwp(*), ier, ipar(*)
La séquence d'appel en C doit être
la fonction pjac
L'arugment d'entrée pjac
, utilisé uniquement avec le solveur
daskr, calcule la valeur de
dg/dy + cj*dg/dydot
pour une valeur donnée du paramètre
cj
et le factorise(LU) en deux vecteurs, réel et entier.
Comme res
, psol
est une fonction external. Elle peut être
- une fonction Scilab
Sa séquence d'appel doit être
[wp, iwp, ires] = pjac(neq, t, y, ydot, h, cj, rewt, savr)
les vecteurs
wp
etiwp
doivent contenir toutes les informations pondérées sur le préconditionneur.- une liste
Elle doit se présenter comme suit:
list(pjac, x1, x2,...)
où la séquence d'appel de la fonction
pjac
estpjac(neq, t, y, ydot, h, cj, rewt, savr, x1, x2,...)
pjac
retourne toujoursdg/dy + cj*dg/dydot
comme fonction de(neq, t, y, ydot, h, cj, rewt, savr, x1, x2, ...)
.- une chaîne de caractères
Elle doit se référer au nom d'une routine C ou Fortran
La séquence d'appel en Fortran doit être
subroutine pjac (res, ires, neq, t, y, ydot, rewt, savr, wk, h, cj, wp, iwp, ier, rpar, ipar) double precision res(*), t, y(*), ydot(*), rewt(*), savr(*), wk(*), h, cj, wp(*), rpar(*) integer ires, neq, iwp(*), ier, ipar(*)
La séquence d'appel en C doit être
Exemples
Exemple #1: dassl (pas de traversée de surface)
// Exemple avec du code Scilab //-------------------------------------------------- function [r, ires]=chemres(t, y, yd) r(1) = -0.04*y(1) + 1d4*y(2)*y(3) - yd(1); r(2) = 0.04*y(1) - 1d4*y(2)*y(3) - 3d7*y(2)*y(2) - yd(2); r(3) = 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 x0 = [1; 0; 0]; xd0 = [-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 = dae([x0, xd0], 0, t, chemres); // Retourne les points d'observation demandés %DAEOPTIONS = list([], 1, [], [], [], 0, 0); // Demande à dae les points à retourner y = dae([x0, xd0], 0, 4d10, chemres); // Sans jacobian y = dae([x0, xd0], 0, 4d10, chemres, chemjac); // Avec jacobien
Exemple #2: utilise le solveur dasrt avec "root"
// Exemple avec du code C (compilateur C requis) //-------------------------------------------------- bOK = haveacompiler(); if bOK <> %t [btn] = messagebox(["Vous avez besoin d''un compilateur C pour cet exemple."; "Arrêt de l''exécution."], "Problème de Software", "info"); return end //-1- Crée les codes C dans TMPDIR - équation de Vanderpol, forme implicite code = ['#include <math.h>' 'void res22(double *t, double *y, double *yd, double *res, int *ires, double *rpar, int *ipar)' '{res[0] = yd[0] - y[1];' ' res[1] = yd[1] - (100.0*(1.0 - y[0]*y[0])*y[1] - y[0]);}' ' ' 'void jac22(double *t, double *y, double *yd, double *pd, double *cj, double *rpar, int *ipar)' '{pd[0] = *cj - 0.0;' ' pd[1] = - (-200.0*y[0]*y[1] - 1.0);' ' pd[2] = - 1.0;' ' pd[3] = *cj - (100.0*(1.0 - y[0]*y[0]));}' ' ' 'void gr22(int *neq, double *t, double *y, int *ng, double *groot, double *rpar, int *ipar)' '{ groot[0] = y[0];}'] previous_dir = pwd(); cd TMPDIR; mputl(code, 't22.c') //-2- Compile et charge ilib_for_link(['res22' 'jac22' 'gr22'], 't22.c', [], 'c', [], 't22loader.sce'); exec('t22loader.sce') //-3- Exécute rtol = [1.d-6; 1.d-6]; atol = [1.d-6; 1.d-4]; t0 = 0; t = [20:20:200]; y0 = [2; 0]; y0d = [0; -2]; ng = 1; // Simulation simple t = 0:0.003:300; yy = dae([y0, y0d], t0, t, atol, rtol, 'res22', 'jac22'); clf(); plot(yy(1, :), yy(2, :)) // Trouve le premier point où yy(1) = 0 [yy, nn, hotd] = dae("root", [y0, y0d], t0, 300, atol, rtol, 'res22', 'jac22', ng, 'gr22'); plot(yy(1, 1), yy(2, 1), 'r+') xstring(yy(1, 1)+0.1, yy(2, 1), string(nn(1))); // Reprise à chaud pour le point suivant t01 = nn(1); [pp, qq] = size(yy); y01 = yy(2:3, qq); y0d1 = yy(3:4, qq); [yy, nn, hotd] = dae("root", [y01, y0d1], t01, 300, atol, rtol, 'res22', 'jac22', ng, 'gr22', hotd); plot(yy(1, 1), yy(2, 1), 'r+') xstring(yy(1, 1)+0.1, yy(2, 1), string(nn(1))); cd(previous_dir);
Exemple #3: utilise le solveur daskr avec le mot-clé "root2", avec les routines 'psol' et 'pjac' par défaut
// Exemple avec du code C (compilateur C requis) //-------------------------------------------------- bOK = haveacompiler(); if bOK <> %t [btn] = messagebox(["Vous avez besoin d''un compilateur C pour cet exemple."; "Arrêt de l''exécution."], "Problème de Software", "info"); return end //-1- Crée les codes C dans TMPDIR - équation de Vanderpol, forme implicite code = ['#include <math.h>' 'void res22(double *t, double *y, double *yd, double *res, int *ires, double *rpar, int *ipar)' '{res[0] = yd[0] - y[1];' ' res[1] = yd[1] - (100.0*(1.0 - y[0]*y[0])*y[1] - y[0]);}' ' ' 'void jac22(double *t, double *y, double *yd, double *pd, double *cj, double *rpar, int *ipar)' '{pd[0] = *cj - 0.0;' ' pd[1] = - (-200.0*y[0]*y[1] - 1.0);' ' pd[2] = - 1.0;' ' pd[3] = *cj - (100.0*(1.0 - y[0]*y[0]));}' ' ' 'void gr22(int *neq, double *t, double *y, double *yd, int *ng, double *groot, double *rpar, int *ipar)' '{ groot[0] = y[0];}'] previous_dir = pwd(); cd TMPDIR; mputl(code, 't22.c') //-2- Compile et charge ilib_for_link(['res22' 'jac22' 'gr22'], 't22.c', [], 'c', [], 't22loader.sce'); exec('t22loader.sce') //-3- Exécute rtol = [1.d-6; 1.d-6]; atol = [1.d-6; 1.d-4]; t0 = 0; t = [20:20:200]; y0 = [2; 0]; y0d = [0; -2]; ng = 1; // Simulation simple t = 0:0.003:300; yy = dae([y0, y0d], t0, t, atol, rtol, 'res22', 'jac22'); clf(); plot(yy(1, :), yy(2, :)) // Trouve le premier point où yy(1) = 0 %DAEOPTIONS = list([] , 0, [], [], [], 0, [], 1, [], 0, 1, [], [], 1); [yy, nn, hotd] = dae("root2", [y0, y0d], t0, 300, atol, rtol, 'res22', 'jac22', ng, 'gr22', 'psol1', 'pjac1'); plot(yy(1, 1), yy(2, 1), 'r+') xstring(yy(1, 1)+0.1, yy(2, 1), string(nn(1))); // Reprise à chaud pour le point suivant t01 = nn(1); [pp, qq] = size(yy); y01 = yy(2:3, qq); y0d1 = yy(3:4, qq); [yy, nn, hotd] = dae("root2", [y01, y0d1], t01, 300, atol, rtol, 'res22', 'jac22', ng, 'gr22', 'psol1', 'pjac1', hotd); plot(yy(1, 1), yy(2, 1), 'r+') xstring(yy(1, 1)+0.1, yy(2, 1), string(nn(1))); cd(previous_dir);
Exemple #4: utilise le solveur stiff
// Exemple avec le code Scilab //-------------------------------------------------- function [r, ires]=chemres(t, y, yd) r(1) = -0.04*y(1) + 1d4*y(2)*y(3) - yd(1); r(2) = 0.04*y(1) - 1d4*y(2)*y(3) - 3d7*y(2)*y(2) - yd(2); r(3) = y(1) + y(2) + y(3)-1; ires = 0; endfunction function j=chemjac(t, y, yd) j = [-0.04 , 1d4*y(3) , 1d4*y(2); 0.04 ,-1d4*y(3)-2*3d7*y(2) ,-1d4*y(2); 1 , 1 , 1 ] endfunction function p=addap(t, y, p) p(1,1) = p(1,1) + 1; p(2,2) = p(2,2) + 1; endfunction x0 = [1; 0; 0]; xd0 = [-0.04; 0.04; 0]; t = [1.d-5:0.02:.4, 0.41:.1:4, 40, 400]; y = dae("stiff", [x0, xd0], 0, 300, chemres, addap); y = dae("stiff", [x0, xd0], 0, 300, chemres, chemjac, addap); // avec le jacobien
Exemple #5: utilise le solveur stiff solver avec du code compilé
//-1- Crée les codes C dans TMPDIR code = ['#include <math.h>' 'void chemres(int *neq, double *t, double *y, double *s, double *res, int *ires, double *rpar, int *ipar)' '{res[0] = -0.040*y[0] + 1.0e4*y[1]*y[2] - s[0];' ' res[1] = 0.040*y[0] - 1.0e4*y[1]*y[2] - 3.0e7*y[1]*y[1] - s[1];' 'res[2] = y[0] + y[1] + y[2] - 1.0;}' ' ' 'void chemjac(double *t, double *y, double *s, double *ml, double *mu, double *p, int *nrowp)' '{p[0] = -0.04;' ' p[1] = 0.040;' ' p[2] = 1.0;' 'p[3] = 1.0e4*y[2];' ' p[4] = -1.0e4*y[2] - 6.0e7*y[1];' ' p[5] = 1.0;' 'p[6] = 1.0e4*y[1];' ' p[7] = -1.0e4*y[1];' ' p[8] = 1.0;}' ' ' 'void addap(int *neq, double *t, double *y, double *ml, double *mu, double *p, int *nrowp)' '{ p[0] = p[0] + 1.0;' 'p[4] = p[4] + 1.0;' '}'] mputl(code, fullfile(TMPDIR, 'mydae.c')) //-2- Compile et charge cd TMPDIR ilib_for_link(['chemres' 'chemjac' 'addap'], 'mydae.c', [], 'c', [], 'loader.sce'); exec('loader.sce') //-3- Simulation simple rtol = [1d-6; 1d-6; 1d-6]; atol = [1d-6; 1d-6; 1d-4]; t0 = 0; x0 = [1; 0; 0]; xd0 = [-0.04; 0.04; 0]; t = [1.d-5:0.02:.4, 0.41:.1:4, 40, 400]; y = dae("stiff", [x0, xd0], 0, t, rtol, atol, 'chemres', 'addap'); y = dae("stiff", [x0, xd0], 0, t, rtol, atol, 'chemres', 'chemjac', 'addap'); // With jacobian
Voir aussi
History
Version | Description |
2024.1.0 | dassl, dasrt and daskr deviennent des fonctions internes. |
2025.0.0 | impl devient une fonction interne. |
Report an issue | ||
<< bvode | Equations différentielles | dae_root >> |