Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function
Crank-Nicolson 2(3)
Crank-Nicolson est un solveur numérique basé sur le schéma Runge-Kutta fournissant une méthode implicite efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinaires (EDOs). Appelé par xcos.
Description
Crank-Nicolson est un solveur numérique basé sur le schéma Runge-Kutta fournissant une méthode explicite efficace pour résoudre des Problèmes à Valeur Initiale de la forme :
CVode et IDA utilisent un pas variable dans l'intégration.
Cela a pour défaut de rendre les temps de calcul imprévisibles. Les solveurs basés sur Runge-Kutta ne s'adaptent pas à la complexité du problème, mais garantissent un temps de calcul stable.
Cette méthode étant implicite, elle peut être utilisée sur des problèmes raides.
C'est une amélioration de la méthode d'Euler implicite, qui approxime yn+1 en calculant f(tn+h, yn+1) et en tronquant le développement de Taylor.
Par convention, pour utiliser des pas fixes, le programme commence par calculer un pas h qui approche le paramètre de simulation max step size.
Une différence notable de Crank-Nicolson par rapport à Sundials est qu'il calcule jusqu'à la dérivée seconde de y, alors que les autres n'utilisent que des combinaisons linéaires de y et y'.
Ici, la valeur suivante est déterminée par la valeur actuelle yn plus la moyenne pondérée de deux increments, où chaque incrément est le produit du pas, h, et une estimation de la pente spécifiée par la fonction f(t,y). Ils sont distribués de manière à peu près égale sur l'intervalle.
- k1 est l'incrément basé sur la pente au milieu de l'intervalle, utilisant yn+ a11*h*k1/2 + a12*h*k2/2 ,
- k2 est l'incrément basé sur la pente au milieu de l'intervalle, mais utilisant yn ,
On peut voir que le calcul d'un ki requiert ki, nécéssitant ainsi l'utilisation d'un solveur non linéraire (ici, itérations point-fixes).
D'abord, on initialise k0 = h * f(tn, yn) comme première estimation pour les deux ki, pour obtenir de nouveaux ki et une première valeur pour yn+1 .
Ensuite, on sauve les valeurs et on recalcule yn+1 avec ces nouveaux ki.
Puis on compare les deux yn+1 et on le recalcule jusqu'à ce que son écart avec le dernier soit inférieur au paramètre de simulation reltol.
Ce processus ajoute un temps de calcul significatif à la méthode, mais améliore grandement la stabilité.
Alors que le calcul d'un nouveau k2 ne requiert qu'un appel à la dérivée de yn ,faisant donc une erreur en O(h2) , k1 requiert deux appels (un pour sa valeur initiale et un pour sa nouvelle valeur). Donc avec k1, on approxime y(2)n , faisant donc une erreur en O(h3) .
L'erreur totale est donc nombre de pas * O(h3) . Et puisque par définition nombre de pas = taille de l'intervalle / h, l'erreur totale est en O(h2) .
Cette analyse d'erreur a baptisé la méthode Crank-Nicolson 2(3): O(h3) par pas, O(h2) au total.
Bien que le solveur fonctionne bien pour max step size jusqu'à 10-3 , les erreurs d'arrondi surviennent parfois quand l'on approche 4*10-4 . En effet, le scindage de l'intervalle ne peut pas être effectué correctement et l'on obtient des résultats imprévisibles.
Examples
Le bloc intégrale retourne son état continu, on peut l'évaluer avec Crank-Nicolson en lançant l'exemple :
// Import du diagramme et réglage du temps final loadScicos(); loadXcosLibs(); importXcosDiagram("SCI/modules/xcos/examples/solvers/ODE_Example.zcos"); scs_m.props.tf = 5000; // Sélection de Crank-Nicolson et réglage de la précision scs_m.props.tol(2) = 10^-10; scs_m.props.tol(6) = 8; scs_m.props.tol(7) = 10^-2; // Lancement du chrono, de la simulation et affichage du temps tic(); try xcos_simulate(scs_m, 4); catch disp(lasterror()); end t = toc(); disp(t, "Temps pour Crank-Nicolson :");
La console Scilab affiche :
Temps pour Crank-Nicolson : 4.615
Maintenant, dans le script suivant, on compare la différence de temps entre Crank-Nicolson et CVode en lançant l'exemple avec différents solveurs tour à tour : Ouverture du script
Temps pour BDF / Newton : 18.894 Temps pour BDF / Functional : 18.382 Temps pour Adams / Newton : 10.368 Temps pour Adams / Functional : 9.815 Temps pour Crank-Nicolson : 4.652
Ces résultats montrent que pour un problème non-raide, pour à peu près la même précision demandée et en forçant la même taille de pas, Crank-Nicolson est plus rapide.
Voir Aussi
- LSodar — LSodar (abréviation de "Livermore Solver for Ordinary Differential equations, with Automatic method switching for stiff and nonstiff problems, and with Root-finding") est un solveur numérique fournissant une méthode efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinaires (EDOs).
- CVode — CVode (abréviation de "C-language Variable-coefficients ODE solver") est un solveur numérique fournissant une méthode efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinarires (EDOs). Il utilise BDF ou Adams comme méthode d'intégration, et des itérations fonctionnelles ou de Newton.
- IDA — IDA (abréviation de "Implicit Differential Algebraic equations system solver") est un solveur numérique fournissant une méthode efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Algebriques (EDAs).
- Runge-Kutta 4(5) — Runge-Kutta est un solveur numérique fournissant une méthode explicite efficace pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinarires (EDOs).
- Dormand-Prince 4(5) — Dormand-Prince est un solveur numérique fournissant une méthode explicite efficace pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinarires (EDOs).
- Implicit Runge-Kutta 4(5) — Implicit Runge-Kutta est un solveur numérique fournissant une méthode implicite efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Ordinarires (EDOs). Called by xcos.
- DDaskr — DDaskr (abréviation de "Double-precision Differential Algebraic equations system Solver with Krylov method and Rootfinding") est un solveur numérique fournissant une méthode efficace et stable pour résoudre des Problèmes à Valeur Initiale d'Equations Différentielles Algebriques (EDAs).
- Comparaisons — Cette page compare les solveurs pour déterminer lequel est le mieux adapté au le problème étudié.
- ode_discrete — ordinary differential equation solver, discrete time simulation
- ode_roots — ordinary differential equation solver with roots finding
- odedc — discrete/continuous ode solver
- impl — differential algebraic equation
Bibliographie
Advances in Computational Mathematics, Volume 6, Issue 1, 1996, Pages 207-226 A practical method for numerical evaluation of solutions of partial differential equations of the heat-conduction type
Pages 81-82 A family of higher-order implicit time integration methods for unsteady compressible flows
Historique
Version | Description |
6.0.0 | Crank-Nicolson 2(3) ajouté |
Report an issue | ||
<< Implicit Runge-Kutta 4(5) | Solveurs | IDA >> |