1 <?xml version="1.0" encoding="UTF-8"?>
3 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4 * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
6 * Copyright (C) 2012 - 2016 - Scilab Enterprises
8 * This file is hereby licensed under the terms of the GNU GPL v2.0,
9 * pursuant to article 5.3.4 of the CeCILL v.2.1.
10 * This file was originally licensed under the terms of the CeCILL v2.1,
11 * and continues to be available under such terms.
12 * For more information, see the COPYING file which you should have received
13 * along with this program.
16 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="daskr" xml:lang="fr">
18 <refname>daskr</refname>
19 <refpurpose>solveur de DAE avec traversées de zéros</refpurpose>
22 <title>Séquence d'appel</title>
23 <synopsis>[r, nn [, hd]] = daskr(x0, t0, t [, atol [, rtol]], res [, jac], ng, surf [, info [, psol] [, pjac]] [, hd])</synopsis>
26 <title>Paramètres</title>
32 représente soit <literal>y0</literal> (<literal>ydot0</literal> sera
33 estimé par <literal>daskr</literal> avec zéro comme première estimation),
34 soir la matrice <literal>[y0 ydot0]</literal>.
35 <literal>g(t, y0, ydot0)</literal> doit être égal à zéro. Si vous ne connaissez
36 qu'une estimation de <literal>ydot0</literal>, assignez
37 <literal>info(7)=1</literal>.
43 <para>vecteur colonne réel des conditions initiales.</para>
49 <para>vecteur colonne réel de la dérivée en temps de
50 <literal>y</literal> à <literal>t0</literal> (peut être une estimation.
60 <para>réel, temps initial.</para>
66 <para>réel, scalaire ou vecteur. Temps auxquels la solution est désirée.
67 Notez que vous pouvez obtenir la solution à chaque étape de daskr en fixant
68 <literal>info(2)=1</literal>.
73 <term>atol, rtol</term>
75 <para>réels scalaires ou vecteurs colonnes de même taille que
76 <literal>y</literal> ou tous deux de taille <literal>1</literal>. <literal>atol</literal> et <literal>rtol</literal> représentent
77 les tolérances d'erreur absolue et relative de la solution.
78 Si ce sont des vecteurs, alors les tolérances sont spécifiées pour chaque composante de
87 <link linkend="external">external</link> (fonction, liste ou chaîne de caractères).
89 <literal>g(t, y, ydot)</literal>. Elle peut être :
93 <para>Une fonction Scilab.</para>
94 <para>Sa séquence d'appel doit être
95 <literal>[r, ires] = res(t, y, ydot)</literal> et doit retourner le résidu
96 <literal>r = g(t, y, ydot)</literal> et un drapeau d'erreur
97 <literal>ires</literal>. <literal>ires = 0</literal> si
98 <literal>res</literal> a correctement calculé <literal>r</literal>,
99 <literal>ires = -1</literal> si le résidu est localement non défini pour
100 <literal>(t, y, ydot)</literal>, <literal>ires = -2</literal> si
101 des paramètres sont hors du champ admissible.
105 <para>Une liste.</para>
106 <para>Cette forme permet de passer des paramètres autres que t, y, ydot à la fonction.
107 Elle doit se présenter comme suit :
109 <programlisting role="no-scilab-exec"><![CDATA[
110 list(res, x1, x2, ...)
112 <para>où la séquence d'appel de la fonction
113 <literal>res</literal> est maintenant
115 <programlisting role="no-scilab-exec"><![CDATA[
116 r = res(t, y, ydot, x1, x2, ...)
119 <literal>res</literal> retourne toujours
120 <literal>r = g(t, y, ydot)</literal> comme fonction de
121 <literal>(t, y, ydot, x1, x2, ...)</literal>.
123 <para>Attention : cette forme ne doit pas être utilisée s'il n'y pas
124 d'argument additionnel à passer à la fonction.
128 <para>Une chaîne de caractères.</para>
129 <para>Elle doit se référer au nom d'une fonction C ou une routine Fortran
132 <para>En C, la séquence d'appel doit être :</para>
133 <programlisting role="no-scilab-exec"><![CDATA[
134 void res(double *t, double y[], double yd[], double r[],
135 int *ires, double rpar[], int ipar[])
137 <para>En Fortran, elle doit être :</para>
138 <programlisting role="no-scilab-exec"><![CDATA[
139 subroutine res(t, y, yd, r, ires, rpar, ipar)
140 double precision t, y(*), yd(*),r(*),rpar(*)
141 integer ires, ipar(*)
144 Les tableaux <literal>rpar</literal> et <literal>ipar</literal>
145 doivent être présents mais ne peuvent pas être utilisés.
155 <link linkend="external">external</link> (fonction, liste ou chaîne de caractères).
156 Calcule la valeur de <literal>dg/dy + cj*dg/dydot</literal> pour une valeur donnée du paramètre
157 <literal>cj</literal>.
161 <para>Une fonction Scilab.</para>
162 <para>Sa séquence d'appel doit être
163 <literal>r = jac(t, y, ydot, cj)</literal> et doit retourner
164 <literal>r = dg(t, y, ydot)/dy + cj*dg(t, y, ydot)/dydot</literal> où
165 <literal>cj</literal> est un scalaire réel.
169 <para>Une liste.</para>
170 <para>Elle doit se présenter comme suit :</para>
171 <programlisting role="no-scilab-exec"><![CDATA[
172 list(jac, x1, x2, ...)
174 <para>où la séquence d'appel de la fonction
175 <literal>jac</literal> est désormais
177 <programlisting role="no-scilab-exec"><![CDATA[
178 r=jac(t, y, ydot, cj, x1, x2,...)
181 <literal>jac</literal> retourne toujours
182 <literal>dg/dy + cj*dg/dydot</literal> comme fonction de
183 <literal>(t, y, ydot, cj, x1, x2,...)</literal>.
187 <para>Une chaîne de caractères.</para>
188 <para>Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab.
190 <para>En C, la séquence d'appel doit être :</para>
191 <programlisting role="no-scilab-exec"><![CDATA[
192 void jac(double *t, double y[], double yd[], double pd[],
193 double *cj, double rpar[], int ipar[])
195 <para>En Fortran, elle doit être :</para>
196 <programlisting role="no-scilab-exec"><![CDATA[
197 subroutine jac(t, y, yd, pd, cj, rpar, ipar)
198 double precision t, y(*), yd(*), pd(*), cj, rpar(*)
209 <link linkend="external">external</link> (fonction, liste ou chaîne de caractères).
210 Calcule la valeur du vecteur colonne <literal>surf(t, y)</literal> à
211 <literal>ng</literal> composantes. Chaque composante représente une surface.
212 Elle doit être définie comme suit :
216 <para>Une fonction Scilab.</para>
217 <para>Sa séquence d'appel doit être
218 <literal>surf(t, y)</literal>
222 <para>Une liste.</para>
223 <para>Elle doit se présenter comme suit :</para>
224 <programlisting role="no-scilab-exec"><![CDATA[
225 list(surf, x1, x2, ...)
227 <para>où la séquence d'appel de la fonction
228 <literal>surf</literal> est maintenant
230 <programlisting role="no-scilab-exec"><![CDATA[
231 r = surf(t, y, x1, x2, ...)
235 <para>Une chaîne de caractères.</para>
236 <para>Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab.
238 <para>En C, la séquence d'appel doit être :</para>
239 <programlisting role="no-scilab-exec"><![CDATA[
240 void surf(int *ny, double *t, double y[], int *ng, double gout[])
242 <para>En Fortran, elle doit être :</para>
243 <programlisting role="no-scilab-exec"><![CDATA[
244 subroutine surf(ny, t, y, ng, gout)
245 double precision t, y(*), gout(*)
256 liste contenant <literal>14</literal> éléments. La valeur par défaut est
257 <literal>list([], 0, [], [], [], 0, [], 0, [], 0, 0, [], [], 1)</literal>.
263 <para>réel scalaire donnant le temps maximal pour lequel
264 <literal>g</literal> peut être évalué ou une matrice vide
265 <literal>[]</literal> si aucune limite de temps n'est imposée.
273 drapeau indiquant si <literal>daskr</literal> retourne
274 ses valeurs intermédiaires calculées (<literal>= 1</literal>)
275 ou seulement les temps indiqués par l'utilisateur
276 (<literal>= 0</literal>).
284 vecteur de deux éléments donnant la définition
285 <literal>[ml,mu]</literal> de la matrice bande calculeé par
286 <literal>jac</literal>; <literal>r(i - j + ml + mu + 1,j) = "dg(i)/dy(j)+cj*dg(i)/dydot(j)"</literal>.
287 Si <literal>jac</literal> retourne une matrice pleine, fixer
288 <literal>info(3)=[]</literal>.
290 <literal>info(8)=1</literal>.
297 <para>réel scalaire donnant la taille maximale du pas. Fixer
298 <literal>info(4)=[]</literal> si illimité.
305 <para>réel scalaire donnant le pas initial. Fixer
306 <literal>info(5)=[]</literal> si non spécifié.
314 fixer <literal>info(6)=1</literal> si la solution est
315 non-négative, sinon fixer
316 <literal>info(6)=0</literal>.
324 si ydot0 est fixé tel que
325 <literal>g(t0, y0, ydot0) = 0</literal>, alors fixer
326 <literal>info(7)=[]</literal>. Sinon, fixer
327 <literal>info(7)=[+-1, ..., +-1]</literal>, avec
328 <literal>info(7)(i) = 1</literal> si y(i) est une variable différentielle et
329 <literal>info(7)(i) = -1</literal> si y(i) est une variable algébrique
330 (si ses dérivées n'apparaissent pas explicitement dans la fonction g(t, y, ydot)).
338 méthode directe / Krylov. Fixer <literal>info(8)=1</literal> et founrnir une routine <literal>psol</literal>
339 si vous souhaitez que le solveur utilise des itérations de Krylov, sinon (méthode directe) fixer
340 <literal>info(8)=0</literal>.
348 paramètres de Krylov. Inutile si vous avez fixé
349 <literal>info(8)=0</literal>. Sinon, fixer
350 <literal>info(9)=[]</literal> ou
351 <literal>info(9)=[maxl kmp nrmax epli]</literal>, où :
354 - maxl = nombre maximal d'itérations de l'algorithme GMRes (par défaut
355 <literal>min(5, neq)</literal>),
358 - kmp = nombre de vecteurs sur lesquels l'orthogonalisation est faite dans GMRes
362 - nrmax = nombre maximal de redémarrages de GMRes par intération non-linéaire
363 (par défaut <literal>5</literal>),
366 - epli = constante du test de convergence de GMRes (par défaut <literal>0.05</literal>).
371 <term>info(10)</term>
374 conditions initiales. A ignorer si
375 <literal>info(7)=[]</literal>. Fixer
376 <literal>info(10)=1</literal> si le solveur doit s'arrêter après
377 le calcul des valeurs initiales, sinon fixer
378 <literal>info(10)=0</literal>.
383 <term>info(11)</term>
386 routine pour le calcul et la factorisation LU du préconditionneur pour <literal>psol</literal>.
387 Inutile si <literal>info(8)=0</literal>. Fixer
388 <literal>info(11)=1</literal> et fournir une routine <literal>pjac</literal> si l'<link linkend="external">external</link>
389 <literal>psol</literal> doit utiliser une routine spécifique, sinon fixer
390 <literal>info(11)=0</literal>.
395 <term>info(12)</term>
398 si vous souhaitez contrôler l'erreur localement sur toutes les variables, fixez
399 <literal>info(12)=[]</literal>. Sinon, fixez
400 <literal>info(12)=[+-1, ..., +-1]</literal>, avec
401 <literal>info(12)(i) = 1</literal> si y(i) est une variable différentielle et
402 <literal>info(12)(i) = -1</literal> si y(i) est une variable algébrique
403 (si ses dérivées n'apparaissent pas explicitement dans la fonction g(t, y, ydot)).
408 <term>info(13)</term>
411 paramètres heuristiques. Ignorer si
412 <literal>info(7)=[]</literal>. Sinon, fixer
413 <literal>info(13)=[]</literal> ou
414 <literal>info(13)=[mxnit mxnj mxnh lsoff stptol epinit]</literal>, où :
417 - mxnit = nombre maximal d'itérations de Newton par évaluation du préconditionneur (par défaut
418 <literal>5</literal> si <literal>info(8)=0</literal>, <literal>15</literal> sinon),
421 - mxnj = nombre maximal d'évaluations du préconditionneur (par défaut
422 <literal>6</literal> si <literal>info(8)=0</literal>, <literal>2</literal> sinon),
425 - mxnh = nombre maximal de valeurs artificielles du pas <literal>h</literal> à tenter si info(7) ≠ [] (par défaut
426 <literal>5</literal>),
429 - lsoff = drapeau pour désactiver l'algorithme de recherche linéaire (lsoff = 0 pour activer, lsoff = 1 pour désactiver)
430 (par défaut <literal>0</literal>),
433 - stptol = pas minimal (dimmensionné) dans l'algorithme de recherche linéaire (par défaut <literal>(unit roundoff)^(2/3)</literal>),
436 - epinit = facteur déterminant dans le test de convergence de l'itération Newton (par défaut <literal>0.01</literal>).
441 <term>info(14)</term>
444 verbosité. Fixer <literal>info(14)=1</literal> pour une information minimale,
445 <literal>info(14)=2</literal> pour une information maximale, sinon fixer
446 <literal>info(14)=0</literal>.
457 <link linkend="external">external</link> (fonction, liste ou chaîne de caractères).
458 Résout un système linéraire <literal>P*x = b</literal>,
459 où P est le préconditionneur LU-factorisé que <literal>pjac</literal>
460 a calculé auparavant et stocké dans <literal>wp</literal> et <literal>iwp</literal>.
464 <para>Une fonction Scilab.</para>
465 <para>Sa séquence d'appel doit être
466 <literal>[r, ier] = psol(wp, iwp, b)</literal> et doit retourner la solution du système dans
467 <literal>r</literal> et un drapeau d'erreur <literal>ier</literal>.
471 <para>Une liste.</para>
472 <para>Elle doit se présenter comme suit :</para>
473 <programlisting role="no-scilab-exec"><![CDATA[
474 list(psol, x1, x2, ...)
477 où la séquence d'appel de <literal>psol</literal> est
479 <programlisting role="no-scilab-exec"><![CDATA[
480 psol(wp, iwp, b, x1, x2, ...)
483 <literal>psol</literal> retourne toujours la solution dans <literal>r</literal>.
487 <para>Une chaîne de caractères.</para>
488 <para>Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab
490 <para>En C, la séquence d'appel doit être :</para>
491 <programlisting role="no-scilab-exec"><![CDATA[
492 void psol (int*neq, double*t, double*y, double*ydot, double*savr,
493 double*wk, double*cj, double*wght, double*wp, int*iwp, double*b, double*eplin, int*ier, double*rpar, int*ipar)
495 où les vecteurs <literal>wp</literal> et <literal>iwp</literal> contiennent le préconditionneur LU-factorisé
496 <literal>P</literal>, <literal>wp</literal> représentant les valeurs et
497 <literal>iwp</literal> les pivots utilisés dans la factorisation.
498 <para>En Fortran, elle doit être :</para>
499 <programlisting role="no-scilab-exec"><![CDATA[
500 subroutine psol (neq, t, y, ydot, savr, wk, cj, wght,
501 wp, iwp, b, eplin, ier, rpar, ipar)
502 double precision t,y(*), ydot(*), savr(*), wk(*), cj, wght(*), wp(*),
504 integer neq, iwp(*), ier, ipar(*)
514 <link linkend="external">external</link> (fonction, liste ou chaîne de caractères). Calcule la valeur de
515 <literal>dg/dy + cj*dg/dydot</literal> pour une valeur donnée du paramètre
516 <literal>cj</literal> et la LU-factorise en deux vecteurs, réel et entier.
520 <para>Une fonction Scilab.</para>
521 <para>Sa séquence d'appel doit être
522 <literal>[wp, iwp, ires] = pjac(neq, t, y, ydot, h, cj, rewt, savr)</literal> et en retour,
523 les vecteurs <literal>wp</literal> et <literal>iwp</literal>
524 doivent contenir toutes les informations du préconditionneur factorisé.
528 <para>Une liste.</para>
529 <para>Elle doit se présenter comme suit :</para>
530 <programlisting role="no-scilab-exec"><![CDATA[
531 list(pjac, x1, x2, ...)
534 où la séquence d'appel de <literal>pjac</literal> est
536 <programlisting role="no-scilab-exec"><![CDATA[
537 pjac(neq, t, y, ydot, h, cj, rewt, savr, x1, x2,...)
540 <literal>pjac</literal> retourne toujours
541 <literal>dg/dy + cj*dg/dydot</literal> comme fonction de
542 <literal>(neq, t, y, ydot, h, cj, rewt, savr, x1, x2, ...)</literal>.
546 <para>Une chaîne de caractères.</para>
547 <para>Elle doit se référer au nom d'une fonction C ou une routine Fortran reliée à Scilab
549 <para>En C, la séquence d'appel doit être :</para>
550 <programlisting role="no-scilab-exec"><![CDATA[
551 void pjac (double*res, int*ires, int*neq, double*t, double*y, double*ydot, double*rewt, double*savr,
552 double*wk, double*h, double*cj, double*wp, int*iwp, int*ier, double*rpar, int*ipar)
554 <para>En Fortran, elle doit être :</para>
555 <programlisting role="no-scilab-exec"><![CDATA[
556 subroutine pjac (res, ires, neq, t, y, ydot, rewt, savr,
557 wk, h, cj, wp, iwp, ier, rpar, ipar)
558 double precision res(*), t, y(*), ydot(*), rewt(*), savr(*),
559 wk(*), h, cj, wp(*), rpar(*)
560 integer ires, neq, iwp(*), ier, ipar(*)
570 vecteur réel servant à stocker le contexte de
571 <literal>daskr</literal> et reprendre l'intégration.
579 matrice réelle. Chaque colonne est le vecteur <literal>[t; x(t); xdot(t)]</literal> où
580 <literal>t</literal> est l'indice en temps aulequel la solution a été calculée,
581 <literal>x(t)</literal> est la valeur de la solution calculée,
582 <literal>xdot(t)</literal> est la dérivée de la solution calculée.
590 vecteur à deux entrées <literal>[times num]</literal>,
591 <literal>times</literal> est la valeur du temps auquel la surface est traversée,
592 <literal>num</literal> est le nombre de surfaces traversées.
599 <title>Description</title>
600 <para>Solution de l'équation différentielle implicite :</para>
601 <programlisting role="no-scilab-exec"><![CDATA[
603 y(t0) = y0 et ydot(t0) = ydot0
605 <para>Retourne les temps de traversée de surface et le nombre de surfaces traversées
606 dans <literal>nn</literal>.
608 <para>Des exemples détaillés se trouvent dans SCI/modules/differential_equations/tests/unit_tests/daskr.tst</para>
611 <title>Exemples</title>
612 <programlisting role="example"><![CDATA[
613 // dy/dt = ((2*log(y)+8)/t-5)*y, y(1) = 1, 1 <= t <= 6
614 // g1 = ((2*log(y)+8)/t-5)*y
615 // g2 = log(y) - 2.2491
616 y0 = 1; t = 2:6; t0 = 1; y0d = 3;
617 atol = 1.d-6; rtol = 0; ng = 2;
619 deff('[delta, ires] = res1(t, y, ydot)', 'ires = 0; delta = ydot-((2*log(y)+8)/t-5)*y')
620 deff('[rts] = gr1(t, y)', 'rts = [((2*log(y)+8)/t-5)*y; log(y)-2.2491]')
622 [yy, nn] = daskr([y0, y0d], t0, t, atol, rtol, res1, ng, gr1);
625 // Retourne nn = [2.4698972 2]
628 <refsection role="see also">
629 <title>Voir aussi</title>
630 <simplelist type="inline">
632 <link linkend="ode">ode</link>
635 <link linkend="dasrt">dasrt</link>
638 <link linkend="dassl">dassl</link>
641 <link linkend="impl">impl</link>
644 <link linkend="call">call</link>
647 <link linkend="link">link</link>
650 <link linkend="external">external</link>
655 <title>Historique</title>
658 <revnumber>5.5.0</revnumber>
659 <revdescription>daskr ajouté</revdescription>