{"id":1298,"date":"2026-08-21T14:31:13","date_gmt":"2026-08-21T14:31:13","guid":{"rendered":"https:\/\/matforge.org\/?p=1298","raw":"https:\/\/matforge.org\/?p=1298"},"modified":"2026-08-21T14:31:13","modified_gmt":"2026-08-21T14:31:13","slug":"error-estimation-verification-methods","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/","title":{"rendered":"M\u00e9thodes d&rsquo;estimation et de v\u00e9rification des erreurs\u00a0: de l&rsquo;erreur de troncature \u00e0 la v\u00e9rification du code","raw":"M\u00e9thodes d'estimation et de v\u00e9rification des erreurs\u00a0: de l'erreur de troncature \u00e0 la v\u00e9rification du code"},"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\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li><strong>L&rsquo;erreur de troncature est le fondement de toute v\u00e9rification de code<\/strong> \u2014 Comprendre la d\u00e9rivation de la s\u00e9rie Taylor explique pourquoi le MMS fonctionne et pourquoi les taux de convergence correspondent aux pr\u00e9dictions th\u00e9oriques.<\/li>\n<li><strong>La m\u00e9thode des solutions manufactur\u00e9es (MMS) est d\u00e9sormais automatis\u00e9e<\/strong> &#8211; des frameworks comme Moose et FenicsX utilisent Sympy pour d\u00e9river symboliquement des termes sources, \u00e9liminant les erreurs de calcul manuel qui ont tourment\u00e9 les premiers efforts de v\u00e9rification.<\/li>\n<li><strong>Vous n&rsquo;avez besoin que de 3 \u00e0 4 raffinements de maillage<\/strong> &#8211; une fois que l&rsquo;ordre de pr\u00e9cision observ\u00e9 correspond \u00e0 la pr\u00e9diction th\u00e9orique, le raffinement est un effort inutile. La vraie question est&nbsp;: quand la v\u00e9rification est-elle \u00ab\u00a0assez bonne\u00a0\u00bb&nbsp;?<\/li>\n<li><strong>Les termes d&rsquo;erreur d&rsquo;ordre de t\u00eate sont Diagnostic<\/strong> \u2014 la structure de l&rsquo;extension de l&rsquo;erreur de troncature vous indique exactement quelle approximation d\u00e9riv\u00e9e \u00e9choue, guidant votre s\u00e9lection de sch\u00e9ma.<\/li>\n<\/ul>\n<hr>\n<h2>Ce que vous mesurez r\u00e9ellement<\/h2>\n<p>Avant de plonger dans les \u00e9quations, clarifions ce que nous v\u00e9rifions r\u00e9ellement. Dans la communaut\u00e9 de la simulation, <strong>V\u00e9rification<\/strong> et <strong>validation<\/strong> sont souvent confus, mais ils r\u00e9pondent \u00e0 des questions fondamentalement diff\u00e9rentes&nbsp;:<\/p>\n<ul>\n<li><strong>V\u00e9rification<\/strong> demande&nbsp;: <em>\u00ab\u00a0Est-ce que nous r\u00e9solvons correctement les \u00e9quations&nbsp;?\u00a0\u00bb<\/em> C&rsquo;est une question de coh\u00e9rence interne. L&rsquo;impl\u00e9mentation num\u00e9rique r\u00e9sout-elle fid\u00e8lement le mod\u00e8le math\u00e9matique, que ce mod\u00e8le soit ou non d\u00e9crivant la r\u00e9alit\u00e9&nbsp;?<\/li>\n<li><strong>Validation<\/strong> demande&nbsp;: <em>\u00ab\u00a0Sommes-nous en train de r\u00e9soudre les bonnes \u00e9quations&nbsp;?\u00a0\u00bb<\/em> Il compare les r\u00e9sultats de simulation \u00e0 des exp\u00e9riences physiques ou \u00e0 des donn\u00e9es de r\u00e9f\u00e9rence.<\/li>\n<\/ul>\n<p>Si la vue d&rsquo;ensemble du cadre <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">V&amp;V du Post&nbsp;182<\/a> vous a pr\u00e9sent\u00e9 une vue d&rsquo;ensemble, cet article s&rsquo;inscrit dans la machinerie math\u00e9matique qui rend la v\u00e9rification rigoureuse. Consid\u00e9rez-le comme l&rsquo;\u00e9l\u00e9ment compl\u00e9mentaire de notre <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">Guide des \u00e9tudes de convergence<\/a>, qui couvre le c\u00f4t\u00e9 empirique. Ici, nous allons expliquer <strong>pourquoi<\/strong> les \u00e9tudes de convergence fonctionnent et vous montrer comment les automatiser.<\/p>\n<blockquote>\n<p><strong>Framework mental&nbsp;: le compas d&rsquo;erreur de troncature.<\/strong> Imaginez une erreur de troncature comme outil de navigation. L&rsquo;extension de la s\u00e9rie Taylor ne vous donne pas seulement une limite &#8211; elle r\u00e9v\u00e8le la direction dans laquelle votre sch\u00e9ma est biais\u00e9. Une asym\u00e9trie de premier ordre dans les diff\u00e9rences entre l&rsquo;avenir&nbsp;? C&rsquo;est votre compas d&rsquo;aiguille pointant vers la d\u00e9riv\u00e9e d&rsquo;erreur dominante.<\/p>\n<\/blockquote>\n<hr>\n<h2>Erreur de troncature : fondement math\u00e9matique<\/h2>\n<p>La source la plus courante d&rsquo;erreurs num\u00e9riques dans les m\u00e9thodes de diff\u00e9rences finies, d&rsquo;\u00e9l\u00e9ments finis et de volumes finis est <strong>Erreur de troncature<\/strong> &#8211; la diff\u00e9rence entre l&rsquo;op\u00e9rateur diff\u00e9rentiel exact et son approximation discr\u00e8te.<\/p>\n<p>Voici la chose que la plupart des manuels ne mettent pas suffisamment en avant&nbsp;: la d\u00e9rivation des erreurs de troncature via la s\u00e9rie Taylor n&rsquo;est pas un exercice acad\u00e9mique. C&rsquo;est la base pratique pour chaque \u00e9tude de raffinement de grille que vous aurez jamais men\u00e9e. Voyons pourquoi.<\/p>\n<p>Consid\u00e9rez le d\u00e9riv\u00e9 de temps d&rsquo;Euler \u00e0 l&rsquo;envers&nbsp;:<\/p>\n<p>$$frac{u(t) &#8211; u(t &#8211; delta t)}{delta t} = frac{du}{dt} + frac{1}{2} frac{d<sup>2u}{dt<\/sup>2} delta t + o(delta t^2)$$<\/p>\n<p>Le terme d&rsquo;erreur principal est <strong>positif<\/strong> et proportionnel \u00e0 <strong>\u0394t<\/strong>. Pour l&rsquo;avant Euler, le signe se retourne. Pour une diff\u00e9rence centrale dans l&rsquo;espace :<\/p>\n<p>$$frac{u(x + delta x) &#8211; u(x &#8211; delta x)}{2delta x} = frac{du}{dx} + o(delta delta x^2)$$<\/p>\n<p>Remarquez la sym\u00e9trie &#8211; les termes de l&rsquo;ordre impair s&rsquo;annulent, donnant une pr\u00e9cision <strong>deuxi\u00e8me ordre<\/strong>. La sym\u00e9trie paire\/impaire de l&rsquo;expansion de Taylor est la raison pour laquelle les diff\u00e9rences centrales surpassent les sch\u00e9mas avant\/arri\u00e8re.<\/p>\n<h3>Une comparaison pratique<\/h3>\n<table>\n<thead>\n<tr>\n<th>Sch\u00e8me<\/th>\n<th>Formule<\/th>\n<th>Erreur de troncature<\/th>\n<th>Ordre<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Diff\u00e9rence de transfert<\/td>\n<td><code>(u(x+\u0394x) - u(x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1er<\/td>\n<\/tr>\n<tr>\n<td>Diff\u00e9rence arri\u00e9r\u00e9e<\/td>\n<td><code>(u(x) - u(x-\u0394x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1er<\/td>\n<\/tr>\n<tr>\n<td>diff\u00e9rence centrale<\/td>\n<td><code>(u(x+\u0394x) - u(x-\u0394x)) \/ 2\u0394x<\/code><\/td>\n<td><code>+(1\/6) u''' \u0394x\u00b2<\/code><\/td>\n<td>deuxi\u00e8me<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Le tableau ci-dessus n&rsquo;est pas seulement une comparaison, c&rsquo;est un outil de diagnostic. Si votre \u00e9tude de convergence montre le premier ordre lorsque le deuxi\u00e8me ordre \u00e9tait attendu, le terme d&rsquo;erreur d&rsquo;ordre principal vous indique exactement ce qui ne va pas.<\/p>\n<h3>L&rsquo;expression de l&rsquo;erreur de troncature<\/h3>\n<p>Pour une discr\u00e9tisation g\u00e9n\u00e9rale, l&rsquo;erreur de troncature prend la forme :<\/p>\n<p>$$tau = C H^r$$<\/p>\n<p>o\u00f9 <strong>h<\/strong> est le param\u00e8tre de discr\u00e9tisation (taille de maillage ou pas de temps) et <strong>r<\/strong> est le taux de convergence. Cette expression est <strong>pas<\/strong> juste une limite asymptotique &#8211; c&rsquo;est la quantit\u00e9 r\u00e9elle que vous v\u00e9rifiez de mani\u00e8re empirique. Chaque \u00e9tude de raffinement de grille est fondamentalement une tentative de confirmer que l&rsquo;expression d&rsquo;erreur de troncature th\u00e9orique correspond \u00e0 l&rsquo;erreur mesur\u00e9e.<\/p>\n<p>Ce lien entre le \u03c4 th\u00e9orique et la mesure empirique des erreurs est ce qui rend la v\u00e9rification du code rigoureuse plut\u00f4t qu&rsquo;ondul\u00e9e \u00e0 la main.<\/p>\n<hr>\n<h2>De l&rsquo;erreur de troncature \u00e0 la convergence<\/h2>\n<p>Maintenant que nous avons l&rsquo;expression de l&rsquo;erreur de troncature, connectons-la au grand th\u00e9or\u00e8me de l&rsquo;analyse num\u00e9rique&nbsp;: le <strong>th\u00e9or\u00e8me d&rsquo;\u00e9quivalence de lax-richtmyer<\/strong>.<\/p>\n<p>Le th\u00e9or\u00e8me stipule en anglais simple :<\/p>\n<blockquote>\n<p><strong>Pour les probl\u00e8mes lin\u00e9aires et bien pos\u00e9s, une discr\u00e9tisation coh\u00e9rente et stable est convergente.<\/strong><\/p>\n<\/blockquote>\n<p>D\u00e9ballons chaque trimestre au niveau d&rsquo;un praticien&nbsp;:<\/p>\n<p><strong>Consistent<\/strong> signifie que l&rsquo;erreur de troncature passe \u00e0 z\u00e9ro sous la forme H \u2192 0. Si votre sch\u00e9ma a \u03c4 = o(h\u00b2), il est coh\u00e9rent.<\/p>\n<p><strong>stable<\/strong> signifie que les erreurs ne se d\u00e9veloppent pas de mani\u00e8re illimit\u00e9e. La solution num\u00e9rique reste limit\u00e9e par rapport aux donn\u00e9es initiales. Vous v\u00e9rifiez la stabilit\u00e9 gr\u00e2ce \u00e0 l&rsquo;analyse de Von Neumann, aux m\u00e9thodes \u00e9nerg\u00e9tiques ou aux v\u00e9rifications pratiques de l&rsquo;\u00e9tat de la LCF.<\/p>\n<p><strong>Convergent<\/strong> signifie que la solution num\u00e9rique s&rsquo;approche de la solution exacte comme H \u2192 0.<\/p>\n<p>Le croquis de preuve du th\u00e9or\u00e8me (que vous devez conna\u00eetre intuitivement, pas m\u00e9moriser)&nbsp;:<\/p>\n<ol>\n<li>La coh\u00e9rence garantit que l&rsquo;op\u00e9rateur discret se rapproche de l&rsquo;op\u00e9rateur continu.<\/li>\n<li>La stabilit\u00e9 limite la propagation des erreurs \u00e0 chaque pas de temps.<\/li>\n<li>Ensemble, ils garantissent que l&rsquo;erreur totale &#8211; erreur de troncature accumul\u00e9e sur n = t\/\u0394t \u00e9tapes &#8211; reste born\u00e9e et converge vers z\u00e9ro.<\/li>\n<\/ol>\n<p>Le th\u00e9or\u00e8me de Lax-Richtmyer explique les <strong>pourquoi<\/strong> les exigences de stabilit\u00e9 existent. Vous ne pouvez pas simplement r\u00e9duire H arbitrairement ; Vous devez \u00e9galement vous assurer que votre sch\u00e9ma est stable. Pour une int\u00e9gration de temps explicite, c&rsquo;est la condition CFL. Pour les sch\u00e9mas implicites, vous \u00eates g\u00e9n\u00e9ralement en s\u00e9curit\u00e9, mais la tol\u00e9rance \u00e0 l&rsquo;it\u00e9ration devient le nouveau probl\u00e8me de stabilit\u00e9.<\/p>\n<hr>\n<h2>La m\u00e9thode des solutions fabriqu\u00e9es<\/h2>\n<p>Maintenant, pour le gain pratique&nbsp;: comment v\u00e9rifiez-vous que votre code r\u00e9sout correctement les \u00e9quations&nbsp;? L&rsquo;approche la plus rigoureuse est la <strong>m\u00e9thode des solutions manufactur\u00e9es (MMS)<\/strong>.<\/p>\n<p>Le rapport Sandia 2000 de Salari et Park a \u00e9tabli le MMS comme norme de l&rsquo;industrie, et il compte d\u00e9sormais plus de 555 citations. La raison ? Le MMS fonctionne pour les <strong>toutes<\/strong>&nbsp;PDE &#8211; lin\u00e9aire, non lin\u00e9aire, coupl\u00e9, multiphysique &#8211; alors que les rep\u00e8res analytiques n&rsquo;existent que pour les cas de test simples.<\/p>\n<h3>Le flux de travail MMS<\/h3>\n<p>La beaut\u00e9 du MMS est qu&rsquo;il renverse le probl\u00e8me de v\u00e9rification sur sa t\u00eate :<\/p>\n<ol>\n<li><strong>Choisir une solution manufactur\u00e9e<\/strong> u_manufactured(x, t) \u2014 une fonction fluide arbitraire<\/li>\n<li><strong>Substituez \u00e0 la PDE<\/strong> pour d\u00e9river le terme de for\u00e7age\/source qui fait de u_manufactur\u00e9 une solution exacte<\/li>\n<li><strong>D\u00e9river les conditions initiales et limites<\/strong> de U_Fabriqu\u00e9<\/li>\n<li><strong>Ex\u00e9cutez la simulation<\/strong> avec ces entr\u00e9es modifi\u00e9es<\/li>\n<li><strong>Comparer<\/strong> la solution calcul\u00e9e par rapport \u00e0 U_Manufacture<\/li>\n<\/ol>\n<p>Si la solution num\u00e9rique correspond \u00e0 la solution fabriqu\u00e9e dans les limites d&rsquo;erreur attendues, votre code est v\u00e9rifi\u00e9.<\/p>\n<p>Parcourons cela avec du code Python concret. Nous utiliserons deux des frameworks open source les plus largement adopt\u00e9s : Moose et FenicsX.<\/p>\n<h3>Moose MMS : automatisation symbolique<\/h3>\n<p>Le module <code>mms<\/code> de Moose enveloppe SYMPY pour d\u00e9river automatiquement les fonctions de for\u00e7age. Voici comment vous configurez une \u00e9tude de convergence spatiale pour une \u00e9quation de diffusion :<\/p>\n<pre><code class=\"language-python\">import mms\n\n# Define the PDE and manufactured solution\nfs, ss = mms.evaluate(\"-div(grad(u))\", \"sin(2*pi*x)*sin(2*pi*y)\")\n\n# Print forcing function for MOOSE input file\nmms.print_fparser(fs)\n\n# Print exact solution and forcing function as MOOSE hit syntax\nmms.print_hit(fs, \"force\")\nmms.print_hit(ss, \"exact\")\n<\/code><\/pre>\n<p>La sortie vous indique exactement ce qu&rsquo;il faut mettre dans votre fichier d&rsquo;entr\u00e9e <code>.i<\/code>&nbsp;:<\/p>\n<pre><code>8*pi^2*sin(2*x*pi)*sin(2*y*pi)\n[force]\n  type = ParsedFunction\n  expression = '8*pi^2*sin(2*x*pi)*sin(2*y*pi)'\n[]\n[exact]\n  type = ParsedFunction\n  expression = 'sin(2*x*pi)*sin(2*pi*y)'\n[]\n<\/code><\/pre>\n<p>Cette d\u00e9rivation symbolique est cruciale. Pour une simple \u00e9quation de diffusion 1D, vous pouvez d\u00e9river le terme source \u00e0 la main. Pour Navier-Stokes ou l&rsquo;\u00e9lasticit\u00e9 avec des termes coupl\u00e9s, le calcul symbolique n&rsquo;est pas facultatif &#8211; c&rsquo;est le seul moyen d&rsquo;\u00e9viter les erreurs.<\/p>\n<p>Le fichier d&rsquo;entr\u00e9e Moose ressemble alors \u00e0 ceci :<\/p>\n<pre><code>[Mesh]\n  type = GeneratedMesh\n  dim = 2\n  nx = 8\n  ny = 8\n[]\n\n[Kernels]\n  [diff]\n    type = ADDiffusion\n    variable = u\n  []\n  [force]\n    type = BodyForce\n    variable = u\n    function = force\n  []\n[]\n\n[BCs]\n  [all]\n    type = FunctionDirichletBC\n    variable = u\n    function = exact\n    boundary = 'left right top bottom'\n[]\n[]\n\n[Postprocessors]\n  [error]\n    type = ElementL2Error\n    function = exact\n    variable = u\n[]\n[]\n<\/code><\/pre>\n<p>Ensuite, vous automatisez l&rsquo;\u00e9tude de convergence :<\/p>\n<pre><code class=\"language-python\">import mms\n\n# Run 4 levels of refinement for both 1st and 2nd order elements\ndf1 = mms.run_spatial(\"diffusion_mms.i\", 4, console=False)\ndf2 = mms.run_spatial(\"diffusion_mms.i\", 4, \"Variables\/u\/order=SECOND\")\n\nfig = mms.ConvergencePlot(xlabel=\"Element Size ($h$)\", ylabel=\"$L_2$ Error\")\nfig.plot(df1, label=\"1st Order\")\nfig.plot(df2, label=\"2nd Order\")\nfig.save(\"convergence_plot.png\")\n<\/code><\/pre>\n<p>Sur un trac\u00e9 log-log, la pente de chaque ligne vous donne le taux de convergence observ\u00e9. Pour les \u00e9l\u00e9ments du premier ordre, la pente doit s&rsquo;approcher de 2. Pour les \u00e9l\u00e9ments du second ordre, elle doit s&rsquo;approcher de 3.<\/p>\n<h3>FENICSX : \u00e9tudes de convergence de Python Pure<\/h3>\n<p>FENICSX (le successeur de Fenics\/Dolfin) fournit une interface Python tout aussi puissante. Voici comment calculer les normes d&rsquo;erreur et les taux de convergence&nbsp;:<\/p>\n<pre><code class=\"language-python\">from dolfinx import default_scalar_type\nfrom dolfinx.fem import (\n    Expression, Function, functionspace,\n    assemble_scalar, dirichletbc, form,\n    locate_dofs_topological,\n)\nfrom dolfinx.fem.petsc import LinearProblem\nfrom dolfinx.mesh import create_unit_square\nfrom ufl import SpatialCoordinate, TestFunction, TrialFunction, div, dx, grad, inner\nfrom mpi4py import MPI\n\nimport ufl\nimport numpy as np\n\ndef u_ex(mod):\n    return lambda x: mod.cos(2 * mod.pi * x[0]) * mod.cos(2 * mod.pi * x[1])\n\nu_numpy = u_ex(np)\nu_ufl = u_ex(ufl)\n\ndef solve_poisson(N=10, degree=1):\n    mesh = create_unit_square(MPI.COMM_WORLD, N, N)\n    x = SpatialCoordinate(mesh)\n    f = -div(grad(u_ufl(x)))\n    V = functionspace(mesh, (\"Lagrange\", degree))\n    u = TrialFunction(V)\n    v = TestFunction(V)\n    a = inner(grad(u), grad(v)) * dx\n    L = f * v * dx\n    u_bc = Function(V)\n    u_bc.interpolate(u_numpy)\n    facets = locate_entities_boundary(\n        mesh, mesh.topology_dim - 1, lambda x: np.full(x.shape[1], True)\n    )\n    dofs = locate_dofs_topological(V, mesh.topology_dim - 1, facets)\n    bcs = [dirichletbc(u_bc, dofs)]\n    problem = LinearProblem(\n        a, L, bcs=bcs,\n        petsc_options={\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n    )\n    return problem.solve(), u_ufl(x)\n<\/code><\/pre>\n<p>L&rsquo;id\u00e9e cl\u00e9 ici est <strong>Calcul de norme d&rsquo;erreur fiable<\/strong>. Lorsque l&rsquo;erreur est faible, le calcul direct <code>(u_ex - uh)^2<\/code> peut souffrir d&rsquo;erreurs d&rsquo;arrondi, car vous soustrayez deux nombres presque \u00e9gaux. Le didacticiel FENICSX recommande d&rsquo;interpoler d&rsquo;abord les deux solutions dans un espace de fonction d&rsquo;ordre sup\u00e9rieur&nbsp;:<\/p>\n<pre><code class=\"language-python\">def error_L2(uh, u_ex, degree_raise=3):\n    degree = uh.function_space.ufl_element().degree\n    family = uh.function_space.ufl_element().family_name\n    mesh = uh.function_space.mesh\n    \n    # Create higher-order space for accurate subtraction\n    W = functionspace(mesh, (family, degree + degree_raise))\n    u_W = Function(W)\n    u_W.interpolate(uh)\n    \n    u_ex_W = Function(W)\n    u_ex_W.interpolate(u_ex)\n    \n    e_W = Function(W)\n    e_W.x.array[:] = u_W.x.array - u_ex_W.x.array\n    \n    error = form(ufl.inner(e_W, e_W) * ufl.dx)\n    error_global = mesh.comm.allreduce(assemble_scalar(error), op=MPI.SUM)\n    return np.sqrt(error_global)\n<\/code><\/pre>\n<p>Ensuite, vous ex\u00e9cutez l&rsquo;\u00e9tude de convergence&nbsp;:<\/p>\n<pre><code class=\"language-python\">Ns = [4, 8, 16, 32, 64]\nEs = np.zeros(len(Ns))\nhs = np.zeros(len(Ns))\n\nfor i, N in enumerate(Ns):\n    uh, u_ex = solve_poisson(N, degree=1)\n    Es[i] = error_L2(uh, u_numpy)\n    hs[i] = 1.0 \/ Ns[i]\n    print(f\"h: {hs[i]:.2e} Error: {Es[i]:.2e}\")\n\n# Compute observed convergence rates\nrates = np.log(Es[1:] \/ Es[:-1]) \/ np.log(hs[1:] \/ hs[:-1])\nprint(f\"Rates: {rates}\")\n<\/code><\/pre>\n<p>La sortie des \u00e9l\u00e9ments du premier ordre indique les taux approchant de&nbsp;2&nbsp;:<\/p>\n<pre><code>Rates: [1.61 1.89 1.97 1.99]\n<\/code><\/pre>\n<p>Pour les \u00e9l\u00e9ments du second ordre, l&rsquo;approche des taux 3. Il s&rsquo;agit de la manifestation empirique de l&rsquo;analyse th\u00e9orique des erreurs de troncature dont nous avons discut\u00e9 plus t\u00f4t.<\/p>\n<hr>\n<h2>\u00c9tudes pratiques de convergence : interpr\u00e9ter les r\u00e9sultats<\/h2>\n<p>Vous avez ex\u00e9cut\u00e9 votre \u00e9tude de raffinement de grille. Vous avez votre trac\u00e9 de journal. Les pentes sont proches des valeurs th\u00e9oriques. Mais qu&rsquo;est-ce que cela vous dit r\u00e9ellement ?<\/p>\n<h3>La formule de commande observ\u00e9e<\/h3>\n<p>Pour les tailles de maillage h_i et h_{i-1} avec les erreurs correspondantes e_i et e_{i-1}, l&rsquo;ordre observ\u00e9 est&nbsp;:<\/p>\n<p>$$p approx frac{ln(e_{i-1} \/ e_i)}{ln(h_{i-1} \/ h_i)}$$<\/p>\n<p>Si le rapport de raffinement de la grille est <strong>r \u2248 2<\/strong> (commun dans les \u00e9tudes), cela simplifie :<\/p>\n<p>$$p approx log_2(e_{i-1} \/ e_i)$$<\/p>\n<p>Lorsque votre ordre observ\u00e9 se rapproche de la pr\u00e9diction th\u00e9orique, vous avez confirm\u00e9 que votre code fonctionne dans le r\u00e9gime asymptotique. C&rsquo;est le jalon de la v\u00e9rification.<\/p>\n<h3>Dipl\u00f4me : une astuce pratique<\/h3>\n<p>Pour les normes d&rsquo;erreur L2, le calcul direct peut masquer le vrai taux de convergence d\u00fb au tour d&rsquo;horizon. La technique d&rsquo;augmentation des degr\u00e9s (interpolant dans un espace d&rsquo;un degr\u00e9 plus avant la soustraction) est la solution de contournement standard dans FENICSX. Sans cela, vous pouvez signaler une convergence de second ordre lorsque le code converge r\u00e9ellement au troisi\u00e8me ordre.<\/p>\n<hr>\n<h2>Quand arr\u00eater de v\u00e9rifier<\/h2>\n<p>Voici la r\u00e9alit\u00e9 pratique : la v\u00e9rification co\u00fbte cher. Chaque raffinement de maillage double (ou quadruple pour la 2D) votre co\u00fbt de calcul. Vous ne pouvez pas affiner \u00e0 l&rsquo;infini. Alors tu t&rsquo;arr\u00eates quand ?<\/p>\n<p>Le domaine a converg\u00e9 vers trois heuristiques pratiques :<\/p>\n<p><strong>1. L&rsquo;ordre observ\u00e9 correspond \u00e0 la pr\u00e9diction th\u00e9orique.<\/strong> Lorsque vous avez plus de 3 am\u00e9liorations de maillage et que l&rsquo;ordre observ\u00e9 converge vers la valeur th\u00e9orique dans la tol\u00e9rance (g\u00e9n\u00e9ralement \u00b10,1), votre code est v\u00e9rifi\u00e9 dans le r\u00e9gime asymptotique. Aucun raffinement suppl\u00e9mentaire n&rsquo;est n\u00e9cessaire \u00e0 des fins de v\u00e9rification.<\/p>\n<p><strong>2. L&rsquo;indice de convergence de la grille (GCI) tombe en dessous de ~1&nbsp;%.<\/strong> Le GCI quantifie la bande d&rsquo;incertitude du raffinement du maillage. Lorsque GCI &lt; 1&nbsp;% de votre quantit\u00e9 d&rsquo;int\u00e9r\u00eat, l&rsquo;erreur num\u00e9rique est n\u00e9gligeable par rapport \u00e0 l&rsquo;incertitude de mod\u00e9lisation.<\/p>\n<p><strong>3. L&rsquo;erreur num\u00e9rique tombe en dessous de l&rsquo;incertitude physique.<\/strong> Si vos propri\u00e9t\u00e9s mat\u00e9rielles pr\u00e9sentent une incertitude de 5&nbsp;%, le raffinage jusqu&rsquo;\u00e0 ce que l&rsquo;erreur num\u00e9rique soit de 0,001&nbsp;% est inutile. L&rsquo;estimation d&rsquo;erreur \u03c4 = C H^r vous indique o\u00f9 se trouve le plancher pratique.<\/p>\n<h3>Une liste de contr\u00f4le de d\u00e9cision pratique<\/h3>\n<ul>\n<li>[ ] Ex\u00e9cutez 3 \u00e0 4 raffinements de maillage avec un rapport de raffinement r \u2248 2<\/li>\n<li>[ ] Calculer l&rsquo;ordre observ\u00e9 P \u00e0 partir de la pente du log-log<\/li>\n<li>[ ] V\u00e9rifier que p correspond \u00e0 la pr\u00e9diction th\u00e9orique dans \u00b10,1<\/li>\n<li>[ ] Calculez GCI pour le maillage le plus fin<\/li>\n<li>[ ] Comparez GCI \u00e0 l&rsquo;incertitude de mod\u00e9lisation (g\u00e9n\u00e9ralement 1 \u00e0 5 %)<\/li>\n<li>[ ] <strong>Arr\u00eatez quand&nbsp;:<\/strong>&nbsp;P est confirm\u00e9 et GCI &lt;&nbsp;; 1&nbsp;% du QI<\/li>\n<\/ul>\n<p>Si vous utilisez MMS pour un code de production, cette liste de contr\u00f4le est suffisante. Pour les applications critiques pour la s\u00e9curit\u00e9 (comme la simulation de r\u00e9acteurs nucl\u00e9aires dans le manuel MPACT), des v\u00e9rifications suppl\u00e9mentaires pour chaque terme dans l&rsquo;\u00e9quation r\u00e9gissant sont n\u00e9cessaires.<\/p>\n<hr>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Le parcours de l&rsquo;erreur de troncature \u00e0 la v\u00e9rification du code suit un chemin clair&nbsp;:<\/p>\n<ol>\n<li><strong>S\u00e9rie Taylor<\/strong> r\u00e9v\u00e8le l&rsquo;expression d&rsquo;erreur de troncature th\u00e9orique \u03c4 = c h^r<\/li>\n<li><strong>Lax-Richtmyer Theorem<\/strong> garantit la convergence lorsque le sch\u00e9ma est coh\u00e9rent et stable<\/li>\n<li><strong>MMS<\/strong> fournit le flux de travail pratique pour v\u00e9rifier que votre code atteint le taux de convergence th\u00e9orique<\/li>\n<li><strong>\u00c9tudes de raffinement de la grille<\/strong> confirment que les taux observ\u00e9s correspondent aux pr\u00e9dictions th\u00e9oriques<\/li>\n<\/ol>\n<p>L&rsquo;id\u00e9e cl\u00e9 qui lie cela&nbsp;: l&rsquo;erreur de troncature n&rsquo;est pas seulement un concept th\u00e9orique, c&rsquo;est la quantit\u00e9 mesurable que confirment vos \u00e9tudes de raffinement de grille. Lorsque l&rsquo;ordre observ\u00e9 fait correspondre la pr\u00e9diction th\u00e9orique \u00e0 plus de 3 am\u00e9liorations, votre code est v\u00e9rifi\u00e9.<\/p>\n<p>Pour les prochaines \u00e9tapes, consultez notre <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">aper\u00e7u du cadre V&amp;V<\/a> pour le contexte g\u00e9n\u00e9raliste et notre <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">guide des \u00e9tudes de convergence<\/a> pour les recommandations pratiques de qualit\u00e9 de maillage qui compl\u00e8tent ces flux de travail de v\u00e9rification.<\/p>\n<hr>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Salari, K. &amp; Park, K. (2000). \u00ab\u00a0V\u00e9rification de code par la m\u00e9thode des solutions fabriqu\u00e9es.\u00a0\u00bb Rapport Sandia National Laboratories SAND2000-0949. <a href=\"https:\/\/prod.sandia.gov\/techlib\/access-control.cgi\/2000\/001444.pdf\" target=\"_blank\" rel=\"nofollow noopener\">source<\/a><\/li>\n<li>Oberkampf, W. &amp; Roy, C. (2010). \u00ab\u00a0V\u00e9rification et validation en informatique scientifique.\u00a0\u00bb Cambridge University Press.<\/li>\n<li>Langtangen, H.P. \u00ab\u00a0Analyse des erreurs de troncature pour les m\u00e9thodes de diff\u00e9rences finies.\u00a0\u00bb <a href=\"http:\/\/hplgit.github.io\/num-methods-for-PDEs\/doc\/pub\/trunc\/html\/._trunc001.html\">M\u00e9thodes num\u00e9riques pour la documentation PDE<\/a>.<\/li>\n<li>Documentation MMS Moose. <a href=\"https:\/\/mooseframework.inl.gov\/python\/mms.html\" target=\"_blank\" rel=\"nofollow noopener\">Framework Moose<\/a><\/li>\n<li>Tutoriel de convergence Fenicsx. <a href=\"https:\/\/jsdokken.com\/dolfinx-tutorial\/chapter4\/convergence.html\" target=\"_blank\" rel=\"nofollow noopener\">Dolfinx Dolfinx<\/a><\/li>\n<li>Kindo, T. \u00ab\u00a0V\u00e9rifier les simulations avec la m\u00e9thode des solutions fabriqu\u00e9es.\u00a0\u00bb Blog COMSOL. <a href=\"https:\/\/www.comsol.com\/blogs\/verify-simulations-with-the-method-of-manufactured-solutions\" target=\"_blank\" rel=\"nofollow noopener\">Source<\/a><\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li><strong>L'erreur de troncature est le fondement de toute v\u00e9rification de code<\/strong> \u2014 Comprendre la d\u00e9rivation de la s\u00e9rie Taylor explique pourquoi le MMS fonctionne et pourquoi les taux de convergence correspondent aux pr\u00e9dictions th\u00e9oriques.<\/li>\n<li><strong>La m\u00e9thode des solutions manufactur\u00e9es (MMS) est d\u00e9sormais automatis\u00e9e<\/strong> - des frameworks comme Moose et FenicsX utilisent Sympy pour d\u00e9river symboliquement des termes sources, \u00e9liminant les erreurs de calcul manuel qui ont tourment\u00e9 les premiers efforts de v\u00e9rification.<\/li>\n<li><strong>Vous n'avez besoin que de 3 \u00e0 4 raffinements de maillage<\/strong> - une fois que l'ordre de pr\u00e9cision observ\u00e9 correspond \u00e0 la pr\u00e9diction th\u00e9orique, le raffinement est un effort inutile. La vraie question est&nbsp;: quand la v\u00e9rification est-elle \"assez bonne\"&nbsp;?<\/li>\n<li><strong>Les termes d'erreur d'ordre de t\u00eate sont Diagnostic<\/strong> \u2014 la structure de l'extension de l'erreur de troncature vous indique exactement quelle approximation d\u00e9riv\u00e9e \u00e9choue, guidant votre s\u00e9lection de sch\u00e9ma.<\/li>\n<\/ul>\n<hr>\n<h2>Ce que vous mesurez r\u00e9ellement<\/h2>\n<p>Avant de plonger dans les \u00e9quations, clarifions ce que nous v\u00e9rifions r\u00e9ellement. Dans la communaut\u00e9 de la simulation, <strong>V\u00e9rification<\/strong> et <strong>validation<\/strong> sont souvent confus, mais ils r\u00e9pondent \u00e0 des questions fondamentalement diff\u00e9rentes&nbsp;:<\/p>\n<ul>\n<li><strong>V\u00e9rification<\/strong> demande&nbsp;: <em>\"Est-ce que nous r\u00e9solvons correctement les \u00e9quations&nbsp;?\"<\/em> C'est une question de coh\u00e9rence interne. L'impl\u00e9mentation num\u00e9rique r\u00e9sout-elle fid\u00e8lement le mod\u00e8le math\u00e9matique, que ce mod\u00e8le soit ou non d\u00e9crivant la r\u00e9alit\u00e9&nbsp;?<\/li>\n<li><strong>Validation<\/strong> demande&nbsp;: <em>\"Sommes-nous en train de r\u00e9soudre les bonnes \u00e9quations&nbsp;?\"<\/em> Il compare les r\u00e9sultats de simulation \u00e0 des exp\u00e9riences physiques ou \u00e0 des donn\u00e9es de r\u00e9f\u00e9rence.<\/li>\n<\/ul>\n<p>Si la vue d'ensemble du cadre <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">V&amp;V du Post&nbsp;182<\/a> vous a pr\u00e9sent\u00e9 une vue d'ensemble, cet article s'inscrit dans la machinerie math\u00e9matique qui rend la v\u00e9rification rigoureuse. Consid\u00e9rez-le comme l'\u00e9l\u00e9ment compl\u00e9mentaire de notre <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">Guide des \u00e9tudes de convergence<\/a>, qui couvre le c\u00f4t\u00e9 empirique. Ici, nous allons expliquer <strong>pourquoi<\/strong> les \u00e9tudes de convergence fonctionnent et vous montrer comment les automatiser.<\/p>\n<blockquote><p><strong>Framework mental&nbsp;: le compas d'erreur de troncature.<\/strong> Imaginez une erreur de troncature comme outil de navigation. L'extension de la s\u00e9rie Taylor ne vous donne pas seulement une limite - elle r\u00e9v\u00e8le la direction dans laquelle votre sch\u00e9ma est biais\u00e9. Une asym\u00e9trie de premier ordre dans les diff\u00e9rences entre l'avenir&nbsp;? C'est votre compas d'aiguille pointant vers la d\u00e9riv\u00e9e d'erreur dominante.<\/p><\/blockquote>\n<hr>\n<h2>Erreur de troncature : fondement math\u00e9matique<\/h2>\n<p>La source la plus courante d'erreurs num\u00e9riques dans les m\u00e9thodes de diff\u00e9rences finies, d'\u00e9l\u00e9ments finis et de volumes finis est <strong>Erreur de troncature<\/strong> - la diff\u00e9rence entre l'op\u00e9rateur diff\u00e9rentiel exact et son approximation discr\u00e8te.<\/p>\n<p>Voici la chose que la plupart des manuels ne mettent pas suffisamment en avant&nbsp;: la d\u00e9rivation des erreurs de troncature via la s\u00e9rie Taylor n'est pas un exercice acad\u00e9mique. C'est la base pratique pour chaque \u00e9tude de raffinement de grille que vous aurez jamais men\u00e9e. Voyons pourquoi.<\/p>\n<p>Consid\u00e9rez le d\u00e9riv\u00e9 de temps d'Euler \u00e0 l'envers&nbsp;:<\/p>\n<p>$$frac{u(t) - u(t - delta t)}{delta t} = frac{du}{dt} + frac{1}{2} frac{d<sup>2u}{dt<\/sup>2} delta t + o(delta t^2)$$<\/p>\n<p>Le terme d'erreur principal est <strong>positif<\/strong> et proportionnel \u00e0 <strong>\u0394t<\/strong>. Pour l'avant Euler, le signe se retourne. Pour une diff\u00e9rence centrale dans l'espace :<\/p>\n<p>$$frac{u(x + delta x) - u(x - delta x)}{2delta x} = frac{du}{dx} + o(delta delta x^2)$$<\/p>\n<p>Remarquez la sym\u00e9trie - les termes de l'ordre impair s'annulent, donnant une pr\u00e9cision <strong>deuxi\u00e8me ordre<\/strong>. La sym\u00e9trie paire\/impaire de l'expansion de Taylor est la raison pour laquelle les diff\u00e9rences centrales surpassent les sch\u00e9mas avant\/arri\u00e8re.<\/p>\n<h3>Une comparaison pratique<\/h3>\n<table>\n<thead>\n<tr>\n<th>Sch\u00e8me<\/th>\n<th>Formule<\/th>\n<th>Erreur de troncature<\/th>\n<th>Ordre<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Diff\u00e9rence de transfert<\/td>\n<td><code>(u(x+\u0394x) - u(x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1er<\/td>\n<\/tr>\n<tr>\n<td>Diff\u00e9rence arri\u00e9r\u00e9e<\/td>\n<td><code>(u(x) - u(x-\u0394x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1er<\/td>\n<\/tr>\n<tr>\n<td>diff\u00e9rence centrale<\/td>\n<td><code>(u(x+\u0394x) - u(x-\u0394x)) \/ 2\u0394x<\/code><\/td>\n<td><code>+(1\/6) u''' \u0394x\u00b2<\/code><\/td>\n<td>deuxi\u00e8me<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Le tableau ci-dessus n'est pas seulement une comparaison, c'est un outil de diagnostic. Si votre \u00e9tude de convergence montre le premier ordre lorsque le deuxi\u00e8me ordre \u00e9tait attendu, le terme d'erreur d'ordre principal vous indique exactement ce qui ne va pas.<\/p>\n<h3>L'expression de l'erreur de troncature<\/h3>\n<p>Pour une discr\u00e9tisation g\u00e9n\u00e9rale, l'erreur de troncature prend la forme :<\/p>\n<p>$$tau = C H^r$$<\/p>\n<p>o\u00f9 <strong>h<\/strong> est le param\u00e8tre de discr\u00e9tisation (taille de maillage ou pas de temps) et <strong>r<\/strong> est le taux de convergence. Cette expression est <strong>pas<\/strong> juste une limite asymptotique - c'est la quantit\u00e9 r\u00e9elle que vous v\u00e9rifiez de mani\u00e8re empirique. Chaque \u00e9tude de raffinement de grille est fondamentalement une tentative de confirmer que l'expression d'erreur de troncature th\u00e9orique correspond \u00e0 l'erreur mesur\u00e9e.<\/p>\n<p>Ce lien entre le \u03c4 th\u00e9orique et la mesure empirique des erreurs est ce qui rend la v\u00e9rification du code rigoureuse plut\u00f4t qu'ondul\u00e9e \u00e0 la main.<\/p>\n<hr>\n<h2>De l'erreur de troncature \u00e0 la convergence<\/h2>\n<p>Maintenant que nous avons l'expression de l'erreur de troncature, connectons-la au grand th\u00e9or\u00e8me de l'analyse num\u00e9rique&nbsp;: le <strong>th\u00e9or\u00e8me d'\u00e9quivalence de lax-richtmyer<\/strong>.<\/p>\n<p>Le th\u00e9or\u00e8me stipule en anglais simple :<\/p>\n<blockquote><p><strong>Pour les probl\u00e8mes lin\u00e9aires et bien pos\u00e9s, une discr\u00e9tisation coh\u00e9rente et stable est convergente.<\/strong><\/p><\/blockquote>\n<p>D\u00e9ballons chaque trimestre au niveau d'un praticien&nbsp;:<\/p>\n<p><strong>Consistent<\/strong> signifie que l'erreur de troncature passe \u00e0 z\u00e9ro sous la forme H \u2192 0. Si votre sch\u00e9ma a \u03c4 = o(h\u00b2), il est coh\u00e9rent.<\/p>\n<p><strong>stable<\/strong> signifie que les erreurs ne se d\u00e9veloppent pas de mani\u00e8re illimit\u00e9e. La solution num\u00e9rique reste limit\u00e9e par rapport aux donn\u00e9es initiales. Vous v\u00e9rifiez la stabilit\u00e9 gr\u00e2ce \u00e0 l'analyse de Von Neumann, aux m\u00e9thodes \u00e9nerg\u00e9tiques ou aux v\u00e9rifications pratiques de l'\u00e9tat de la LCF.<\/p>\n<p><strong>Convergent<\/strong> signifie que la solution num\u00e9rique s'approche de la solution exacte comme H \u2192 0.<\/p>\n<p>Le croquis de preuve du th\u00e9or\u00e8me (que vous devez conna\u00eetre intuitivement, pas m\u00e9moriser)&nbsp;:<\/p>\n<ol>\n<li>La coh\u00e9rence garantit que l'op\u00e9rateur discret se rapproche de l'op\u00e9rateur continu.<\/li>\n<li>La stabilit\u00e9 limite la propagation des erreurs \u00e0 chaque pas de temps.<\/li>\n<li>Ensemble, ils garantissent que l'erreur totale - erreur de troncature accumul\u00e9e sur n = t\/\u0394t \u00e9tapes - reste born\u00e9e et converge vers z\u00e9ro.<\/li>\n<\/ol>\n<p>Le th\u00e9or\u00e8me de Lax-Richtmyer explique les <strong>pourquoi<\/strong> les exigences de stabilit\u00e9 existent. Vous ne pouvez pas simplement r\u00e9duire H arbitrairement ; Vous devez \u00e9galement vous assurer que votre sch\u00e9ma est stable. Pour une int\u00e9gration de temps explicite, c'est la condition CFL. Pour les sch\u00e9mas implicites, vous \u00eates g\u00e9n\u00e9ralement en s\u00e9curit\u00e9, mais la tol\u00e9rance \u00e0 l'it\u00e9ration devient le nouveau probl\u00e8me de stabilit\u00e9.<\/p>\n<hr>\n<h2>La m\u00e9thode des solutions fabriqu\u00e9es<\/h2>\n<p>Maintenant, pour le gain pratique&nbsp;: comment v\u00e9rifiez-vous que votre code r\u00e9sout correctement les \u00e9quations&nbsp;? L'approche la plus rigoureuse est la <strong>m\u00e9thode des solutions manufactur\u00e9es (MMS)<\/strong>.<\/p>\n<p>Le rapport Sandia 2000 de Salari et Park a \u00e9tabli le MMS comme norme de l'industrie, et il compte d\u00e9sormais plus de 555 citations. La raison ? Le MMS fonctionne pour les <strong>toutes<\/strong>&nbsp;PDE - lin\u00e9aire, non lin\u00e9aire, coupl\u00e9, multiphysique - alors que les rep\u00e8res analytiques n'existent que pour les cas de test simples.<\/p>\n<h3>Le flux de travail MMS<\/h3>\n<p>La beaut\u00e9 du MMS est qu'il renverse le probl\u00e8me de v\u00e9rification sur sa t\u00eate :<\/p>\n<ol>\n<li><strong>Choisir une solution manufactur\u00e9e<\/strong> u_manufactured(x, t) \u2014 une fonction fluide arbitraire<\/li>\n<li><strong>Substituez \u00e0 la PDE<\/strong> pour d\u00e9river le terme de for\u00e7age\/source qui fait de u_manufactur\u00e9 une solution exacte<\/li>\n<li><strong>D\u00e9river les conditions initiales et limites<\/strong> de U_Fabriqu\u00e9<\/li>\n<li><strong>Ex\u00e9cutez la simulation<\/strong> avec ces entr\u00e9es modifi\u00e9es<\/li>\n<li><strong>Comparer<\/strong> la solution calcul\u00e9e par rapport \u00e0 U_Manufacture<\/li>\n<\/ol>\n<p>Si la solution num\u00e9rique correspond \u00e0 la solution fabriqu\u00e9e dans les limites d'erreur attendues, votre code est v\u00e9rifi\u00e9.<\/p>\n<p>Parcourons cela avec du code Python concret. Nous utiliserons deux des frameworks open source les plus largement adopt\u00e9s : Moose et FenicsX.<\/p>\n<h3>Moose MMS : automatisation symbolique<\/h3>\n<p>Le module <code>mms<\/code> de Moose enveloppe SYMPY pour d\u00e9river automatiquement les fonctions de for\u00e7age. Voici comment vous configurez une \u00e9tude de convergence spatiale pour une \u00e9quation de diffusion :<\/p>\n<pre><code class=\"language-python\">import mms\n\n# Define the PDE and manufactured solution\nfs, ss = mms.evaluate(\"-div(grad(u))\", \"sin(2*pi*x)*sin(2*pi*y)\")\n\n# Print forcing function for MOOSE input file\nmms.print_fparser(fs)\n\n# Print exact solution and forcing function as MOOSE hit syntax\nmms.print_hit(fs, \"force\")\nmms.print_hit(ss, \"exact\")\n<\/code><\/pre>\n<p>La sortie vous indique exactement ce qu'il faut mettre dans votre fichier d'entr\u00e9e <code>.i<\/code>&nbsp;:<\/p>\n<pre><code>8*pi^2*sin(2*x*pi)*sin(2*y*pi)\n[force]\n  type = ParsedFunction\n  expression = '8*pi^2*sin(2*x*pi)*sin(2*y*pi)'\n[]\n[exact]\n  type = ParsedFunction\n  expression = 'sin(2*x*pi)*sin(2*pi*y)'\n[]\n<\/code><\/pre>\n<p>Cette d\u00e9rivation symbolique est cruciale. Pour une simple \u00e9quation de diffusion 1D, vous pouvez d\u00e9river le terme source \u00e0 la main. Pour Navier-Stokes ou l'\u00e9lasticit\u00e9 avec des termes coupl\u00e9s, le calcul symbolique n'est pas facultatif - c'est le seul moyen d'\u00e9viter les erreurs.<\/p>\n<p>Le fichier d'entr\u00e9e Moose ressemble alors \u00e0 ceci :<\/p>\n<pre><code>[Mesh]\n  type = GeneratedMesh\n  dim = 2\n  nx = 8\n  ny = 8\n[]\n\n[Kernels]\n  [diff]\n    type = ADDiffusion\n    variable = u\n  []\n  [force]\n    type = BodyForce\n    variable = u\n    function = force\n  []\n[]\n\n[BCs]\n  [all]\n    type = FunctionDirichletBC\n    variable = u\n    function = exact\n    boundary = 'left right top bottom'\n[]\n[]\n\n[Postprocessors]\n  [error]\n    type = ElementL2Error\n    function = exact\n    variable = u\n[]\n[]\n<\/code><\/pre>\n<p>Ensuite, vous automatisez l'\u00e9tude de convergence :<\/p>\n<pre><code class=\"language-python\">import mms\n\n# Run 4 levels of refinement for both 1st and 2nd order elements\ndf1 = mms.run_spatial(\"diffusion_mms.i\", 4, console=False)\ndf2 = mms.run_spatial(\"diffusion_mms.i\", 4, \"Variables\/u\/order=SECOND\")\n\nfig = mms.ConvergencePlot(xlabel=\"Element Size ($h$)\", ylabel=\"$L_2$ Error\")\nfig.plot(df1, label=\"1st Order\")\nfig.plot(df2, label=\"2nd Order\")\nfig.save(\"convergence_plot.png\")\n<\/code><\/pre>\n<p>Sur un trac\u00e9 log-log, la pente de chaque ligne vous donne le taux de convergence observ\u00e9. Pour les \u00e9l\u00e9ments du premier ordre, la pente doit s'approcher de 2. Pour les \u00e9l\u00e9ments du second ordre, elle doit s'approcher de 3.<\/p>\n<h3>FENICSX : \u00e9tudes de convergence de Python Pure<\/h3>\n<p>FENICSX (le successeur de Fenics\/Dolfin) fournit une interface Python tout aussi puissante. Voici comment calculer les normes d'erreur et les taux de convergence&nbsp;:<\/p>\n<pre><code class=\"language-python\">from dolfinx import default_scalar_type\nfrom dolfinx.fem import (\n    Expression, Function, functionspace,\n    assemble_scalar, dirichletbc, form,\n    locate_dofs_topological,\n)\nfrom dolfinx.fem.petsc import LinearProblem\nfrom dolfinx.mesh import create_unit_square\nfrom ufl import SpatialCoordinate, TestFunction, TrialFunction, div, dx, grad, inner\nfrom mpi4py import MPI\n\nimport ufl\nimport numpy as np\n\ndef u_ex(mod):\n    return lambda x: mod.cos(2 * mod.pi * x[0]) * mod.cos(2 * mod.pi * x[1])\n\nu_numpy = u_ex(np)\nu_ufl = u_ex(ufl)\n\ndef solve_poisson(N=10, degree=1):\n    mesh = create_unit_square(MPI.COMM_WORLD, N, N)\n    x = SpatialCoordinate(mesh)\n    f = -div(grad(u_ufl(x)))\n    V = functionspace(mesh, (\"Lagrange\", degree))\n    u = TrialFunction(V)\n    v = TestFunction(V)\n    a = inner(grad(u), grad(v)) * dx\n    L = f * v * dx\n    u_bc = Function(V)\n    u_bc.interpolate(u_numpy)\n    facets = locate_entities_boundary(\n        mesh, mesh.topology_dim - 1, lambda x: np.full(x.shape[1], True)\n    )\n    dofs = locate_dofs_topological(V, mesh.topology_dim - 1, facets)\n    bcs = [dirichletbc(u_bc, dofs)]\n    problem = LinearProblem(\n        a, L, bcs=bcs,\n        petsc_options={\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n    )\n    return problem.solve(), u_ufl(x)\n<\/code><\/pre>\n<p>L'id\u00e9e cl\u00e9 ici est <strong>Calcul de norme d'erreur fiable<\/strong>. Lorsque l'erreur est faible, le calcul direct <code>(u_ex - uh)^2<\/code> peut souffrir d'erreurs d'arrondi, car vous soustrayez deux nombres presque \u00e9gaux. Le didacticiel FENICSX recommande d'interpoler d'abord les deux solutions dans un espace de fonction d'ordre sup\u00e9rieur&nbsp;:<\/p>\n<pre><code class=\"language-python\">def error_L2(uh, u_ex, degree_raise=3):\n    degree = uh.function_space.ufl_element().degree\n    family = uh.function_space.ufl_element().family_name\n    mesh = uh.function_space.mesh\n    \n    # Create higher-order space for accurate subtraction\n    W = functionspace(mesh, (family, degree + degree_raise))\n    u_W = Function(W)\n    u_W.interpolate(uh)\n    \n    u_ex_W = Function(W)\n    u_ex_W.interpolate(u_ex)\n    \n    e_W = Function(W)\n    e_W.x.array[:] = u_W.x.array - u_ex_W.x.array\n    \n    error = form(ufl.inner(e_W, e_W) * ufl.dx)\n    error_global = mesh.comm.allreduce(assemble_scalar(error), op=MPI.SUM)\n    return np.sqrt(error_global)\n<\/code><\/pre>\n<p>Ensuite, vous ex\u00e9cutez l'\u00e9tude de convergence&nbsp;:<\/p>\n<pre><code class=\"language-python\">Ns = [4, 8, 16, 32, 64]\nEs = np.zeros(len(Ns))\nhs = np.zeros(len(Ns))\n\nfor i, N in enumerate(Ns):\n    uh, u_ex = solve_poisson(N, degree=1)\n    Es[i] = error_L2(uh, u_numpy)\n    hs[i] = 1.0 \/ Ns[i]\n    print(f\"h: {hs[i]:.2e} Error: {Es[i]:.2e}\")\n\n# Compute observed convergence rates\nrates = np.log(Es[1:] \/ Es[:-1]) \/ np.log(hs[1:] \/ hs[:-1])\nprint(f\"Rates: {rates}\")\n<\/code><\/pre>\n<p>La sortie des \u00e9l\u00e9ments du premier ordre indique les taux approchant de&nbsp;2&nbsp;:<\/p>\n<pre><code>Rates: [1.61 1.89 1.97 1.99]\n<\/code><\/pre>\n<p>Pour les \u00e9l\u00e9ments du second ordre, l'approche des taux 3. Il s'agit de la manifestation empirique de l'analyse th\u00e9orique des erreurs de troncature dont nous avons discut\u00e9 plus t\u00f4t.<\/p>\n<hr>\n<h2>\u00c9tudes pratiques de convergence : interpr\u00e9ter les r\u00e9sultats<\/h2>\n<p>Vous avez ex\u00e9cut\u00e9 votre \u00e9tude de raffinement de grille. Vous avez votre trac\u00e9 de journal. Les pentes sont proches des valeurs th\u00e9oriques. Mais qu'est-ce que cela vous dit r\u00e9ellement ?<\/p>\n<h3>La formule de commande observ\u00e9e<\/h3>\n<p>Pour les tailles de maillage h_i et h_{i-1} avec les erreurs correspondantes e_i et e_{i-1}, l'ordre observ\u00e9 est&nbsp;:<\/p>\n<p>$$p approx frac{ln(e_{i-1} \/ e_i)}{ln(h_{i-1} \/ h_i)}$$<\/p>\n<p>Si le rapport de raffinement de la grille est <strong>r \u2248 2<\/strong> (commun dans les \u00e9tudes), cela simplifie :<\/p>\n<p>$$p approx log_2(e_{i-1} \/ e_i)$$<\/p>\n<p>Lorsque votre ordre observ\u00e9 se rapproche de la pr\u00e9diction th\u00e9orique, vous avez confirm\u00e9 que votre code fonctionne dans le r\u00e9gime asymptotique. C'est le jalon de la v\u00e9rification.<\/p>\n<h3>Dipl\u00f4me : une astuce pratique<\/h3>\n<p>Pour les normes d'erreur L2, le calcul direct peut masquer le vrai taux de convergence d\u00fb au tour d'horizon. La technique d'augmentation des degr\u00e9s (interpolant dans un espace d'un degr\u00e9 plus avant la soustraction) est la solution de contournement standard dans FENICSX. Sans cela, vous pouvez signaler une convergence de second ordre lorsque le code converge r\u00e9ellement au troisi\u00e8me ordre.<\/p>\n<hr>\n<h2>Quand arr\u00eater de v\u00e9rifier<\/h2>\n<p>Voici la r\u00e9alit\u00e9 pratique : la v\u00e9rification co\u00fbte cher. Chaque raffinement de maillage double (ou quadruple pour la 2D) votre co\u00fbt de calcul. Vous ne pouvez pas affiner \u00e0 l'infini. Alors tu t'arr\u00eates quand ?<\/p>\n<p>Le domaine a converg\u00e9 vers trois heuristiques pratiques :<\/p>\n<p><strong>1. L'ordre observ\u00e9 correspond \u00e0 la pr\u00e9diction th\u00e9orique.<\/strong> Lorsque vous avez plus de 3 am\u00e9liorations de maillage et que l'ordre observ\u00e9 converge vers la valeur th\u00e9orique dans la tol\u00e9rance (g\u00e9n\u00e9ralement \u00b10,1), votre code est v\u00e9rifi\u00e9 dans le r\u00e9gime asymptotique. Aucun raffinement suppl\u00e9mentaire n'est n\u00e9cessaire \u00e0 des fins de v\u00e9rification.<\/p>\n<p><strong>2. L'indice de convergence de la grille (GCI) tombe en dessous de ~1&nbsp;%.<\/strong> Le GCI quantifie la bande d'incertitude du raffinement du maillage. Lorsque GCI &lt; 1&nbsp;% de votre quantit\u00e9 d'int\u00e9r\u00eat, l'erreur num\u00e9rique est n\u00e9gligeable par rapport \u00e0 l'incertitude de mod\u00e9lisation.<\/p>\n<p><strong>3. L'erreur num\u00e9rique tombe en dessous de l'incertitude physique.<\/strong> Si vos propri\u00e9t\u00e9s mat\u00e9rielles pr\u00e9sentent une incertitude de 5&nbsp;%, le raffinage jusqu'\u00e0 ce que l'erreur num\u00e9rique soit de 0,001&nbsp;% est inutile. L'estimation d'erreur \u03c4 = C H^r vous indique o\u00f9 se trouve le plancher pratique.<\/p>\n<h3>Une liste de contr\u00f4le de d\u00e9cision pratique<\/h3>\n<ul>\n<li>[ ] Ex\u00e9cutez 3 \u00e0 4 raffinements de maillage avec un rapport de raffinement r \u2248 2<\/li>\n<li>[ ] Calculer l'ordre observ\u00e9 P \u00e0 partir de la pente du log-log<\/li>\n<li>[ ] V\u00e9rifier que p correspond \u00e0 la pr\u00e9diction th\u00e9orique dans \u00b10,1<\/li>\n<li>[ ] Calculez GCI pour le maillage le plus fin<\/li>\n<li>[ ] Comparez GCI \u00e0 l'incertitude de mod\u00e9lisation (g\u00e9n\u00e9ralement 1 \u00e0 5 %)<\/li>\n<li>[ ] <strong>Arr\u00eatez quand&nbsp;:<\/strong>&nbsp;P est confirm\u00e9 et GCI &lt;&nbsp;; 1&nbsp;% du QI<\/li>\n<\/ul>\n<p>Si vous utilisez MMS pour un code de production, cette liste de contr\u00f4le est suffisante. Pour les applications critiques pour la s\u00e9curit\u00e9 (comme la simulation de r\u00e9acteurs nucl\u00e9aires dans le manuel MPACT), des v\u00e9rifications suppl\u00e9mentaires pour chaque terme dans l'\u00e9quation r\u00e9gissant sont n\u00e9cessaires.<\/p>\n<hr>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Le parcours de l'erreur de troncature \u00e0 la v\u00e9rification du code suit un chemin clair&nbsp;:<\/p>\n<ol>\n<li><strong>S\u00e9rie Taylor<\/strong> r\u00e9v\u00e8le l'expression d'erreur de troncature th\u00e9orique \u03c4 = c h^r<\/li>\n<li><strong>Lax-Richtmyer Theorem<\/strong> garantit la convergence lorsque le sch\u00e9ma est coh\u00e9rent et stable<\/li>\n<li><strong>MMS<\/strong> fournit le flux de travail pratique pour v\u00e9rifier que votre code atteint le taux de convergence th\u00e9orique<\/li>\n<li><strong>\u00c9tudes de raffinement de la grille<\/strong> confirment que les taux observ\u00e9s correspondent aux pr\u00e9dictions th\u00e9oriques<\/li>\n<\/ol>\n<p>L'id\u00e9e cl\u00e9 qui lie cela&nbsp;: l'erreur de troncature n'est pas seulement un concept th\u00e9orique, c'est la quantit\u00e9 mesurable que confirment vos \u00e9tudes de raffinement de grille. Lorsque l'ordre observ\u00e9 fait correspondre la pr\u00e9diction th\u00e9orique \u00e0 plus de 3 am\u00e9liorations, votre code est v\u00e9rifi\u00e9.<\/p>\n<p>Pour les prochaines \u00e9tapes, consultez notre <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">aper\u00e7u du cadre V&amp;V<\/a> pour le contexte g\u00e9n\u00e9raliste et notre <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">guide des \u00e9tudes de convergence<\/a> pour les recommandations pratiques de qualit\u00e9 de maillage qui compl\u00e8tent ces flux de travail de v\u00e9rification.<\/p>\n<hr>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Salari, K. &amp; Park, K. (2000). \"V\u00e9rification de code par la m\u00e9thode des solutions fabriqu\u00e9es.\" Rapport Sandia National Laboratories SAND2000-0949. <a href=\"https:\/\/prod.sandia.gov\/techlib\/access-control.cgi\/2000\/001444.pdf\" target=\"_blank\" rel=\"nofollow noopener\">source<\/a><\/li>\n<li>Oberkampf, W. &amp; Roy, C. (2010). \"V\u00e9rification et validation en informatique scientifique.\" Cambridge University Press.<\/li>\n<li>Langtangen, H.P. \"Analyse des erreurs de troncature pour les m\u00e9thodes de diff\u00e9rences finies.\" <a href=\"http:\/\/hplgit.github.io\/num-methods-for-PDEs\/doc\/pub\/trunc\/html\/._trunc001.html\">M\u00e9thodes num\u00e9riques pour la documentation PDE<\/a>.<\/li>\n<li>Documentation MMS Moose. <a href=\"https:\/\/mooseframework.inl.gov\/python\/mms.html\" target=\"_blank\" rel=\"nofollow noopener\">Framework Moose<\/a><\/li>\n<li>Tutoriel de convergence Fenicsx. <a href=\"https:\/\/jsdokken.com\/dolfinx-tutorial\/chapter4\/convergence.html\" target=\"_blank\" rel=\"nofollow noopener\">Dolfinx Dolfinx<\/a><\/li>\n<li>Kindo, T. \"V\u00e9rifier les simulations avec la m\u00e9thode des solutions fabriqu\u00e9es.\" Blog COMSOL. <a href=\"https:\/\/www.comsol.com\/blogs\/verify-simulations-with-the-method-of-manufactured-solutions\" target=\"_blank\" rel=\"nofollow noopener\">Source<\/a><\/li>\n<\/ul>\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\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Points \u00e0 retenir cl\u00e9s L&rsquo;erreur de troncature est le fondement de toute v\u00e9rification de code \u2014 Comprendre la d\u00e9rivation de la s\u00e9rie Taylor explique pourquoi le MMS fonctionne et pourquoi les taux de convergence correspondent aux pr\u00e9dictions th\u00e9oriques. La m\u00e9thode des solutions manufactur\u00e9es (MMS) est d\u00e9sormais automatis\u00e9e &#8211; des frameworks comme Moose et FenicsX utilisent [&hellip;]<\/p>\n","protected":false,"raw":""},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=520","iawp_total_views":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1298","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>M\u00e9thodes d&#039;estimation et de v\u00e9rification des erreurs\u00a0: de l&#039;erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org<\/title>\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\/error-estimation-verification-methods\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M\u00e9thodes d&#039;estimation et de v\u00e9rification des erreurs\u00a0: de l&#039;erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  9 minutesPoints \u00e0 retenir cl\u00e9s L&rsquo;erreur de troncature est le fondement de toute v\u00e9rification de code \u2014 Comprendre la d\u00e9rivation de la s\u00e9rie Taylor explique pourquoi le MMS fonctionne et pourquoi les taux de convergence correspondent aux pr\u00e9dictions th\u00e9oriques. La m\u00e9thode des solutions manufactur\u00e9es (MMS) est d\u00e9sormais automatis\u00e9e &#8211; des frameworks comme Moose et FenicsX utilisent [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:31:13+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"M\u00e9thodes d&rsquo;estimation et de v\u00e9rification des erreurs\u00a0: de l&rsquo;erreur de troncature \u00e0 la v\u00e9rification du code\",\"datePublished\":\"2026-08-21T14:31:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/\"},\"wordCount\":2564,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/\",\"name\":\"M\u00e9thodes d'estimation et de v\u00e9rification des erreurs\u00a0: de l'erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:31:13+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/error-estimation-verification-methods\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M\u00e9thodes d&#8217;estimation et de v\u00e9rification des erreurs\u00a0: de l&#8217;erreur de troncature \u00e0 la v\u00e9rification du code\"}]},{\"@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\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"caption\":\"Elena Markovska\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/elena-markovska\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"M\u00e9thodes d'estimation et de v\u00e9rification des erreurs\u00a0: de l'erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org","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\/error-estimation-verification-methods\/","og_locale":"fr_FR","og_type":"article","og_title":"M\u00e9thodes d'estimation et de v\u00e9rification des erreurs\u00a0: de l'erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org","og_description":"Reading Time:  9 minutesPoints \u00e0 retenir cl\u00e9s L&rsquo;erreur de troncature est le fondement de toute v\u00e9rification de code \u2014 Comprendre la d\u00e9rivation de la s\u00e9rie Taylor explique pourquoi le MMS fonctionne et pourquoi les taux de convergence correspondent aux pr\u00e9dictions th\u00e9oriques. La m\u00e9thode des solutions manufactur\u00e9es (MMS) est d\u00e9sormais automatis\u00e9e &#8211; des frameworks comme Moose et FenicsX utilisent [&hellip;]","og_url":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:31:13+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Elena Markovska","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"M\u00e9thodes d&rsquo;estimation et de v\u00e9rification des erreurs\u00a0: de l&rsquo;erreur de troncature \u00e0 la v\u00e9rification du code","datePublished":"2026-08-21T14:31:13+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/"},"wordCount":2564,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/","url":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/","name":"M\u00e9thodes d'estimation et de v\u00e9rification des erreurs\u00a0: de l'erreur de troncature \u00e0 la v\u00e9rification du code - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:31:13+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/error-estimation-verification-methods\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"M\u00e9thodes d&#8217;estimation et de v\u00e9rification des erreurs\u00a0: de l&#8217;erreur de troncature \u00e0 la v\u00e9rification du code"}]},{"@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\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","caption":"Elena Markovska"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/elena-markovska\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1298","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1298"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1298\/revisions"}],"predecessor-version":[{"id":1392,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1298\/revisions\/1392"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}