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
x0ou[x0, xdot0], oùx0est la valeur de l'état au temps initialt0etxdot0est 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. Siatolest 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. Siatolest 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 + aaveca = 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 routinepjaca calculé et stocké danswpetiwp. 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/dydotpour une valeur donnée du paramètrecjet 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ùtest le temps auquel la solution à été calculée. Sinonyest le vecteur[x(t);xdot(t)].- rd
un vecteur à deux entrées
[times num]oùtimesest la valeur des temps auquel les surfaces sont traversées,numest 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
lsodidu package ODEPACK est appelé et utilise la méthode Adams.- "stiff":
Pour les problèmes rigides. Le solveur
lsodidu 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ù
resdoit retourner le résidu et le drapeau d'erreurires.ires = 0siresest bien parvenu à calculerr.ires = -1so le résidu est localement non-défini pourg(t, x, xdot).ires =-2si 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
resestr = res(t, y, ydot, p1, p2, ...)
resretourne 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é,
respeut ê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ù
test la valeur actuelle du tempsxest la valeur de l'étatxdotest la valeur de l'état dérivéresla valeur du résiduiresindicateur de complétionrparest un vecteur de paramètres nécéssaires mais non initialisables pardae.iparest un vecteur de paramètres entiers nécéssaires mais non initialisables pardae
Si le solveur adams ou stiff est utilisé,
respeut ê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ù
neqest le nombre d'équation du systèmetest la valeur actuelle du tempsxest la valeur de l'étatxdotest la valeur de l'état dérivéresla valeur du résiduiresindicateur 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
jacdoit retournerj = dg(t, x, xdot)/dy + cj * dg(t, x, xdot)/dxdot
où
cjest 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
jacestr = jac(t, x, xdot, cj, p1, p2, ...)
jacretourne toujoursdg/dx+cj*dg/dxdotcomme 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, iparont une définition similaire à celle ci-dessus,rest 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
jacdoit retourner le Jacobien der = g(t,y)-A(t,y)*ydotpar 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
jacestr = 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
surfaceestr = 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, iparont les mêmes définitions qu'au-dessus,ngest le nombre de surfaces,nxest la dimension de l'état etrest 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
addaestadda(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
ret 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
psolestpsol(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
wpetiwpdoivent 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
pjacestpjac(neq, t, y, ydot, h, cj, rewt, savr, x1, x2,...)
pjacretourne toujoursdg/dy + cj*dg/dydotcomme 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 >> |