{"id":1289,"date":"2026-08-21T14:31:21","date_gmt":"2026-08-21T14:31:21","guid":{"rendered":"https:\/\/matforge.org\/?p=1289","raw":"https:\/\/matforge.org\/?p=1289"},"modified":"2026-08-21T14:31:21","modified_gmt":"2026-08-21T14:31:21","slug":"adaptive-time-stepping-pde-solvers","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/","title":{"rendered":"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL","raw":"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><article>\n<p>Le pas de temps adaptatif modifie la taille du pas de temps au cours d&rsquo;une simulation. Le solveur fait des \u00e9tapes plus petites lorsque la solution change rapidement et des \u00e9tapes plus grandes lorsque l&rsquo;\u00e9volution se lisse.<\/p>\n<p>Un calcul \u00e0 pas fixe doit utiliser une valeur de <code>\u0394t<\/code> tout au long de la simulation. Cette valeur est souvent s\u00e9lectionn\u00e9e en fonction de l&rsquo;\u00e9v\u00e9nement, de la transitoire ou de la restriction de stabilit\u00e9 les plus exigeants. La m\u00eame petite \u00e9tape est ensuite utilis\u00e9e pendant de longs intervalles o\u00f9 cela n&rsquo;est pas n\u00e9cessaire.<\/p>\n<p>Une m\u00e9thode adaptative estime l&rsquo;erreur de chaque \u00e9tape propos\u00e9e. Il accepte l&rsquo;\u00e9tape lorsque l&rsquo;erreur normalis\u00e9e est inf\u00e9rieure \u00e0 la tol\u00e9rance demand\u00e9e et la rejette lorsque l&rsquo;erreur est trop importante. Un contr\u00f4leur s\u00e9lectionne ensuite une nouvelle taille de pas.<\/p>\n<p>Le contr\u00f4le des erreurs n&rsquo;est qu&rsquo;une partie du processus. Les m\u00e9thodes explicites doivent toujours respecter les limites de LFC et de diffusion. Les m\u00e9thodes implicites peuvent n\u00e9cessiter des restrictions pour la pr\u00e9cision, la convergence non lin\u00e9aire, la r\u00e9solution des ondes, les \u00e9v\u00e9nements ou les contraintes physiques. Un solveur fiable combine ces exigences plut\u00f4t que de permettre \u00e0 une estimation d&rsquo;erreur de tout contr\u00f4ler.<\/p>\n<h2>Qu&rsquo;est-ce que le pas de temps adaptatif&nbsp;?<\/h2>\n<p>Apr\u00e8s discr\u00e9tisation spatiale, une PDE d\u00e9pendante du temps devient g\u00e9n\u00e9ralement un syst\u00e8me d&rsquo;\u00e9quations diff\u00e9rentielles ordinaires :<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Une m\u00e9thode num\u00e9rique fait passer la solution de <code>t\u207f<\/code> \u00e0&nbsp;:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Un solveur adaptatif suit un cycle d&rsquo;acceptation ou de rejet :<\/p>\n<ol>\n<li>Proposez un pas de temps.<\/li>\n<li>Calculer une solution d&rsquo;essai.<\/li>\n<li>Estimez l&rsquo;erreur temporelle locale.<\/li>\n<li>Normaliser l&rsquo;erreur en utilisant les tol\u00e9rances absolues et relatives.<\/li>\n<li>Accepter ou rejeter l&rsquo;\u00e9tape de proc\u00e8s.<\/li>\n<li>S\u00e9lectionnez la taille de l&rsquo;\u00e9tape suivante.<\/li>\n<\/ol>\n<p>Les \u00e9tapes rejet\u00e9es n&rsquo;avancent pas le temps de simulation. Le solveur restaure l&rsquo;\u00e9tat accept\u00e9 pr\u00e9c\u00e9dent et r\u00e9p\u00e8te le calcul avec une valeur plus petite de <code>\u0394t<\/code>.<\/p>\n<h2>Erreur locale et erreur globale<\/h2>\n<p>L&rsquo;erreur de troncature locale est l&rsquo;erreur introduite par un pas de temps lorsque l&rsquo;\u00e9tape commence \u00e0 partir de la solution exacte.<\/p>\n<p>L&rsquo;erreur globale est la diff\u00e9rence accumul\u00e9e entre les solutions num\u00e9riques et exactes apr\u00e8s de nombreuses \u00e9tapes.<\/p>\n<p>Pour une m\u00e9thode de commande <code>p<\/code>&nbsp;:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Les m\u00e9thodes adaptatives estiment normalement l&rsquo;erreur locale. Garder chaque estimation locale en dessous d&rsquo;une tol\u00e9rance ne fournit pas une limite universelle rigoureuse sur l&rsquo;erreur globale, mais elle offre un m\u00e9canisme de contr\u00f4le pratique efficace.<\/p>\n<h2>Tol\u00e9rances absolues et relatives<\/h2>\n<p>Une valeur d&rsquo;erreur brute a peu de sens sans l&rsquo;\u00e9chelle de chaque composant de solution. Les solveurs adaptatifs calculent donc une erreur normalis\u00e9e.<\/p>\n<p>Une \u00e9chelle de composantes communes est :<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>L&rsquo;erreur quadratique moyenne pond\u00e9r\u00e9e normalis\u00e9e est :<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>L&rsquo;\u00e9tape est normalement accept\u00e9e lorsque :<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>La tol\u00e9rance absolue contr\u00f4le les composants proches de z\u00e9ro. La tol\u00e9rance relative contr\u00f4le les composantes dont la magnitude est grande par rapport \u00e0 <code>atol<\/code>.<\/p>\n<p>Diff\u00e9rents champs peuvent n\u00e9cessiter des tol\u00e9rances absolues diff\u00e9rentes. Une temp\u00e9rature mesur\u00e9e dans des centaines de Kelvin ne doit pas n\u00e9cessairement utiliser la m\u00eame tol\u00e9rance absolue qu&rsquo;une concentration proche de <code>10\u207b\u2079<\/code>.<\/p>\n<h2>Comment la prochaine \u00e9tape est s\u00e9lectionn\u00e9e<\/h2>\n<p>Si l&rsquo;erreur locale estim\u00e9e se comporte comme&nbsp;:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Un contr\u00f4leur de base peut utiliser :<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>Le facteur de s\u00e9curit\u00e9 est inf\u00e9rieur \u00e0 un. Cela r\u00e9duit le risque que la prochaine \u00e9tape se situe directement sur la limite de rejet.<\/p>\n<p>Les impl\u00e9mentations de production limitent \u00e9galement les changements de taille des \u00e9tapes&nbsp;:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>L&rsquo;exposant correct d\u00e9pend de l&rsquo;ordre repr\u00e9sent\u00e9 par l&rsquo;estimateur d&rsquo;erreur et la convention de contr\u00f4leur. Il ne doit pas \u00eatre copi\u00e9 aveugl\u00e9ment entre les m\u00e9thodes non li\u00e9es.<\/p>\n<h2>Contr\u00f4leurs I, PI et PID<\/h2>\n<p>Un contr\u00f4leur int\u00e9gr\u00e9 simple utilise uniquement l&rsquo;erreur normalis\u00e9e actuelle. Cela peut entra\u00eener une alternance de l&rsquo;historique des pas de temps entre les augmentations et les rejets agressifs.<\/p>\n<p>Les contr\u00f4leurs PI et PID utilisent \u00e9galement les erreurs des \u00e9tapes pr\u00e9c\u00e9dentes accept\u00e9es. Cela produit des changements de taille de pas plus fluides et peut r\u00e9duire les taux de rejet.<\/p>\n<p>Un contr\u00f4leur PI simplifi\u00e9 a la forme :<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Les coefficients d\u00e9pendent de l&rsquo;ordre de m\u00e9thode et de la conception du contr\u00f4leur. Un contr\u00f4le sophistiqu\u00e9 est utile, mais il ne peut pas r\u00e9parer un estimateur d&rsquo;erreurs inexact ou un int\u00e9grateur de temps inadapt\u00e9.<\/p>\n<h2>Paires Runge-Kutta int\u00e9gr\u00e9es<\/h2>\n<p>Une paire Runge-Kutta int\u00e9gr\u00e9e calcule deux approximations \u00e0 partir du m\u00eame ensemble d&rsquo;\u00e9tapes interm\u00e9diaires.<\/p>\n<p>Les deux formules ont des ordres diff\u00e9rents :<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>La diff\u00e9rence fournit une estimation d&rsquo;erreur&nbsp;:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>\u00c9tant donn\u00e9 que les deux formules partagent leurs \u00e9valuations sur sc\u00e8ne, l&rsquo;estimateur est beaucoup moins cher que de r\u00e9aliser deux int\u00e9grations ind\u00e9pendantes.<\/p>\n<p>Les m\u00e9thodes Runge-Kutta explicites int\u00e9gr\u00e9es sont les mieux adapt\u00e9es aux syst\u00e8mes non raides. Si la rigidit\u00e9 contr\u00f4le la taille du pas, augmentant ou d\u00e9croissant <code>\u0394t<\/code><\/p>\n<h2>Dormand-Prince 5(4)<\/h2>\n<p>Dormand-Prince 5(4) est une paire int\u00e9gr\u00e9e en sept \u00e9tapes. Il produit une solution de cinqui\u00e8me ordre et une estimation d&rsquo;erreur du quatri\u00e8me ordre.<\/p>\n<p>La paire utilise une extrapolation locale&nbsp;: l&rsquo;approximation du cinqui\u00e8me ordre devient la solution accept\u00e9e, tandis que la formule d&rsquo;ordre inf\u00e9rieur contr\u00f4le l&rsquo;\u00e9tape.<\/p>\n<p>Il a \u00e9galement une propri\u00e9t\u00e9 FSAL en usage ordinaire. La derni\u00e8re \u00e9valuation d\u00e9riv\u00e9e d&rsquo;une \u00e9tape accept\u00e9e peut devenir la premi\u00e8re \u00e9valuation de la prochaine \u00e9tape, r\u00e9duisant le nombre de nouvelles \u00e9valuations de fonctions apr\u00e8s le d\u00e9marrage.<\/p>\n<p>Dormand-Prince est utilis\u00e9 par Scipy <code>RK45<\/code> et MATLAB <code>ode45<\/code>. Il s&rsquo;agit d&rsquo;un choix g\u00e9n\u00e9ral solide pour les probl\u00e8mes de valeur initiale non rigides et fluides.<\/p>\n<h2>tsit5<\/h2>\n<p>tsit5 est la m\u00e9thode runge-kutta int\u00e9gr\u00e9e de tsitouras 5(4) . Il est largement utilis\u00e9 dans l&rsquo;\u00e9cosyst\u00e8me SCIML comme m\u00e9thode par d\u00e9faut pour les probl\u00e8mes non raides aux tol\u00e9rances ordinaires.<\/p>\n<p>La m\u00e9thode est con\u00e7ue pour fournir un \u00e9quilibre favorable entre la qualit\u00e9 d&rsquo;estimation des erreurs, le co\u00fbt de la sc\u00e8ne et l&rsquo;efficacit\u00e9 pratique.<\/p>\n<p>Cela reste une m\u00e9thode explicite. Si une PDE semi-discr\u00e8te est rigide en raison de la diffusion, des r\u00e9actions ou des \u00e9chelles de temps fortement s\u00e9par\u00e9es, une m\u00e9thode implicite, Rosenbrock, BDF ou IMEX peut \u00eatre plus efficace.<\/p>\n<h2>Bogacki\u2013Shampe 3(2)<\/h2>\n<p>Bogacki\u2013Shamine 3(2) est une paire int\u00e9gr\u00e9e en quatre \u00e9tapes. Il fournit une solution accept\u00e9e au troisi\u00e8me ordre avec un estimateur d&rsquo;erreurs de deuxi\u00e8me ordre.<\/p>\n<p>Il est impl\u00e9ment\u00e9 comme <code>RK23<\/code> dans Scipy et sous-tend le <code>ode23<\/code> de Matlab.<\/p>\n<p>La paire peut \u00eatre utile lorsque la pr\u00e9cision mod\u00e9r\u00e9e est suffisante ou lorsque les \u00e9valuations des fonctions sont peu co\u00fbteuses. Son ordre inf\u00e9rieur peut n\u00e9cessiter plus d&rsquo;\u00e9tapes accept\u00e9es qu&rsquo;une m\u00e9thode de cinqui\u00e8me ordre lorsque des tol\u00e9rances strictes sont demand\u00e9es.<\/p>\n<h2>doublonnage<\/h2>\n<p>Le doublement par \u00e9tapes estime l&rsquo;erreur temporelle en comparant la m\u00eame m\u00e9thode num\u00e9rique \u00e0 deux r\u00e9solutions.<\/p>\n<p>La proc\u00e9dure calcule :<\/p>\n<ol>\n<li>Un pas de longueur complet <code>\u0394t<\/code>.<\/li>\n<li>Deux demi-pas de longueur <code>\u0394t\/2<\/code>.<\/li>\n<li>La diff\u00e9rence entre les deux r\u00e9sultats.<\/li>\n<\/ol>\n<p>Pour une m\u00e9thode de commande <code>p<\/code>, une estimation de l&rsquo;erreur dans le r\u00e9sultat raffin\u00e9 en deux demi-\u00e9tapes est&nbsp;:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>La solution accept\u00e9e devrait normalement \u00eatre le r\u00e9sultat des deux demi-\u00e9tapes car elle est plus pr\u00e9cise.<\/p>\n<p>Le doublement par \u00e9tapes n\u00e9cessite trois applications de la m\u00e9thode sous-jacente&nbsp;: une \u00e9tape compl\u00e8te et deux demi-\u00e9tapes. Une impl\u00e9mentation implicite peut donc n\u00e9cessiter trois r\u00e9solutions non lin\u00e9aires ou lin\u00e9aires \u00e0 moins que certains travaux de configuration ne puissent \u00eatre r\u00e9utilis\u00e9s.<\/p>\n<h2>Estimation r\u00e9siduelle et d\u00e9fectueuse<\/h2>\n<p>Les m\u00e9thodes bas\u00e9es sur les r\u00e9sidus \u00e9valuent la pr\u00e9cision avec laquelle une trajectoire num\u00e9rique reconstruite satisfait l&rsquo;\u00e9quation diff\u00e9rentielle entre les points accept\u00e9s.<\/p>\n<p>Une reconstruction continue <code>\u0169(t)<\/code> pr\u00e9sente un d\u00e9faut&nbsp;:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>Le d\u00e9faut peut prendre en charge une estimation d&rsquo;erreur lorsqu&rsquo;il est combin\u00e9 avec des informations de stabilit\u00e9 ou une norme appropri\u00e9e.<\/p>\n<p>Le r\u00e9sidu alg\u00e9brique d&rsquo;une solution implicite n&rsquo;est pas automatiquement une estimation d&rsquo;erreur temporelle. La m\u00e9thode de Newton peut r\u00e9duire l&rsquo;\u00e9quation discr\u00e8te r\u00e9siduelle presque \u00e0 z\u00e9ro, m\u00eame lorsque le pas de temps est trop important pour repr\u00e9senter la solution physique avec pr\u00e9cision.<\/p>\n<p>La convergence alg\u00e9brique et l&rsquo;erreur de troncature temporelle n\u00e9cessitent donc des contr\u00f4les distincts.<\/p>\n<h2>M\u00e9thodes adaptatives BDF<\/h2>\n<p>Les formules de diff\u00e9renciation vers l&rsquo;arri\u00e8re sont des m\u00e9thodes implicites en plusieurs \u00e9tapes utilis\u00e9es pour les syst\u00e8mes rigides. Les impl\u00e9mentations d&rsquo;ordre variable basculent g\u00e9n\u00e9ralement entre les commandes un \u00e0 cinq.<\/p>\n<p>Un solveur BDF stocke les informations des \u00e9tats accept\u00e9s pr\u00e9c\u00e9dents. Il construit un pr\u00e9dicteur pour le nouvel \u00e9tat, r\u00e9sout l&rsquo;\u00e9quation implicite et estime l&rsquo;erreur de troncature locale \u00e0 l&rsquo;aide de diff\u00e9rences divis\u00e9es ou d&rsquo;une repr\u00e9sentation historique de type Nordsieck.<\/p>\n<p>Le solveur peut changer :<\/p>\n<ul>\n<li>La taille du pas de temps<\/li>\n<li>la commande BDF<\/li>\n<li>La fr\u00e9quence des mises \u00e0 jour jacobiennes<\/li>\n<li>La configuration du solveur lin\u00e9aire ou du pr\u00e9conditionneur<\/li>\n<\/ul>\n<p>Une solution fluide peut justifier une augmentation de la commande. Un \u00e9v\u00e9nement, une phase de d\u00e9marrage, une discontinuit\u00e9 ou un \u00e9chec du test d&rsquo;erreur peut forcer le solveur \u00e0 r\u00e9duire son ordre et sa taille de pas.<\/p>\n<p>BDF2 est une formule de diff\u00e9renciation en arri\u00e8re. Ce n&rsquo;est pas Crank \u2013 Nicolson, bien que les deux m\u00e9thodes soient de second ordre.<\/p>\n<h2>Contr\u00f4le des erreurs dans COMSOL BDF<\/h2>\n<p>Le contr\u00f4leur BDF de COMSOL \u00e9value une estimation de l&rsquo;erreur locale moyenne pond\u00e9r\u00e9e. Une \u00e9tape passe lorsque l&rsquo;erreur normalis\u00e9e est inf\u00e9rieure \u00e0 un.<\/p>\n<p>Le solveur peut utiliser des commandes BDF de un \u00e0 cinq. Il examine la douceur de la solution, s\u00e9lectionne une commande, tente une \u00e9tape et r\u00e9p\u00e8te l&rsquo;\u00e9tape avec une taille plus petite lorsque le test d&rsquo;erreur local \u00e9choue.<\/p>\n<p>Son journal des solveurs comprend :<\/p>\n<ul>\n<li><code>Order<\/code> pour la commande BDF actuelle<\/li>\n<li><code>Tfail<\/code> pour les tests d&rsquo;erreur de pas de temps \u00e9chou\u00e9s<\/li>\n<li><code>NLfail<\/code> pour les d\u00e9faillances non lin\u00e9aires du solveur<\/li>\n<\/ul>\n<p>Un nombre \u00e9lev\u00e9 de <code>Tfail<\/code> sugg\u00e8re que le contr\u00f4leur a fr\u00e9quemment propos\u00e9 des \u00e9tapes trop importantes pour la pr\u00e9cision demand\u00e9e. Un nombre \u00e9lev\u00e9 de <code>NLfail<\/code> indique que la r\u00e9solution non lin\u00e9aire alg\u00e9brique a eu des difficult\u00e9s.<\/p>\n<p>Ces deux \u00e9checs ne doivent pas \u00eatre interpr\u00e9t\u00e9s comme le m\u00eame probl\u00e8me.<\/p>\n<p>Le m\u00e9canisme d\u00e9taill\u00e9 est d\u00e9crit dans <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">S\u00e9lection automatique de pas de temps et d&rsquo;ordre dans le temps dans les probl\u00e8mes d\u00e9pendant du temps<\/a>.<\/p>\n<h2>Erreur alg\u00e9brique et erreur temporelle<\/h2>\n<p>Une m\u00e9thode implicite r\u00e9sout un syst\u00e8me non lin\u00e9aire \u00e0 chaque pas de temps. Si Newton ou le solveur lin\u00e9aire se termine trop t\u00f4t, l&rsquo;erreur alg\u00e9brique peut devenir comparable \u00e0 l&rsquo;erreur temporelle.<\/p>\n<p>Le contr\u00f4leur de pas de temps peut alors r\u00e9agir \u00e0 une erreur qui provient d&rsquo;une convergence alg\u00e9brique incompl\u00e8te plut\u00f4t que de la discr\u00e9tisation temporelle.<\/p>\n<p>Une configuration de solveur cr\u00e9dible devrait rendre la tol\u00e9rance alg\u00e9brique suffisamment serr\u00e9e que la cible temporelle. Le rendre inutilement strict, c&rsquo;est aussi du travail.<\/p>\n<p>Certains solveurs coordonnent la convergence non lin\u00e9aire et la s\u00e9lection de pas de temps. Un contr\u00f4leur non lin\u00e9aire peut r\u00e9duire l&rsquo;\u00e9tape lorsque la stabilit\u00e9 de Newton n\u00e9cessite une valeur inf\u00e9rieure \u00e0 celle propos\u00e9e par l&rsquo;estimateur de pr\u00e9cision BDF.<\/p>\n<h2>Limites de LFC et pas adaptatifs<\/h2>\n<p>Le contr\u00f4le d&rsquo;erreur explicite ne peut pas remplacer une restriction de stabilit\u00e9 explicite.<\/p>\n<p>Pour l&rsquo;advection, une limite CFL typique est :<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>Pour une diffusion explicitement int\u00e9gr\u00e9e&nbsp;:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Les constantes d\u00e9pendent de la discr\u00e9tisation spatiale, de la dimension, de la g\u00e9om\u00e9trie du maillage et de l&rsquo;int\u00e9grateur de temps.<\/p>\n<p>L&rsquo;\u00e9tape utilisable peut \u00eatre :<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Une m\u00e9thode Runge-Kutta adaptative peut signaler une tr\u00e8s petite erreur et devenir toujours instable si la limite CFL est viol\u00e9e.<\/p>\n<h2>Les m\u00e9thodes implicites ont-elles besoin d&rsquo;une limite CFL&nbsp;?<\/h2>\n<p>Une discr\u00e9tisation implicite implicite d&rsquo;un mod\u00e8le lin\u00e9aire peut ne pas avoir la m\u00eame limite de stabilit\u00e9 explicite de la LFC. Cela ne signifie pas que le pas de temps peut \u00eatre arbitrairement important.<\/p>\n<p>Les grandes \u00e9tapes implicites peuvent :<\/p>\n<ul>\n<li>Miss Waves et transitoires rapides<\/li>\n<li>Introduire un amortissement num\u00e9rique excessif<\/li>\n<li>Perdre la monotonie<\/li>\n<li>Rendre les it\u00e9rations de Newton difficiles<\/li>\n<li>traverser un \u00e9v\u00e9nement sans le r\u00e9soudre<\/li>\n<li>R\u00e9duire la pr\u00e9cision des processus non lin\u00e9aires coupl\u00e9s<\/li>\n<\/ul>\n<p>Ces restrictions doivent \u00eatre appel\u00e9es pr\u00e9cision, convergence non lin\u00e9aire ou limites de r\u00e9solution physique plut\u00f4t qu&rsquo;une condition universelle de LFC.<\/p>\n<h2>Plusieurs contraintes de pas de temps<\/h2>\n<p>Les grands codes de simulation calculent souvent plusieurs tailles de pas candidates. Le PISM, par exemple, prend en compte les restrictions sp\u00e9cifiques au mod\u00e8le li\u00e9es \u00e0 l&rsquo;advection, \u00e0 la diffusion, aux intervalles de rapports et \u00e0 d&rsquo;autres processus physiques.<\/p>\n<p>Il est utile d&rsquo;enregistrer la raison pour laquelle chaque \u00e9tape accept\u00e9e limite chaque \u00e9tape accept\u00e9e. Un calcul domin\u00e9 par un contr\u00f4leur d&rsquo;erreurs n\u00e9cessite une optimisation diff\u00e9rente d&rsquo;une limite limit\u00e9e par la vitesse la plus rapide ou la cellule de maillage la plus fine.<\/p>\n<p>Le PISM <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">documentation de pas-temps<\/a> d&rsquo;un contr\u00f4le multi-contraintes.<\/p>\n<h2>Temps de sortie et \u00e9tapes internes<\/h2>\n<p>Les temps de sortie demand\u00e9s ne doivent pas toujours devenir des \u00e9tapes d&rsquo;int\u00e9gration. De nombreux solveurs utilisent une sortie dense ou une interpolation pour calculer les r\u00e9sultats stock\u00e9s entre les niveaux de temps internes accept\u00e9s.<\/p>\n<p>Forcer chaque temps de sortie \u00e0 devenir une \u00e9tape de solveur exacte peut r\u00e9duire l&rsquo;efficacit\u00e9 lorsque la sortie fr\u00e9quente est demand\u00e9e.<\/p>\n<p>L&rsquo;alignement exact des \u00e9tapes peut toujours \u00eatre appropri\u00e9 lorsque :<\/p>\n<ul>\n<li>Une charge discontinue change \u00e0 un moment connu.<\/li>\n<li>Une condition aux limites change brusquement.<\/li>\n<li>Un \u00e9v\u00e9nement modifie les \u00e9quations r\u00e9gissant.<\/li>\n<li>Une action de contr\u00f4le doit se produire \u00e0 un instant pr\u00e9cis.<\/li>\n<li>La m\u00e9thode manque de sortie dense suffisamment pr\u00e9cise.<\/li>\n<\/ul>\n<p>Apr\u00e8s une discontinuit\u00e9, l&rsquo;historique en plusieurs \u00e9tapes ou le contr\u00f4leur adaptatif peut avoir besoin de red\u00e9marrer.<\/p>\n<h2>Pas de temps adaptatif dans Fipy<\/h2>\n<p>FIPY r\u00e9sout des \u00e9quations de volume fini dans l&rsquo;espace discr\u00e9tis\u00e9 mais ne tourne pas un appel tel que&nbsp;:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>dans un contr\u00f4leur d&rsquo;erreur temporelle int\u00e9gr\u00e9. Les tol\u00e9rances des solveurs dans FIPY contr\u00f4lent principalement la r\u00e9solution lin\u00e9aire alg\u00e9brique.<\/p>\n<p>La documentation FIPY actuelle recommande le package externe <code>steppyngstounes<\/code> pour la gestion des \u00e9tapes adaptatives. Les exemples de FIPY utilisent des erreurs de contr\u00f4leur d\u00e9riv\u00e9es des r\u00e9sidus d&rsquo;\u00e9quation, des contr\u00f4les de conservation ou d&rsquo;autres crit\u00e8res sp\u00e9cifiques \u00e0 l&rsquo;application.<\/p>\n<p>Consultez la <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">documentation pas \u00e0 pas adaptative FIPY<\/a>.<\/p>\n<h2>Un exemple de double-doublement de Fipy<\/h2>\n<p>L&rsquo;exemple \u00e9ducatif suivant enveloppe la discr\u00e9tisation transitoire implicite du premier ordre de Fipy dans un contr\u00f4leur de doublage par \u00e9tapes.<\/p>\n<p>Il effectue une \u00e9tape compl\u00e8te d&rsquo;Euler vers l&rsquo;arri\u00e8re et deux demi-pas. Le r\u00e9sultat en deux demi-\u00e9tapes est accept\u00e9 lorsque son erreur normalis\u00e9e est inf\u00e9rieure \u00e0 un.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Cette mise en \u0153uvre est intentionnellement simple. Chaque intervalle de tentatives n\u00e9cessite trois r\u00e9solutions implicites, donc cela peut \u00eatre co\u00fbteux. Un BDF de production ou une m\u00e9thode embarqu\u00e9e fournit normalement un estimateur plus efficace et un contr\u00f4leur PI ou PID plus lisse.<\/p>\n<h2>Ajout d&rsquo;une contrainte de LCF explicite<\/h2>\n<p>Pour un terme d&rsquo;advection explicitement int\u00e9gr\u00e9, l&rsquo;\u00e9tape s\u00e9lectionn\u00e9e par erreur peut \u00eatre limit\u00e9e s\u00e9par\u00e9ment :<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Pour les maillages non uniformes, utilisez l&rsquo;\u00e9chelle de cellule locale la plus restrictive ou une estimation bas\u00e9e sur le visage appropri\u00e9 \u00e0 la m\u00e9thode spatiale.<\/p>\n<h2>Choisir des tol\u00e9rances<\/h2>\n<p>Il n&rsquo;y a pas de paires universelles de tol\u00e9rances adapt\u00e9es \u00e0 chaque PDE.<\/p>\n<p>Un processus pratique est :<\/p>\n<ol>\n<li>Choisissez des tol\u00e9rances absolues en fonction de l&rsquo;\u00e9chelle physique de chaque champ.<\/li>\n<li>S\u00e9lectionnez une tol\u00e9rance relative mod\u00e9r\u00e9e.<\/li>\n<li>R\u00e9p\u00e9tez la simulation avec des tol\u00e9rances r\u00e9duites d&rsquo;un facteur dix.<\/li>\n<li>Comparez les quantit\u00e9s d&rsquo;int\u00e9r\u00eat scientifique.<\/li>\n<li>Continuez \u00e0 resserrer jusqu&rsquo;\u00e0 ce que le r\u00e9sultat change moins que l&rsquo;erreur temporelle accept\u00e9e.<\/li>\n<\/ol>\n<p>La r\u00e9duction de <code>rtol<\/code> rend l&rsquo;exigence plus stricte et augmente normalement le co\u00fbt de calcul. L&rsquo;augmentation de <code>rtol<\/code> assouplit le besoin et r\u00e9duit normalement la pr\u00e9cision.<\/p>\n<p>Une tol\u00e9rance absolue trop faible peut forcer un travail excessif lorsqu&rsquo;un composant passe par z\u00e9ro. Celui qui est trop grand peut masquer des changements significatifs dans de petites variables.<\/p>\n<h2>Rejet d&rsquo;\u00e9tape<\/h2>\n<p>Une \u00e9tape explicite rejet\u00e9e gaspille les \u00e9valuations d&rsquo;\u00e9tape. Une \u00e9tape implicite rejet\u00e9e peut gaspiller des it\u00e9rations non lin\u00e9aires, des calculs jacobiens, des factorisations et la configuration du pr\u00e9conditionneur.<\/p>\n<p>Un petit nombre d&rsquo;\u00e9tapes rejet\u00e9es est normal. Un taux de rejet \u00e9lev\u00e9 peut indiquer :<\/p>\n<ul>\n<li>Une premi\u00e8re \u00e9tape trop importante<\/li>\n<li>Un contr\u00f4leur trop agressif<\/li>\n<li>une discontinuit\u00e9 ou un \u00e9v\u00e9nement<\/li>\n<li>Tol\u00e9rances mal \u00e9volu\u00e9es<\/li>\n<li>Un estimateur d&rsquo;erreurs non fiable<\/li>\n<li>Rigidit\u00e9 dans une m\u00e9thode explicite<\/li>\n<li>Convergence non lin\u00e9aire incompl\u00e8te<\/li>\n<li>Un mod\u00e8le incorrect ou mal conditionn\u00e9<\/li>\n<\/ul>\n<p>Le r\u00e9glage du contr\u00f4leur ne doit pas \u00eatre utilis\u00e9 pour masquer les d\u00e9faillances du mod\u00e8le ou du solveur.<\/p>\n<h2>Lorsque le pas adaptatif peut manquer une dynamique importante<\/h2>\n<p>Un estimateur d&rsquo;erreurs mesure la solution num\u00e9rique g\u00e9n\u00e9r\u00e9e par la m\u00e9thode choisie. Il ne sait pas automatiquement quelles caract\u00e9ristiques physiques comptent.<\/p>\n<p>Un solveur peut prendre des mesures trop importantes pour :<\/p>\n<ul>\n<li>impulsions externes courtes<\/li>\n<li>Ondes haute fr\u00e9quence<\/li>\n<li>\u00c9v\u00e9nements de seuil<\/li>\n<li>Activation du contact<\/li>\n<li>Changements de phase rapides<\/li>\n<li>Termes de la source discontinue<\/li>\n<\/ul>\n<p>Utilisez des contraintes d&rsquo;\u00e9tape maximales, une gestion des \u00e9v\u00e9nements ou des niveaux de temps forc\u00e9s lorsque ces fonctionnalit\u00e9s doivent \u00eatre r\u00e9solues.<\/p>\n<h2>Lorsque des \u00e9tapes fixes sont utiles<\/h2>\n<p>Le pas de temps fixe reste appropri\u00e9 lorsque :<\/p>\n<ul>\n<li>Une m\u00e9thode de conservation de la structure n\u00e9cessite une \u00e9tape constante.<\/li>\n<li>Des trajectoires discr\u00e8tes identiques sont n\u00e9cessaires pour le d\u00e9bogage.<\/li>\n<li>La solution a une \u00e9chelle de temps presque uniforme.<\/li>\n<li>La simulation est synchronis\u00e9e avec les donn\u00e9es mesur\u00e9es.<\/li>\n<li>Un GPU ou une impl\u00e9mentation parall\u00e8le fonctionne mieux avec des charges de travail pr\u00e9visibles.<\/li>\n<li>L&rsquo;\u00e9tude de convergence de pas de temps n\u00e9cessite un raffinement contr\u00f4l\u00e9.<\/li>\n<\/ul>\n<p>Les solveurs adaptatifs peuvent toujours renvoyer des r\u00e9sultats \u00e0 des temps de sortie communs gr\u00e2ce \u00e0 l&rsquo;interpolation. Il n&rsquo;est donc pas n\u00e9cessaire d&rsquo;effectuer une \u00e9tape fixe pour comparer uniquement les ex\u00e9cutions \u00e0 des horodatages sp\u00e9cifi\u00e9s.<\/p>\n<h2>Pas adaptatif et reproductibilit\u00e9<\/h2>\n<p>De petits changements dans les tol\u00e9rances, les versions de solveur, l&rsquo;arithm\u00e9tique mat\u00e9rielle ou la convergence non lin\u00e9aire peuvent modifier la s\u00e9quence d&rsquo;\u00e9tapes accept\u00e9e.<\/p>\n<p>Un rapport reproductible doit enregistrer :<\/p>\n<ul>\n<li>Int\u00e9grateur de temps et version<\/li>\n<li>Tol\u00e9rances relatives et absolues<\/li>\n<li>\u00c9tapes initiales, minimales et maximales<\/li>\n<li>Norme d&rsquo;erreur<\/li>\n<li>Type de contr\u00f4leur<\/li>\n<li>LFC ou restrictions bas\u00e9es sur la physique<\/li>\n<li>Heures d&rsquo;\u00e9v\u00e9nement<\/li>\n<li>Nombre d&rsquo;\u00e9tapes accept\u00e9s et rejet\u00e9s<\/li>\n<li>Tol\u00e9rances non lin\u00e9aires et lin\u00e9aires du solveur<\/li>\n<\/ul>\n<h2>erreurs courantes<\/h2>\n<ul>\n<li>Utilisation de la tol\u00e9rance r\u00e9siduelle alg\u00e9brique comme tol\u00e9rance d&rsquo;erreur temporelle<\/li>\n<li>En supposant que FIPY change <code>dt<\/code> \u00e0 <code>rtol<\/code> et <code>atol<\/code> les arguments<\/li>\n<li>Accepter le r\u00e9sultat complet moins pr\u00e9cis en cas de doublage par \u00e9tapes<\/li>\n<li>Oublier le facteur <code>2^p - 1<\/code> dans l&rsquo;estimation de Richardson<\/li>\n<li>Utilisation d&rsquo;un exposant de contr\u00f4leur fixe pour chaque estimateur<\/li>\n<li>Ignorer la limite CFL d&rsquo;un sch\u00e9ma explicite<\/li>\n<li>Appeler toutes les limitations implicites une condition CFL<\/li>\n<li>Utilisation de Dormand-Prince pour un probl\u00e8me de diffusion fortement raide<\/li>\n<li>Desserrage <code>rtol<\/code> lorsqu&rsquo;une plus grande pr\u00e9cision est requise<\/li>\n<li>Permettre \u00e0 une \u00e9tape de franchir une charge discontinue sans \u00e9v\u00e9nement<\/li>\n<li>D\u00e9routant <code>Tfail<\/code> avec une d\u00e9faillance non lin\u00e9aire du solveur<\/li>\n<li>Comparaison des solveurs adaptatifs uniquement par le nombre de pas accept\u00e9<\/li>\n<\/ul>\n<h2>Un flux de travail pratique<\/h2>\n<ol>\n<li>V\u00e9rifiez d&rsquo;abord l&rsquo;impl\u00e9mentation par \u00e9tapes fixes.<\/li>\n<li>D\u00e9terminez si le syst\u00e8me semi-discret est rigide.<\/li>\n<li>S\u00e9lectionnez un estimateur d&rsquo;erreurs appropri\u00e9 \u00e0 la m\u00e9thode.<\/li>\n<li>Mettez \u00e0 l&rsquo;\u00e9chelle chaque composant de solution avec des tol\u00e9rances justifi\u00e9es.<\/li>\n<li>Ajoutez des LFC et des contraintes de pas maximum bas\u00e9es sur la physique.<\/li>\n<li>G\u00e9rez explicitement les discontinuit\u00e9s et les \u00e9v\u00e9nements.<\/li>\n<li>Enregistrez les \u00e9tapes, les rejets et les raisons limitatives accept\u00e9es.<\/li>\n<li>R\u00e9p\u00e9tez la simulation avec des tol\u00e9rances plus serr\u00e9es.<\/li>\n<li>Comparez les quantit\u00e9s physiques plut\u00f4t que uniquement les journaux de solveurs.<\/li>\n<li>Ex\u00e9cution de r\u00e9f\u00e9rence totale \u00e0 la m\u00eame erreur mesur\u00e9e.<\/li>\n<\/ol>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">M\u00e9thodes d&rsquo;int\u00e9gration temporelle pour les solveurs PDE&nbsp;: sch\u00e9mas explicites ou implicites<\/a>&nbsp;: comparez les r\u00e9gions de stabilit\u00e9, l&rsquo;amortissement, la rigidit\u00e9 et le co\u00fbt de calcul.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\">M\u00e9thodes implicites vs explicites&nbsp;: stabilit\u00e9, pr\u00e9cision et quand utiliser chacune<\/a>&nbsp;: s\u00e9parer la stabilit\u00e9 num\u00e9rique de la pr\u00e9cision temporelle.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Choisir le bon solveur Python PDE&nbsp;: Fipy vs Py-PDE vs Fenics<\/a> &#8211; comparer les frameworks Python et leurs flux de travail d&rsquo;int\u00e9gration temporelle.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">comment g\u00e8re les maillages et les structures de grille<\/a> \u2014 Comprendre comment la taille des cellules et la structure du maillage affectent les limites de stabilit\u00e9.<\/li>\n<\/ul>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL : pas de temps automatique et s\u00e9lection des commandes dans les probl\u00e8mes d\u00e9pendant du temps<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentation PISM : pas de temps<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind et Wang : pas de temps adaptatif et stabilit\u00e9 de calcul<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentation Scipy SOLVE_IVP<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">Documentation SCIML TSIT5<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentation FIPY : pas adaptatif<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale&nbsp;: Comprendre la condition LFC<\/a><\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Le pas de temps adaptatif am\u00e9liore l&rsquo;efficacit\u00e9 en associant l&rsquo;effort de calcul \u00e0 la solution \u00e9volutive. Il r\u00e9duit l&rsquo;\u00e9tape pr\u00e8s des transitoires rapides et l&rsquo;augmente lorsque la solution devient lisse.<\/p>\n<p>Les paires Runge-Kutta int\u00e9gr\u00e9es estiment l&rsquo;erreur \u00e0 partir des \u00e9tapes partag\u00e9es. Le doublement par \u00e9tapes compare une \u00e9tape compl\u00e8te avec deux demi-\u00e9tapes. Les m\u00e9thodes BDF d&rsquo;ordre variable utilisent l&rsquo;historique des solutions, la pr\u00e9diction et les diff\u00e9rences divis\u00e9es pour contr\u00f4ler \u00e0 la fois la taille et l&rsquo;ordre des pas.<\/p>\n<p>Le contr\u00f4le des erreurs ne remplace pas l&rsquo;analyse de stabilit\u00e9. Les m\u00e9thodes explicites doivent respecter les restrictions de LFC et de diffusion. Les m\u00e9thodes implicites ont encore besoin d&rsquo;\u00e9tapes suffisamment petites pour r\u00e9soudre la physique et permettre une convergence non lin\u00e9aire fiable.<\/p>\n<p>FIPY ne fournit pas d&rsquo;adaptation temporelle automatique gr\u00e2ce aux arguments ordinaires <code>rtol<\/code> et <code>atol<\/code> \u00e0 <code>solve()<\/code>. Les workflows adaptatifs de Fipy n\u00e9cessitent un contr\u00f4leur d&rsquo;\u00e9tape externe ou une logique d&rsquo;erreur personnalis\u00e9e.<\/p>\n<p>Un calcul adaptatif cr\u00e9dible documente ses tol\u00e9rances, sa norme d&rsquo;erreur, son contr\u00f4leur, ses \u00e9tapes rejet\u00e9es, ses contraintes de stabilit\u00e9, sa gestion des \u00e9v\u00e9nements et sa convergence dans des param\u00e8tres plus stricts. L&rsquo;objectif n&rsquo;est pas de minimiser le nombre d&rsquo;\u00e9tapes. Il s&rsquo;agit d&rsquo;atteindre la pr\u00e9cision physique requise avec le co\u00fbt de calcul fiable le plus bas.<\/p>\n<\/article>\n","protected":false,"raw":"<article>\n<p>Le pas de temps adaptatif modifie la taille du pas de temps au cours d'une simulation. Le solveur fait des \u00e9tapes plus petites lorsque la solution change rapidement et des \u00e9tapes plus grandes lorsque l'\u00e9volution se lisse.<\/p>\n<p>Un calcul \u00e0 pas fixe doit utiliser une valeur de <code>\u0394t<\/code> tout au long de la simulation. Cette valeur est souvent s\u00e9lectionn\u00e9e en fonction de l'\u00e9v\u00e9nement, de la transitoire ou de la restriction de stabilit\u00e9 les plus exigeants. La m\u00eame petite \u00e9tape est ensuite utilis\u00e9e pendant de longs intervalles o\u00f9 cela n'est pas n\u00e9cessaire.<\/p>\n<p>Une m\u00e9thode adaptative estime l'erreur de chaque \u00e9tape propos\u00e9e. Il accepte l'\u00e9tape lorsque l'erreur normalis\u00e9e est inf\u00e9rieure \u00e0 la tol\u00e9rance demand\u00e9e et la rejette lorsque l'erreur est trop importante. Un contr\u00f4leur s\u00e9lectionne ensuite une nouvelle taille de pas.<\/p>\n<p>Le contr\u00f4le des erreurs n'est qu'une partie du processus. Les m\u00e9thodes explicites doivent toujours respecter les limites de LFC et de diffusion. Les m\u00e9thodes implicites peuvent n\u00e9cessiter des restrictions pour la pr\u00e9cision, la convergence non lin\u00e9aire, la r\u00e9solution des ondes, les \u00e9v\u00e9nements ou les contraintes physiques. Un solveur fiable combine ces exigences plut\u00f4t que de permettre \u00e0 une estimation d'erreur de tout contr\u00f4ler.<\/p>\n<h2>Qu'est-ce que le pas de temps adaptatif&nbsp;?<\/h2>\n<p>Apr\u00e8s discr\u00e9tisation spatiale, une PDE d\u00e9pendante du temps devient g\u00e9n\u00e9ralement un syst\u00e8me d'\u00e9quations diff\u00e9rentielles ordinaires :<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Une m\u00e9thode num\u00e9rique fait passer la solution de <code>t\u207f<\/code> \u00e0&nbsp;:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Un solveur adaptatif suit un cycle d'acceptation ou de rejet :<\/p>\n<ol>\n<li>Proposez un pas de temps.<\/li>\n<li>Calculer une solution d'essai.<\/li>\n<li>Estimez l'erreur temporelle locale.<\/li>\n<li>Normaliser l'erreur en utilisant les tol\u00e9rances absolues et relatives.<\/li>\n<li>Accepter ou rejeter l'\u00e9tape de proc\u00e8s.<\/li>\n<li>S\u00e9lectionnez la taille de l'\u00e9tape suivante.<\/li>\n<\/ol>\n<p>Les \u00e9tapes rejet\u00e9es n'avancent pas le temps de simulation. Le solveur restaure l'\u00e9tat accept\u00e9 pr\u00e9c\u00e9dent et r\u00e9p\u00e8te le calcul avec une valeur plus petite de <code>\u0394t<\/code>.<\/p>\n<h2>Erreur locale et erreur globale<\/h2>\n<p>L'erreur de troncature locale est l'erreur introduite par un pas de temps lorsque l'\u00e9tape commence \u00e0 partir de la solution exacte.<\/p>\n<p>L'erreur globale est la diff\u00e9rence accumul\u00e9e entre les solutions num\u00e9riques et exactes apr\u00e8s de nombreuses \u00e9tapes.<\/p>\n<p>Pour une m\u00e9thode de commande <code>p<\/code>&nbsp;:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Les m\u00e9thodes adaptatives estiment normalement l'erreur locale. Garder chaque estimation locale en dessous d'une tol\u00e9rance ne fournit pas une limite universelle rigoureuse sur l'erreur globale, mais elle offre un m\u00e9canisme de contr\u00f4le pratique efficace.<\/p>\n<h2>Tol\u00e9rances absolues et relatives<\/h2>\n<p>Une valeur d'erreur brute a peu de sens sans l'\u00e9chelle de chaque composant de solution. Les solveurs adaptatifs calculent donc une erreur normalis\u00e9e.<\/p>\n<p>Une \u00e9chelle de composantes communes est :<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>L'erreur quadratique moyenne pond\u00e9r\u00e9e normalis\u00e9e est :<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>L'\u00e9tape est normalement accept\u00e9e lorsque :<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>La tol\u00e9rance absolue contr\u00f4le les composants proches de z\u00e9ro. La tol\u00e9rance relative contr\u00f4le les composantes dont la magnitude est grande par rapport \u00e0 <code>atol<\/code>.<\/p>\n<p>Diff\u00e9rents champs peuvent n\u00e9cessiter des tol\u00e9rances absolues diff\u00e9rentes. Une temp\u00e9rature mesur\u00e9e dans des centaines de Kelvin ne doit pas n\u00e9cessairement utiliser la m\u00eame tol\u00e9rance absolue qu'une concentration proche de <code>10\u207b\u2079<\/code>.<\/p>\n<h2>Comment la prochaine \u00e9tape est s\u00e9lectionn\u00e9e<\/h2>\n<p>Si l'erreur locale estim\u00e9e se comporte comme&nbsp;:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Un contr\u00f4leur de base peut utiliser :<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>Le facteur de s\u00e9curit\u00e9 est inf\u00e9rieur \u00e0 un. Cela r\u00e9duit le risque que la prochaine \u00e9tape se situe directement sur la limite de rejet.<\/p>\n<p>Les impl\u00e9mentations de production limitent \u00e9galement les changements de taille des \u00e9tapes&nbsp;:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>L'exposant correct d\u00e9pend de l'ordre repr\u00e9sent\u00e9 par l'estimateur d'erreur et la convention de contr\u00f4leur. Il ne doit pas \u00eatre copi\u00e9 aveugl\u00e9ment entre les m\u00e9thodes non li\u00e9es.<\/p>\n<h2>Contr\u00f4leurs I, PI et PID<\/h2>\n<p>Un contr\u00f4leur int\u00e9gr\u00e9 simple utilise uniquement l'erreur normalis\u00e9e actuelle. Cela peut entra\u00eener une alternance de l'historique des pas de temps entre les augmentations et les rejets agressifs.<\/p>\n<p>Les contr\u00f4leurs PI et PID utilisent \u00e9galement les erreurs des \u00e9tapes pr\u00e9c\u00e9dentes accept\u00e9es. Cela produit des changements de taille de pas plus fluides et peut r\u00e9duire les taux de rejet.<\/p>\n<p>Un contr\u00f4leur PI simplifi\u00e9 a la forme :<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Les coefficients d\u00e9pendent de l'ordre de m\u00e9thode et de la conception du contr\u00f4leur. Un contr\u00f4le sophistiqu\u00e9 est utile, mais il ne peut pas r\u00e9parer un estimateur d'erreurs inexact ou un int\u00e9grateur de temps inadapt\u00e9.<\/p>\n<h2>Paires Runge-Kutta int\u00e9gr\u00e9es<\/h2>\n<p>Une paire Runge-Kutta int\u00e9gr\u00e9e calcule deux approximations \u00e0 partir du m\u00eame ensemble d'\u00e9tapes interm\u00e9diaires.<\/p>\n<p>Les deux formules ont des ordres diff\u00e9rents :<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>La diff\u00e9rence fournit une estimation d'erreur&nbsp;:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>\u00c9tant donn\u00e9 que les deux formules partagent leurs \u00e9valuations sur sc\u00e8ne, l'estimateur est beaucoup moins cher que de r\u00e9aliser deux int\u00e9grations ind\u00e9pendantes.<\/p>\n<p>Les m\u00e9thodes Runge-Kutta explicites int\u00e9gr\u00e9es sont les mieux adapt\u00e9es aux syst\u00e8mes non raides. Si la rigidit\u00e9 contr\u00f4le la taille du pas, augmentant ou d\u00e9croissant <code>\u0394t<\/code><\/p><h2>Dormand-Prince 5(4)<\/h2>\n<p>Dormand-Prince 5(4) est une paire int\u00e9gr\u00e9e en sept \u00e9tapes. Il produit une solution de cinqui\u00e8me ordre et une estimation d'erreur du quatri\u00e8me ordre.<\/p>\n<p>La paire utilise une extrapolation locale&nbsp;: l'approximation du cinqui\u00e8me ordre devient la solution accept\u00e9e, tandis que la formule d'ordre inf\u00e9rieur contr\u00f4le l'\u00e9tape.<\/p>\n<p>Il a \u00e9galement une propri\u00e9t\u00e9 FSAL en usage ordinaire. La derni\u00e8re \u00e9valuation d\u00e9riv\u00e9e d'une \u00e9tape accept\u00e9e peut devenir la premi\u00e8re \u00e9valuation de la prochaine \u00e9tape, r\u00e9duisant le nombre de nouvelles \u00e9valuations de fonctions apr\u00e8s le d\u00e9marrage.<\/p>\n<p>Dormand-Prince est utilis\u00e9 par Scipy <code>RK45<\/code> et MATLAB <code>ode45<\/code>. Il s'agit d'un choix g\u00e9n\u00e9ral solide pour les probl\u00e8mes de valeur initiale non rigides et fluides.<\/p>\n<h2>tsit5<\/h2>\n<p>tsit5 est la m\u00e9thode runge-kutta int\u00e9gr\u00e9e de tsitouras 5(4) . Il est largement utilis\u00e9 dans l'\u00e9cosyst\u00e8me SCIML comme m\u00e9thode par d\u00e9faut pour les probl\u00e8mes non raides aux tol\u00e9rances ordinaires.<\/p>\n<p>La m\u00e9thode est con\u00e7ue pour fournir un \u00e9quilibre favorable entre la qualit\u00e9 d'estimation des erreurs, le co\u00fbt de la sc\u00e8ne et l'efficacit\u00e9 pratique.<\/p>\n<p>Cela reste une m\u00e9thode explicite. Si une PDE semi-discr\u00e8te est rigide en raison de la diffusion, des r\u00e9actions ou des \u00e9chelles de temps fortement s\u00e9par\u00e9es, une m\u00e9thode implicite, Rosenbrock, BDF ou IMEX peut \u00eatre plus efficace.<\/p>\n<h2>Bogacki\u2013Shampe 3(2)<\/h2>\n<p>Bogacki\u2013Shamine 3(2) est une paire int\u00e9gr\u00e9e en quatre \u00e9tapes. Il fournit une solution accept\u00e9e au troisi\u00e8me ordre avec un estimateur d'erreurs de deuxi\u00e8me ordre.<\/p>\n<p>Il est impl\u00e9ment\u00e9 comme <code>RK23<\/code> dans Scipy et sous-tend le <code>ode23<\/code> de Matlab.<\/p>\n<p>La paire peut \u00eatre utile lorsque la pr\u00e9cision mod\u00e9r\u00e9e est suffisante ou lorsque les \u00e9valuations des fonctions sont peu co\u00fbteuses. Son ordre inf\u00e9rieur peut n\u00e9cessiter plus d'\u00e9tapes accept\u00e9es qu'une m\u00e9thode de cinqui\u00e8me ordre lorsque des tol\u00e9rances strictes sont demand\u00e9es.<\/p>\n<h2>doublonnage<\/h2>\n<p>Le doublement par \u00e9tapes estime l'erreur temporelle en comparant la m\u00eame m\u00e9thode num\u00e9rique \u00e0 deux r\u00e9solutions.<\/p>\n<p>La proc\u00e9dure calcule :<\/p>\n<ol>\n<li>Un pas de longueur complet <code>\u0394t<\/code>.<\/li>\n<li>Deux demi-pas de longueur <code>\u0394t\/2<\/code>.<\/li>\n<li>La diff\u00e9rence entre les deux r\u00e9sultats.<\/li>\n<\/ol>\n<p>Pour une m\u00e9thode de commande <code>p<\/code>, une estimation de l'erreur dans le r\u00e9sultat raffin\u00e9 en deux demi-\u00e9tapes est&nbsp;:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>La solution accept\u00e9e devrait normalement \u00eatre le r\u00e9sultat des deux demi-\u00e9tapes car elle est plus pr\u00e9cise.<\/p>\n<p>Le doublement par \u00e9tapes n\u00e9cessite trois applications de la m\u00e9thode sous-jacente&nbsp;: une \u00e9tape compl\u00e8te et deux demi-\u00e9tapes. Une impl\u00e9mentation implicite peut donc n\u00e9cessiter trois r\u00e9solutions non lin\u00e9aires ou lin\u00e9aires \u00e0 moins que certains travaux de configuration ne puissent \u00eatre r\u00e9utilis\u00e9s.<\/p>\n<h2>Estimation r\u00e9siduelle et d\u00e9fectueuse<\/h2>\n<p>Les m\u00e9thodes bas\u00e9es sur les r\u00e9sidus \u00e9valuent la pr\u00e9cision avec laquelle une trajectoire num\u00e9rique reconstruite satisfait l'\u00e9quation diff\u00e9rentielle entre les points accept\u00e9s.<\/p>\n<p>Une reconstruction continue <code>\u0169(t)<\/code> pr\u00e9sente un d\u00e9faut&nbsp;:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>Le d\u00e9faut peut prendre en charge une estimation d'erreur lorsqu'il est combin\u00e9 avec des informations de stabilit\u00e9 ou une norme appropri\u00e9e.<\/p>\n<p>Le r\u00e9sidu alg\u00e9brique d'une solution implicite n'est pas automatiquement une estimation d'erreur temporelle. La m\u00e9thode de Newton peut r\u00e9duire l'\u00e9quation discr\u00e8te r\u00e9siduelle presque \u00e0 z\u00e9ro, m\u00eame lorsque le pas de temps est trop important pour repr\u00e9senter la solution physique avec pr\u00e9cision.<\/p>\n<p>La convergence alg\u00e9brique et l'erreur de troncature temporelle n\u00e9cessitent donc des contr\u00f4les distincts.<\/p>\n<h2>M\u00e9thodes adaptatives BDF<\/h2>\n<p>Les formules de diff\u00e9renciation vers l'arri\u00e8re sont des m\u00e9thodes implicites en plusieurs \u00e9tapes utilis\u00e9es pour les syst\u00e8mes rigides. Les impl\u00e9mentations d'ordre variable basculent g\u00e9n\u00e9ralement entre les commandes un \u00e0 cinq.<\/p>\n<p>Un solveur BDF stocke les informations des \u00e9tats accept\u00e9s pr\u00e9c\u00e9dents. Il construit un pr\u00e9dicteur pour le nouvel \u00e9tat, r\u00e9sout l'\u00e9quation implicite et estime l'erreur de troncature locale \u00e0 l'aide de diff\u00e9rences divis\u00e9es ou d'une repr\u00e9sentation historique de type Nordsieck.<\/p>\n<p>Le solveur peut changer :<\/p>\n<ul>\n<li>La taille du pas de temps<\/li>\n<li>la commande BDF<\/li>\n<li>La fr\u00e9quence des mises \u00e0 jour jacobiennes<\/li>\n<li>La configuration du solveur lin\u00e9aire ou du pr\u00e9conditionneur<\/li>\n<\/ul>\n<p>Une solution fluide peut justifier une augmentation de la commande. Un \u00e9v\u00e9nement, une phase de d\u00e9marrage, une discontinuit\u00e9 ou un \u00e9chec du test d'erreur peut forcer le solveur \u00e0 r\u00e9duire son ordre et sa taille de pas.<\/p>\n<p>BDF2 est une formule de diff\u00e9renciation en arri\u00e8re. Ce n'est pas Crank \u2013 Nicolson, bien que les deux m\u00e9thodes soient de second ordre.<\/p>\n<h2>Contr\u00f4le des erreurs dans COMSOL BDF<\/h2>\n<p>Le contr\u00f4leur BDF de COMSOL \u00e9value une estimation de l'erreur locale moyenne pond\u00e9r\u00e9e. Une \u00e9tape passe lorsque l'erreur normalis\u00e9e est inf\u00e9rieure \u00e0 un.<\/p>\n<p>Le solveur peut utiliser des commandes BDF de un \u00e0 cinq. Il examine la douceur de la solution, s\u00e9lectionne une commande, tente une \u00e9tape et r\u00e9p\u00e8te l'\u00e9tape avec une taille plus petite lorsque le test d'erreur local \u00e9choue.<\/p>\n<p>Son journal des solveurs comprend :<\/p>\n<ul>\n<li><code>Order<\/code> pour la commande BDF actuelle<\/li>\n<li><code>Tfail<\/code> pour les tests d'erreur de pas de temps \u00e9chou\u00e9s<\/li>\n<li><code>NLfail<\/code> pour les d\u00e9faillances non lin\u00e9aires du solveur<\/li>\n<\/ul>\n<p>Un nombre \u00e9lev\u00e9 de <code>Tfail<\/code> sugg\u00e8re que le contr\u00f4leur a fr\u00e9quemment propos\u00e9 des \u00e9tapes trop importantes pour la pr\u00e9cision demand\u00e9e. Un nombre \u00e9lev\u00e9 de <code>NLfail<\/code> indique que la r\u00e9solution non lin\u00e9aire alg\u00e9brique a eu des difficult\u00e9s.<\/p>\n<p>Ces deux \u00e9checs ne doivent pas \u00eatre interpr\u00e9t\u00e9s comme le m\u00eame probl\u00e8me.<\/p>\n<p>Le m\u00e9canisme d\u00e9taill\u00e9 est d\u00e9crit dans <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">S\u00e9lection automatique de pas de temps et d'ordre dans le temps dans les probl\u00e8mes d\u00e9pendant du temps<\/a>.<\/p>\n<h2>Erreur alg\u00e9brique et erreur temporelle<\/h2>\n<p>Une m\u00e9thode implicite r\u00e9sout un syst\u00e8me non lin\u00e9aire \u00e0 chaque pas de temps. Si Newton ou le solveur lin\u00e9aire se termine trop t\u00f4t, l'erreur alg\u00e9brique peut devenir comparable \u00e0 l'erreur temporelle.<\/p>\n<p>Le contr\u00f4leur de pas de temps peut alors r\u00e9agir \u00e0 une erreur qui provient d'une convergence alg\u00e9brique incompl\u00e8te plut\u00f4t que de la discr\u00e9tisation temporelle.<\/p>\n<p>Une configuration de solveur cr\u00e9dible devrait rendre la tol\u00e9rance alg\u00e9brique suffisamment serr\u00e9e que la cible temporelle. Le rendre inutilement strict, c'est aussi du travail.<\/p>\n<p>Certains solveurs coordonnent la convergence non lin\u00e9aire et la s\u00e9lection de pas de temps. Un contr\u00f4leur non lin\u00e9aire peut r\u00e9duire l'\u00e9tape lorsque la stabilit\u00e9 de Newton n\u00e9cessite une valeur inf\u00e9rieure \u00e0 celle propos\u00e9e par l'estimateur de pr\u00e9cision BDF.<\/p>\n<h2>Limites de LFC et pas adaptatifs<\/h2>\n<p>Le contr\u00f4le d'erreur explicite ne peut pas remplacer une restriction de stabilit\u00e9 explicite.<\/p>\n<p>Pour l'advection, une limite CFL typique est :<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>Pour une diffusion explicitement int\u00e9gr\u00e9e&nbsp;:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Les constantes d\u00e9pendent de la discr\u00e9tisation spatiale, de la dimension, de la g\u00e9om\u00e9trie du maillage et de l'int\u00e9grateur de temps.<\/p>\n<p>L'\u00e9tape utilisable peut \u00eatre :<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Une m\u00e9thode Runge-Kutta adaptative peut signaler une tr\u00e8s petite erreur et devenir toujours instable si la limite CFL est viol\u00e9e.<\/p>\n<h2>Les m\u00e9thodes implicites ont-elles besoin d'une limite CFL&nbsp;?<\/h2>\n<p>Une discr\u00e9tisation implicite implicite d'un mod\u00e8le lin\u00e9aire peut ne pas avoir la m\u00eame limite de stabilit\u00e9 explicite de la LFC. Cela ne signifie pas que le pas de temps peut \u00eatre arbitrairement important.<\/p>\n<p>Les grandes \u00e9tapes implicites peuvent :<\/p>\n<ul>\n<li>Miss Waves et transitoires rapides<\/li>\n<li>Introduire un amortissement num\u00e9rique excessif<\/li>\n<li>Perdre la monotonie<\/li>\n<li>Rendre les it\u00e9rations de Newton difficiles<\/li>\n<li>traverser un \u00e9v\u00e9nement sans le r\u00e9soudre<\/li>\n<li>R\u00e9duire la pr\u00e9cision des processus non lin\u00e9aires coupl\u00e9s<\/li>\n<\/ul>\n<p>Ces restrictions doivent \u00eatre appel\u00e9es pr\u00e9cision, convergence non lin\u00e9aire ou limites de r\u00e9solution physique plut\u00f4t qu'une condition universelle de LFC.<\/p>\n<h2>Plusieurs contraintes de pas de temps<\/h2>\n<p>Les grands codes de simulation calculent souvent plusieurs tailles de pas candidates. Le PISM, par exemple, prend en compte les restrictions sp\u00e9cifiques au mod\u00e8le li\u00e9es \u00e0 l'advection, \u00e0 la diffusion, aux intervalles de rapports et \u00e0 d'autres processus physiques.<\/p>\n<p>Il est utile d'enregistrer la raison pour laquelle chaque \u00e9tape accept\u00e9e limite chaque \u00e9tape accept\u00e9e. Un calcul domin\u00e9 par un contr\u00f4leur d'erreurs n\u00e9cessite une optimisation diff\u00e9rente d'une limite limit\u00e9e par la vitesse la plus rapide ou la cellule de maillage la plus fine.<\/p>\n<p>Le PISM <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">documentation de pas-temps<\/a> d'un contr\u00f4le multi-contraintes.<\/p>\n<h2>Temps de sortie et \u00e9tapes internes<\/h2>\n<p>Les temps de sortie demand\u00e9s ne doivent pas toujours devenir des \u00e9tapes d'int\u00e9gration. De nombreux solveurs utilisent une sortie dense ou une interpolation pour calculer les r\u00e9sultats stock\u00e9s entre les niveaux de temps internes accept\u00e9s.<\/p>\n<p>Forcer chaque temps de sortie \u00e0 devenir une \u00e9tape de solveur exacte peut r\u00e9duire l'efficacit\u00e9 lorsque la sortie fr\u00e9quente est demand\u00e9e.<\/p>\n<p>L'alignement exact des \u00e9tapes peut toujours \u00eatre appropri\u00e9 lorsque :<\/p>\n<ul>\n<li>Une charge discontinue change \u00e0 un moment connu.<\/li>\n<li>Une condition aux limites change brusquement.<\/li>\n<li>Un \u00e9v\u00e9nement modifie les \u00e9quations r\u00e9gissant.<\/li>\n<li>Une action de contr\u00f4le doit se produire \u00e0 un instant pr\u00e9cis.<\/li>\n<li>La m\u00e9thode manque de sortie dense suffisamment pr\u00e9cise.<\/li>\n<\/ul>\n<p>Apr\u00e8s une discontinuit\u00e9, l'historique en plusieurs \u00e9tapes ou le contr\u00f4leur adaptatif peut avoir besoin de red\u00e9marrer.<\/p>\n<h2>Pas de temps adaptatif dans Fipy<\/h2>\n<p>FIPY r\u00e9sout des \u00e9quations de volume fini dans l'espace discr\u00e9tis\u00e9 mais ne tourne pas un appel tel que&nbsp;:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>dans un contr\u00f4leur d'erreur temporelle int\u00e9gr\u00e9. Les tol\u00e9rances des solveurs dans FIPY contr\u00f4lent principalement la r\u00e9solution lin\u00e9aire alg\u00e9brique.<\/p>\n<p>La documentation FIPY actuelle recommande le package externe <code>steppyngstounes<\/code> pour la gestion des \u00e9tapes adaptatives. Les exemples de FIPY utilisent des erreurs de contr\u00f4leur d\u00e9riv\u00e9es des r\u00e9sidus d'\u00e9quation, des contr\u00f4les de conservation ou d'autres crit\u00e8res sp\u00e9cifiques \u00e0 l'application.<\/p>\n<p>Consultez la <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">documentation pas \u00e0 pas adaptative FIPY<\/a>.<\/p>\n<h2>Un exemple de double-doublement de Fipy<\/h2>\n<p>L'exemple \u00e9ducatif suivant enveloppe la discr\u00e9tisation transitoire implicite du premier ordre de Fipy dans un contr\u00f4leur de doublage par \u00e9tapes.<\/p>\n<p>Il effectue une \u00e9tape compl\u00e8te d'Euler vers l'arri\u00e8re et deux demi-pas. Le r\u00e9sultat en deux demi-\u00e9tapes est accept\u00e9 lorsque son erreur normalis\u00e9e est inf\u00e9rieure \u00e0 un.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Cette mise en \u0153uvre est intentionnellement simple. Chaque intervalle de tentatives n\u00e9cessite trois r\u00e9solutions implicites, donc cela peut \u00eatre co\u00fbteux. Un BDF de production ou une m\u00e9thode embarqu\u00e9e fournit normalement un estimateur plus efficace et un contr\u00f4leur PI ou PID plus lisse.<\/p>\n<h2>Ajout d'une contrainte de LCF explicite<\/h2>\n<p>Pour un terme d'advection explicitement int\u00e9gr\u00e9, l'\u00e9tape s\u00e9lectionn\u00e9e par erreur peut \u00eatre limit\u00e9e s\u00e9par\u00e9ment :<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Pour les maillages non uniformes, utilisez l'\u00e9chelle de cellule locale la plus restrictive ou une estimation bas\u00e9e sur le visage appropri\u00e9 \u00e0 la m\u00e9thode spatiale.<\/p>\n<h2>Choisir des tol\u00e9rances<\/h2>\n<p>Il n'y a pas de paires universelles de tol\u00e9rances adapt\u00e9es \u00e0 chaque PDE.<\/p>\n<p>Un processus pratique est :<\/p>\n<ol>\n<li>Choisissez des tol\u00e9rances absolues en fonction de l'\u00e9chelle physique de chaque champ.<\/li>\n<li>S\u00e9lectionnez une tol\u00e9rance relative mod\u00e9r\u00e9e.<\/li>\n<li>R\u00e9p\u00e9tez la simulation avec des tol\u00e9rances r\u00e9duites d'un facteur dix.<\/li>\n<li>Comparez les quantit\u00e9s d'int\u00e9r\u00eat scientifique.<\/li>\n<li>Continuez \u00e0 resserrer jusqu'\u00e0 ce que le r\u00e9sultat change moins que l'erreur temporelle accept\u00e9e.<\/li>\n<\/ol>\n<p>La r\u00e9duction de <code>rtol<\/code> rend l'exigence plus stricte et augmente normalement le co\u00fbt de calcul. L'augmentation de <code>rtol<\/code> assouplit le besoin et r\u00e9duit normalement la pr\u00e9cision.<\/p>\n<p>Une tol\u00e9rance absolue trop faible peut forcer un travail excessif lorsqu'un composant passe par z\u00e9ro. Celui qui est trop grand peut masquer des changements significatifs dans de petites variables.<\/p>\n<h2>Rejet d'\u00e9tape<\/h2>\n<p>Une \u00e9tape explicite rejet\u00e9e gaspille les \u00e9valuations d'\u00e9tape. Une \u00e9tape implicite rejet\u00e9e peut gaspiller des it\u00e9rations non lin\u00e9aires, des calculs jacobiens, des factorisations et la configuration du pr\u00e9conditionneur.<\/p>\n<p>Un petit nombre d'\u00e9tapes rejet\u00e9es est normal. Un taux de rejet \u00e9lev\u00e9 peut indiquer :<\/p>\n<ul>\n<li>Une premi\u00e8re \u00e9tape trop importante<\/li>\n<li>Un contr\u00f4leur trop agressif<\/li>\n<li>une discontinuit\u00e9 ou un \u00e9v\u00e9nement<\/li>\n<li>Tol\u00e9rances mal \u00e9volu\u00e9es<\/li>\n<li>Un estimateur d'erreurs non fiable<\/li>\n<li>Rigidit\u00e9 dans une m\u00e9thode explicite<\/li>\n<li>Convergence non lin\u00e9aire incompl\u00e8te<\/li>\n<li>Un mod\u00e8le incorrect ou mal conditionn\u00e9<\/li>\n<\/ul>\n<p>Le r\u00e9glage du contr\u00f4leur ne doit pas \u00eatre utilis\u00e9 pour masquer les d\u00e9faillances du mod\u00e8le ou du solveur.<\/p>\n<h2>Lorsque le pas adaptatif peut manquer une dynamique importante<\/h2>\n<p>Un estimateur d'erreurs mesure la solution num\u00e9rique g\u00e9n\u00e9r\u00e9e par la m\u00e9thode choisie. Il ne sait pas automatiquement quelles caract\u00e9ristiques physiques comptent.<\/p>\n<p>Un solveur peut prendre des mesures trop importantes pour :<\/p>\n<ul>\n<li>impulsions externes courtes<\/li>\n<li>Ondes haute fr\u00e9quence<\/li>\n<li>\u00c9v\u00e9nements de seuil<\/li>\n<li>Activation du contact<\/li>\n<li>Changements de phase rapides<\/li>\n<li>Termes de la source discontinue<\/li>\n<\/ul>\n<p>Utilisez des contraintes d'\u00e9tape maximales, une gestion des \u00e9v\u00e9nements ou des niveaux de temps forc\u00e9s lorsque ces fonctionnalit\u00e9s doivent \u00eatre r\u00e9solues.<\/p>\n<h2>Lorsque des \u00e9tapes fixes sont utiles<\/h2>\n<p>Le pas de temps fixe reste appropri\u00e9 lorsque :<\/p>\n<ul>\n<li>Une m\u00e9thode de conservation de la structure n\u00e9cessite une \u00e9tape constante.<\/li>\n<li>Des trajectoires discr\u00e8tes identiques sont n\u00e9cessaires pour le d\u00e9bogage.<\/li>\n<li>La solution a une \u00e9chelle de temps presque uniforme.<\/li>\n<li>La simulation est synchronis\u00e9e avec les donn\u00e9es mesur\u00e9es.<\/li>\n<li>Un GPU ou une impl\u00e9mentation parall\u00e8le fonctionne mieux avec des charges de travail pr\u00e9visibles.<\/li>\n<li>L'\u00e9tude de convergence de pas de temps n\u00e9cessite un raffinement contr\u00f4l\u00e9.<\/li>\n<\/ul>\n<p>Les solveurs adaptatifs peuvent toujours renvoyer des r\u00e9sultats \u00e0 des temps de sortie communs gr\u00e2ce \u00e0 l'interpolation. Il n'est donc pas n\u00e9cessaire d'effectuer une \u00e9tape fixe pour comparer uniquement les ex\u00e9cutions \u00e0 des horodatages sp\u00e9cifi\u00e9s.<\/p>\n<h2>Pas adaptatif et reproductibilit\u00e9<\/h2>\n<p>De petits changements dans les tol\u00e9rances, les versions de solveur, l'arithm\u00e9tique mat\u00e9rielle ou la convergence non lin\u00e9aire peuvent modifier la s\u00e9quence d'\u00e9tapes accept\u00e9e.<\/p>\n<p>Un rapport reproductible doit enregistrer :<\/p>\n<ul>\n<li>Int\u00e9grateur de temps et version<\/li>\n<li>Tol\u00e9rances relatives et absolues<\/li>\n<li>\u00c9tapes initiales, minimales et maximales<\/li>\n<li>Norme d'erreur<\/li>\n<li>Type de contr\u00f4leur<\/li>\n<li>LFC ou restrictions bas\u00e9es sur la physique<\/li>\n<li>Heures d'\u00e9v\u00e9nement<\/li>\n<li>Nombre d'\u00e9tapes accept\u00e9s et rejet\u00e9s<\/li>\n<li>Tol\u00e9rances non lin\u00e9aires et lin\u00e9aires du solveur<\/li>\n<\/ul>\n<h2>erreurs courantes<\/h2>\n<ul>\n<li>Utilisation de la tol\u00e9rance r\u00e9siduelle alg\u00e9brique comme tol\u00e9rance d'erreur temporelle<\/li>\n<li>En supposant que FIPY change <code>dt<\/code> \u00e0 <code>rtol<\/code> et <code>atol<\/code> les arguments<\/li>\n<li>Accepter le r\u00e9sultat complet moins pr\u00e9cis en cas de doublage par \u00e9tapes<\/li>\n<li>Oublier le facteur <code>2^p - 1<\/code> dans l'estimation de Richardson<\/li>\n<li>Utilisation d'un exposant de contr\u00f4leur fixe pour chaque estimateur<\/li>\n<li>Ignorer la limite CFL d'un sch\u00e9ma explicite<\/li>\n<li>Appeler toutes les limitations implicites une condition CFL<\/li>\n<li>Utilisation de Dormand-Prince pour un probl\u00e8me de diffusion fortement raide<\/li>\n<li>Desserrage <code>rtol<\/code> lorsqu'une plus grande pr\u00e9cision est requise<\/li>\n<li>Permettre \u00e0 une \u00e9tape de franchir une charge discontinue sans \u00e9v\u00e9nement<\/li>\n<li>D\u00e9routant <code>Tfail<\/code> avec une d\u00e9faillance non lin\u00e9aire du solveur<\/li>\n<li>Comparaison des solveurs adaptatifs uniquement par le nombre de pas accept\u00e9<\/li>\n<\/ul>\n<h2>Un flux de travail pratique<\/h2>\n<ol>\n<li>V\u00e9rifiez d'abord l'impl\u00e9mentation par \u00e9tapes fixes.<\/li>\n<li>D\u00e9terminez si le syst\u00e8me semi-discret est rigide.<\/li>\n<li>S\u00e9lectionnez un estimateur d'erreurs appropri\u00e9 \u00e0 la m\u00e9thode.<\/li>\n<li>Mettez \u00e0 l'\u00e9chelle chaque composant de solution avec des tol\u00e9rances justifi\u00e9es.<\/li>\n<li>Ajoutez des LFC et des contraintes de pas maximum bas\u00e9es sur la physique.<\/li>\n<li>G\u00e9rez explicitement les discontinuit\u00e9s et les \u00e9v\u00e9nements.<\/li>\n<li>Enregistrez les \u00e9tapes, les rejets et les raisons limitatives accept\u00e9es.<\/li>\n<li>R\u00e9p\u00e9tez la simulation avec des tol\u00e9rances plus serr\u00e9es.<\/li>\n<li>Comparez les quantit\u00e9s physiques plut\u00f4t que uniquement les journaux de solveurs.<\/li>\n<li>Ex\u00e9cution de r\u00e9f\u00e9rence totale \u00e0 la m\u00eame erreur mesur\u00e9e.<\/li>\n<\/ol>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">M\u00e9thodes d'int\u00e9gration temporelle pour les solveurs PDE&nbsp;: sch\u00e9mas explicites ou implicites<\/a>&nbsp;: comparez les r\u00e9gions de stabilit\u00e9, l'amortissement, la rigidit\u00e9 et le co\u00fbt de calcul.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\">M\u00e9thodes implicites vs explicites&nbsp;: stabilit\u00e9, pr\u00e9cision et quand utiliser chacune<\/a>&nbsp;: s\u00e9parer la stabilit\u00e9 num\u00e9rique de la pr\u00e9cision temporelle.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Choisir le bon solveur Python PDE&nbsp;: Fipy vs Py-PDE vs Fenics<\/a> - comparer les frameworks Python et leurs flux de travail d'int\u00e9gration temporelle.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">comment g\u00e8re les maillages et les structures de grille<\/a> \u2014 Comprendre comment la taille des cellules et la structure du maillage affectent les limites de stabilit\u00e9.<\/li>\n<\/ul>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL : pas de temps automatique et s\u00e9lection des commandes dans les probl\u00e8mes d\u00e9pendant du temps<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentation PISM : pas de temps<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind et Wang : pas de temps adaptatif et stabilit\u00e9 de calcul<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentation Scipy SOLVE_IVP<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">Documentation SCIML TSIT5<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentation FIPY : pas adaptatif<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale&nbsp;: Comprendre la condition LFC<\/a><\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Le pas de temps adaptatif am\u00e9liore l'efficacit\u00e9 en associant l'effort de calcul \u00e0 la solution \u00e9volutive. Il r\u00e9duit l'\u00e9tape pr\u00e8s des transitoires rapides et l'augmente lorsque la solution devient lisse.<\/p>\n<p>Les paires Runge-Kutta int\u00e9gr\u00e9es estiment l'erreur \u00e0 partir des \u00e9tapes partag\u00e9es. Le doublement par \u00e9tapes compare une \u00e9tape compl\u00e8te avec deux demi-\u00e9tapes. Les m\u00e9thodes BDF d'ordre variable utilisent l'historique des solutions, la pr\u00e9diction et les diff\u00e9rences divis\u00e9es pour contr\u00f4ler \u00e0 la fois la taille et l'ordre des pas.<\/p>\n<p>Le contr\u00f4le des erreurs ne remplace pas l'analyse de stabilit\u00e9. Les m\u00e9thodes explicites doivent respecter les restrictions de LFC et de diffusion. Les m\u00e9thodes implicites ont encore besoin d'\u00e9tapes suffisamment petites pour r\u00e9soudre la physique et permettre une convergence non lin\u00e9aire fiable.<\/p>\n<p>FIPY ne fournit pas d'adaptation temporelle automatique gr\u00e2ce aux arguments ordinaires <code>rtol<\/code> et <code>atol<\/code> \u00e0 <code>solve()<\/code>. Les workflows adaptatifs de Fipy n\u00e9cessitent un contr\u00f4leur d'\u00e9tape externe ou une logique d'erreur personnalis\u00e9e.<\/p>\n<p>Un calcul adaptatif cr\u00e9dible documente ses tol\u00e9rances, sa norme d'erreur, son contr\u00f4leur, ses \u00e9tapes rejet\u00e9es, ses contraintes de stabilit\u00e9, sa gestion des \u00e9v\u00e9nements et sa convergence dans des param\u00e8tres plus stricts. L'objectif n'est pas de minimiser le nombre d'\u00e9tapes. Il s'agit d'atteindre la pr\u00e9cision physique requise avec le co\u00fbt de calcul fiable le plus bas.<\/p>\n<\/article>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Le pas de temps adaptatif ajuste dynamiquement \u0394T en fonction de l&rsquo;erreur estim\u00e9e. Apprenez les paires RK embarqu\u00e9es, l&rsquo;estimation des erreurs BDF, les contraintes CFL et l&rsquo;impl\u00e9mentation de FIPY.<\/p>\n","protected":false,"raw":"Le pas de temps adaptatif ajuste dynamiquement \u0394T en fonction de l'erreur estim\u00e9e. Apprenez les paires RK embarqu\u00e9es, l'estimation des erreurs BDF, les contraintes CFL et l'impl\u00e9mentation de FIPY."},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=501","iawp_total_views":2,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1289","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pas de temps adaptatif pour les solveurs PDE<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pas de temps adaptatif pour les solveurs PDE\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:31:21+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL\",\"datePublished\":\"2026-08-21T14:31:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"wordCount\":4044,\"commentCount\":0,\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/\",\"name\":\"Pas de temps adaptatif pour les solveurs PDE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:31:21+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pas de temps adaptatif pour les solveurs PDE","description":"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/","og_locale":"fr_FR","og_type":"article","og_title":"Pas de temps adaptatif pour les solveurs PDE","og_description":"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.","og_url":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:31:21+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Tomas Delgado","Dur\u00e9e de lecture estim\u00e9e":"22 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL","datePublished":"2026-08-21T14:31:21+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/"},"wordCount":4044,"commentCount":0,"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/","url":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/","name":"Pas de temps adaptatif pour les solveurs PDE","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:31:21+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"D\u00e9couvrez comment les paires Runge\u2013Kutta, le doublement par \u00e9tapes, les contr\u00f4leurs BDF, les limites CFL, les tol\u00e9rances et les flux de travail Fipy adaptent les pas de temps PDE.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/adaptive-time-stepping-pde-solvers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Pas de temps adaptatif pour les solveurs PDE\u00a0: estimation des erreurs et CFL"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1289"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1289\/revisions"}],"predecessor-version":[{"id":1401,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1289\/revisions\/1401"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}