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.
daskr
solveur de DAE avec traversées de zéros
Séquence d'appel
[r, nn [, hd]] = daskr(x0, t0, t [, atol [, rtol]], res [, jac], ng, surf [, info [, psol] [, pjac]] [, hd])
Paramètres
- x0
représente soit
y0(ydot0sera estimé pardaskravec zéro comme première estimation), soir la matrice[y0 ydot0].g(t, y0, ydot0)doit être égal à zéro. Si vous ne connaissez qu'une estimation deydot0, assignezinfo(7)=1.- y0
vecteur colonne réel des conditions initiales.
- ydot0
vecteur colonne réel de la dérivée en temps de
yàt0(peut être une estimation.
- t0
réel, temps initial.
- t
réel, scalaire ou vecteur. Temps auxquels la solution est désirée. Notez que vous pouvez obtenir la solution à chaque étape de daskr en fixant
info(2)=1.- atol, rtol
réels scalaires ou vecteurs colonnes de même taille que
you tous deux de taille1.atoletrtolreprésentent les tolérances d'erreur absolue et relative de la solution. Si ce sont des vecteurs, alors les tolérances sont spécifiées pour chaque composante dey.- res
external (fonction, liste ou chaîne de caractères). Calcule la valeur de
g(t, y, ydot). Elle peut être :Une fonction Scilab.
Sa séquence d'appel doit être
[r, ires] = res(t, y, ydot)et doit retourner le résidur = g(t, y, ydot)et un drapeau d'erreurires.ires = 0siresa correctement calculér,ires = -1si le résidu est localement non défini pour(t, y, ydot),ires = -2si des paramètres sont hors du champ admissible.Une liste.
Cette forme permet de passer des paramètres autres que t, y, ydot à la fonction. Elle doit se présenter comme suit :
list(res, x1, x2, ...)
où la séquence d'appel de la fonction
resest maintenantr = res(t, y, ydot, x1, x2, ...)
resretourne toujoursr = g(t, y, ydot)comme fonction de(t, y, ydot, x1, x2, ...).Attention : cette forme ne doit pas être utilisée s'il n'y pas d'argument additionnel à passer à la fonction.
Une chaîne de caractères.
Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab.
En C, la séquence d'appel doit être :
En Fortran, elle doit être :
subroutine res(t, y, yd, r, ires, rpar, ipar) double precision t, y(*), yd(*),r(*),rpar(*) integer ires, ipar(*)
Les tableaux
rparetipardoivent être présents mais ne peuvent pas être utilisés.
- jac
external (fonction, liste ou chaîne de caractères). Calcule la valeur de
dg/dy + cj*dg/dydotpour une valeur donnée du paramètrecj.Une fonction Scilab.
Sa séquence d'appel doit être
r = jac(t, y, ydot, cj)et doit retournerr = dg(t, y, ydot)/dy + cj*dg(t, y, ydot)/dydotoùcjest un scalaire réel.Une liste.
Elle doit se présenter comme suit :
list(jac, x1, x2, ...)
où la séquence d'appel de la fonction
jacest désormaisr=jac(t, y, ydot, cj, x1, x2,...)
jacretourne toujoursdg/dy + cj*dg/dydotcomme fonction de(t, y, ydot, cj, x1, x2,...).Une chaîne de caractères.
Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab.
En C, la séquence d'appel doit être :
En Fortran, elle doit être :
subroutine jac(t, y, yd, pd, cj, rpar, ipar) double precision t, y(*), yd(*), pd(*), cj, rpar(*) integer ipar(*)
- surf
external (fonction, liste ou chaîne de caractères). Calcule la valeur du vecteur colonne
surf(t, y)àngcomposantes. Chaque composante représente une surface. Elle doit être définie comme suit :Une fonction Scilab.
Sa séquence d'appel doit être
surf(t, y)Une liste.
Elle doit se présenter comme suit :
où la séquence d'appel de la fonction
surfest maintenantr = surf(t, y, x1, x2, ...)
Une chaîne de caractères.
Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab.
En C, la séquence d'appel doit être :
En Fortran, elle doit être :
- info
liste contenant
14éléments. La valeur par défaut estlist([], 0, [], [], [], 0, [], 0, [], 0, 0, [], [], 1).- info(1)
réel scalaire donnant le temps maximal pour lequel
gpeut être évalué ou une matrice vide[]si aucune limite de temps n'est imposée.- info(2)
drapeau indiquant si
daskrretourne ses valeurs intermédiaires calculées (= 1) ou seulement les temps indiqués par l'utilisateur (= 0).- info(3)
vecteur de deux éléments donnant la définition
[ml,mu]de la matrice bande calculeé parjac;r(i - j + ml + mu + 1,j) = "dg(i)/dy(j)+cj*dg(i)/dydot(j)". Sijacretourne une matrice pleine, fixerinfo(3)=[]. Inutile siinfo(8)=1.- info(4)
réel scalaire donnant la taille maximale du pas. Fixer
info(4)=[]si illimité.- info(5)
réel scalaire donnant le pas initial. Fixer
info(5)=[]si non spécifié.- info(6)
fixer
info(6)=1si la solution est non-négative, sinon fixerinfo(6)=0.- info(7)
si ydot0 est fixé tel que
g(t0, y0, ydot0) = 0, alors fixerinfo(7)=[]. Sinon, fixerinfo(7)=[+-1, ..., +-1], avecinfo(7)(i) = 1si y(i) est une variable différentielle etinfo(7)(i) = -1si y(i) est une variable algébrique (si ses dérivées n'apparaissent pas explicitement dans la fonction g(t, y, ydot)).- info(8)
méthode directe / Krylov. Fixer
info(8)=1et founrnir une routinepsolsi vous souhaitez que le solveur utilise des itérations de Krylov, sinon (méthode directe) fixerinfo(8)=0.- info(9)
paramètres de Krylov. Inutile si vous avez fixé
info(8)=0. Sinon, fixerinfo(9)=[]ouinfo(9)=[maxl kmp nrmax epli], où :- maxl = nombre maximal d'itérations de l'algorithme GMRes (par défaut
min(5, neq)),- kmp = nombre de vecteurs sur lesquels l'orthogonalisation est faite dans GMRes (par défaut maxl),
- nrmax = nombre maximal de redémarrages de GMRes par intération non-linéaire (par défaut
5),- epli = constante du test de convergence de GMRes (par défaut
0.05).- info(10)
conditions initiales. A ignorer si
info(7)=[]. Fixerinfo(10)=1si le solveur doit s'arrêter après le calcul des valeurs initiales, sinon fixerinfo(10)=0.- info(11)
routine pour le calcul et la factorisation LU du préconditionneur pour
psol. Inutile siinfo(8)=0. Fixerinfo(11)=1et fournir une routinepjacsi l'externalpsoldoit utiliser une routine spécifique, sinon fixerinfo(11)=0.- info(12)
si vous souhaitez contrôler l'erreur localement sur toutes les variables, fixez
info(12)=[]. Sinon, fixezinfo(12)=[+-1, ..., +-1], avecinfo(12)(i) = 1si y(i) est une variable différentielle etinfo(12)(i) = -1si y(i) est une variable algébrique (si ses dérivées n'apparaissent pas explicitement dans la fonction g(t, y, ydot)).- info(13)
paramètres heuristiques. Ignorer si
info(7)=[]. Sinon, fixerinfo(13)=[]ouinfo(13)=[mxnit mxnj mxnh lsoff stptol epinit], où :- mxnit = nombre maximal d'itérations de Newton par évaluation du préconditionneur (par défaut
5siinfo(8)=0,15sinon),- mxnj = nombre maximal d'évaluations du préconditionneur (par défaut
6siinfo(8)=0,2sinon),- mxnh = nombre maximal de valeurs artificielles du pas
hà tenter si info(7) ≠ [] (par défaut5),- lsoff = drapeau pour désactiver l'algorithme de recherche linéaire (lsoff = 0 pour activer, lsoff = 1 pour désactiver) (par défaut
0),- stptol = pas minimal (dimmensionné) dans l'algorithme de recherche linéaire (par défaut
(unit roundoff)^(2/3)),- epinit = facteur déterminant dans le test de convergence de l'itération Newton (par défaut
0.01).- info(14)
verbosité. Fixer
info(14)=1pour une information minimale,info(14)=2pour une information maximale, sinon fixerinfo(14)=0.
- psol
external (fonction, liste ou chaîne de caractères). Résout un système linéraire
P*x = b, où P est le préconditionneur LU-factorisé quepjaca calculé auparavant et stocké danswpetiwp.Une fonction Scilab.
Sa séquence d'appel doit être
[r, ier] = psol(wp, iwp, b)et doit retourner la solution du système dansret un drapeau d'erreurier.Une liste.
Elle doit se présenter comme suit :
list(psol, x1, x2, ...)
où la séquence d'appel de
psolestpsol(wp, iwp, b, x1, x2, ...)
psolretourne toujours la solution dansr.Une chaîne de caractères.
Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab
En C, la séquence d'appel doit être :
où les vecteursvoid psol (int*neq, double*t, double*y, double*ydot, double*savr, double*wk, double*cj, double*wght, double*wp, int*iwp, double*b, double*eplin, int*ier, double*rpar, int*ipar)
wpetiwpcontiennent le préconditionneur LU-factoriséP,wpreprésentant les valeurs etiwples pivots utilisés dans la factorisation.En Fortran, elle 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(*)
- pjac
external (fonction, liste ou chaîne de caractères). Calcule la valeur de
dg/dy + cj*dg/dydotpour une valeur donnée du paramètrecjet la LU-factorise en deux vecteurs, réel et entier.Une fonction Scilab.
Sa séquence d'appel doit être
[wp, iwp, ires] = pjac(neq, t, y, ydot, h, cj, rewt, savr)et en retour, les vecteurswpetiwpdoivent contenir toutes les informations du préconditionneur factorisé.Une liste.
Elle doit se présenter comme suit :
list(pjac, x1, x2, ...)
où la séquence d'appel de
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 fonction C ou une routine Fortran reliée à Scilab
En C, la séquence d'appel doit être :
void pjac (double*res, int*ires, int*neq, double*t, double*y, double*ydot, double*rewt, double*savr, double*wk, double*h, double*cj, double*wp, int*iwp, int*ier, double*rpar, int*ipar)
En Fortran, elle 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(*)
- hd
vecteur réel servant à stocker le contexte de
daskret reprendre l'intégration.- r
matrice réelle. Chaque colonne est le vecteur
[t; x(t); xdot(t)]oùtest l'indice en temps aulequel la solution a été calculée,x(t)est la valeur de la solution calculée,xdot(t)est la dérivée de la solution calculée.- nn
vecteur à deux entrées
[times num],timesest la valeur du temps auquel la surface est traversée,numest le nombre de surfaces traversées.
Description
Solution de l'équation différentielle implicite :
g(t, y, ydot) = 0 y(t0) = y0 et ydot(t0) = ydot0
Retourne les temps de traversée de surface et le nombre de surfaces traversées
dans nn.
Des exemples détaillés se trouvent dans SCI/modules/differential_equations/tests/unit_tests/daskr.tst
Exemples
// dy/dt = ((2*log(y)+8)/t-5)*y, y(1) = 1, 1 <= t <= 6 // g1 = ((2*log(y)+8)/t-5)*y // g2 = log(y) - 2.2491 y0 = 1; t = 2:6; t0 = 1; y0d = 3; atol = 1.d-6; rtol = 0; ng = 2; deff('[delta, ires] = res1(t, y, ydot)', 'ires = 0; delta = ydot-((2*log(y)+8)/t-5)*y') deff('[rts] = gr1(t, y)', 'rts = [((2*log(y)+8)/t-5)*y; log(y)-2.2491]') [yy, nn] = daskr([y0, y0d], t0, t, atol, rtol, res1, ng, gr1); nn // Retourne nn = [2.4698972 2]
Voir aussi
Historique
| Version | Description |
| 5.5.0 | daskr ajouté |
| Report an issue | ||
| << dae | Calcul différentiel, Intégration | feval >> |