{"id":785,"date":"2026-07-30T12:21:40","date_gmt":"2026-07-30T12:21:40","guid":{"rendered":"https:\/\/matforge.org\/?p=785","raw":"https:\/\/matforge.org\/?p=785"},"modified":"2026-07-30T12:21:40","modified_gmt":"2026-07-30T12:21:40","slug":"error-estimation-verification-methods","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/","title":{"rendered":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo","raw":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo"},"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>Comida clave<\/h2>\n<ul>\n<li><strong>Error de truncamiento es la base de toda verificaci\u00f3n de c\u00f3digo<\/strong>: comprender la derivaci\u00f3n de la serie Taylor explica por qu\u00e9 funciona MMS y por qu\u00e9 las tasas de convergencia coinciden con las predicciones te\u00f3ricas.<\/li>\n<li><strong>El m\u00e9todo de soluciones manufacturadas (MMS) ahora est\u00e1 automatizada<\/strong>: los marcos como Moose y Fenicsx usan Sympy para derivar simb\u00f3licamente los t\u00e9rminos de origen, eliminando los errores de c\u00e1lculo manual que plagaron los esfuerzos de verificaci\u00f3n temprana.<\/li>\n<li><strong>Solo necesita 3 a 4 refinamientos de malla<\/strong> \u2014 Una vez observado el orden de precisi\u00f3n coincide con la predicci\u00f3n te\u00f3rica, el refinamiento adicional es un esfuerzo desperdiciado. La verdadera pregunta es: \u00bfcu\u00e1ndo es la verificaci\u00f3n \u00absuficientemente buena\u00bb?<\/li>\n<li><strong>Los t\u00e9rminos de error de orden l\u00edder son diagn\u00f3sticos<\/strong>: la estructura de la expansi\u00f3n del error de truncamiento le indica exactamente qu\u00e9 aproximaci\u00f3n derivada est\u00e1 fallando, guiando la selecci\u00f3n de su esquema.<\/li>\n<\/ul>\n<hr>\n<h2>lo que en realidad est\u00e1s midiendo<\/h2>\n<p>Antes de sumergirnos en ecuaciones, aclaremos lo que realmente estamos verificando. En la comunidad de simulaci\u00f3n, <strong>verificaci\u00f3n<\/strong> y <strong>validaci\u00f3n<\/strong> a menudo se confunden, pero responden preguntas fundamentalmente diferentes:<\/p>\n<ul>\n<li><strong>Verificaci\u00f3n<\/strong> pregunta: <em>\u00ab\u00bfEstamos resolviendo las ecuaciones correctamente?\u00bb<\/em> Se trata de la consistencia interna. \u00bfLa implementaci\u00f3n num\u00e9rica resuelve fielmente el modelo matem\u00e1tico, independientemente de si ese modelo describe la realidad?<\/li>\n<li><strong>Validaci\u00f3n<\/strong> pregunta: <em>\u00ab\u00bfEstamos resolviendo las ecuaciones correctas?\u00bb<\/em> Compara los resultados de la simulaci\u00f3n con experimentos f\u00edsicos o datos de referencia.<\/li>\n<\/ul>\n<p>Si la publicaci\u00f3n de 182 <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">V&amp;v Framework Overview<\/a> le present\u00f3 el panorama general, este art\u00edculo perfora en la maquinaria matem\u00e1tica que hace que la verificaci\u00f3n sea rigurosa. Piense en ello como la pieza complementaria de nuestra <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">gu\u00eda de estudios de convergencia<\/a>, que cubre el lado emp\u00edrico. Aqu\u00ed, explicaremos <strong>por qu\u00e9<\/strong> los estudios de convergencia funcionan y le mostraremos c\u00f3mo automatizarlos.<\/p>\n<blockquote>\n<p><strong>Marco mental: la br\u00fajula de error de truncamiento.<\/strong> Imagina el error de truncamiento como tu herramienta de navegaci\u00f3n. La expansi\u00f3n de la serie Taylor no solo te da un l\u00edmite: revela la direcci\u00f3n en la que tu esquema est\u00e1 sesgado. \u00bfAsimetr\u00eda de primer orden en las diferencias directas? Esa es su aguja de la br\u00fajula apuntando a la derivada de error dominante.<\/p>\n<\/blockquote>\n<hr>\n<h2>Error de truncamiento: la base matem\u00e1tica<\/h2>\n<p>La fuente m\u00e1s com\u00fan de error num\u00e9rico en los m\u00e9todos de diferencia finita, elementos finitos y de volumen finito es <strong>error de truncamiento<\/strong>: la diferencia entre el operador diferencial exacto y su aproximaci\u00f3n discreta.<\/p>\n<p>Esto es lo que la mayor\u00eda de los libros de texto no enfatizan lo suficiente: la derivaci\u00f3n del error de truncamiento a trav\u00e9s de la serie Taylor no es un ejercicio acad\u00e9mico. Es la base pr\u00e1ctica para cada estudio de refinamiento de la red que ejecutar\u00e1s. Veamos por qu\u00e9.<\/p>\n<p>Considere la derivada del tiempo de Euler hacia atr\u00e1s:<\/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>El t\u00e9rmino de error principal es <strong>positivo<\/strong> y proporcional a <strong>\u0394t<\/strong>. Para el delantero Euler, el signo cambia. Para una diferencia central en el espacio:<\/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>Observe la simetr\u00eda: los t\u00e9rminos de orden impar se cancelan, dando una precisi\u00f3n de <strong>segundo pedido<\/strong>. La simetr\u00eda par\/impar de la expansi\u00f3n de Taylor es la raz\u00f3n por la cual las diferencias centrales superan a los esquemas de avance\/retroceso.<\/p>\n<h3>Una comparaci\u00f3n pr\u00e1ctica<\/h3>\n<table>\n<thead>\n<tr>\n<th>Esquema<\/th>\n<th>F\u00f3rmula<\/th>\n<th>Error de truncamiento<\/th>\n<th>Pedido<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Diferencia hacia adelante<\/td>\n<td><code>(u(x+\u0394x) - u(x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1\u00ba<\/td>\n<\/tr>\n<tr>\n<td>diferencia hacia atr\u00e1s<\/td>\n<td><code>(u(x) - u(x-\u0394x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1\u00ba<\/td>\n<\/tr>\n<tr>\n<td>diferencia central<\/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>2do<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La tabla anterior no es solo una comparaci\u00f3n, es una herramienta de diagn\u00f3stico. Si su estudio de convergencia muestra el primer orden cuando se esperaba de segundo orden, el t\u00e9rmino de error de orden principal le indica exactamente qu\u00e9 est\u00e1 mal.<\/p>\n<h3>La expresi\u00f3n de error de truncamiento<\/h3>\n<p>Para una discretizaci\u00f3n general, el error de truncamiento toma la forma:<\/p>\n<p>$$tau = C H^r$$<\/p>\n<p>donde <strong>h<\/strong> es el par\u00e1metro de discretizaci\u00f3n (tama\u00f1o de malla o paso de tiempo) y <strong>r<\/strong> es la tasa de convergencia. Esta expresi\u00f3n es <strong>no<\/strong> solo un l\u00edmite asint\u00f3tico: es la cantidad real que verificas emp\u00edricamente. Cada estudio de refinamiento de la red es fundamentalmente un intento de confirmar que la expresi\u00f3n del error de truncamiento te\u00f3rico coincide con el error medido.<\/p>\n<p>Esta conexi\u00f3n entre el \u03c4 te\u00f3rico y la medici\u00f3n de error emp\u00edrico es lo que hace que la verificaci\u00f3n del c\u00f3digo sea rigurosa en lugar de ondulada con la mano.<\/p>\n<hr>\n<h2>Del error de truncamiento a la convergencia<\/h2>\n<p>Ahora que tenemos la expresi\u00f3n de error de truncamiento, conect\u00e9mosla con el gran teorema del an\u00e1lisis num\u00e9rico: el teorema de equivalencia <strong>lax-richtmyer<\/strong>.<\/p>\n<p>El teorema dice, en ingl\u00e9s sencillo:<\/p>\n<blockquote>\n<p><strong>Para problemas lineales y bien planteados, una discretizaci\u00f3n constante y estable es convergente.<\/strong><\/p>\n<\/blockquote>\n<p>Desempaquemos cada t\u00e9rmino a nivel de practicante:<\/p>\n<p><strong>consistente<\/strong> significa que el error de truncamiento va a cero como H \u2192 0. Si su esquema tiene \u03c4 = o(h\u00b2), es consistente.<\/p>\n<p><strong>estable<\/strong> significa que los errores no crecen sin l\u00edmites. La soluci\u00f3n num\u00e9rica permanece limitada en relaci\u00f3n con los datos iniciales. Verifica la estabilidad a trav\u00e9s del an\u00e1lisis de von Neumann, los m\u00e9todos de energ\u00eda o las comprobaciones pr\u00e1cticas de condici\u00f3n de CFL.<\/p>\n<p><strong>Convergente<\/strong> significa que la soluci\u00f3n num\u00e9rica se acerca a la soluci\u00f3n exacta como H \u2192 0.<\/p>\n<p>El boceto de prueba del teorema (que deber\u00edas saber intuitivamente, no memorizar):<\/p>\n<ol>\n<li>La consistencia garantiza que el operador discreto se aproxima al operador continuo.<\/li>\n<li>La estabilidad limita la propagaci\u00f3n de errores a trav\u00e9s de cada paso de tiempo.<\/li>\n<li>Juntos, garantizan que el error total (error de truncamiento acumulado sobre n = t\/\u0394t pasos) permanece limitado y converge a cero.<\/li>\n<\/ol>\n<p>El teorema de Lax-RichtMyer explica <strong>por qu\u00e9<\/strong> existen requisitos de estabilidad. No puedes simplemente reducir H arbitrariamente; Tambi\u00e9n debe asegurarse de que su esquema sea estable. Para la integraci\u00f3n de tiempo expl\u00edcita, esa es la condici\u00f3n CFL. Para esquemas impl\u00edcitos, por lo general est\u00e1 seguro, pero la tolerancia de iteraci\u00f3n se convierte en la nueva preocupaci\u00f3n de estabilidad.<\/p>\n<hr>\n<h2>El m\u00e9todo de las soluciones manufacturadas<\/h2>\n<p>Ahora, para el pago pr\u00e1ctico: \u00bfc\u00f3mo verificas que tu c\u00f3digo resuelva las ecuaciones correctamente? El enfoque m\u00e1s riguroso es el <strong>m\u00e9todo de soluciones manufacturadas (MMS)<\/strong>.<\/p>\n<p>El informe Sandia 2000 de Salari y Park estableci\u00f3 MMS como el est\u00e1ndar de la industria y ahora tiene m\u00e1s de 555 citas. \u00bfLa raz\u00f3n? MMS funciona para <strong>cualquier PDE<\/strong> \u2014 multif\u00edsico lineal, no lineal, acoplado, mientras que los puntos de referencia anal\u00edticos solo existen para casos de prueba simples.<\/p>\n<h3>El flujo de trabajo de MMS<\/h3>\n<p>La belleza de MMS es que da la vuelta al problema de verificaci\u00f3n en su cabeza:<\/p>\n<ol>\n<li><strong>Elija una soluci\u00f3n manufacturada<\/strong> u_manufactured(x, t) \u2014 una funci\u00f3n suave arbitraria<\/li>\n<li><strong>Sustituya en el PDE<\/strong> para derivar el t\u00e9rmino de forzamiento\/fuente que hace que u_manufactured sea una soluci\u00f3n exacta<\/li>\n<li><strong>Derivar condiciones iniciales y de contorno<\/strong> de u_manufacturado<\/li>\n<li><strong>Ejecutar la simulaci\u00f3n<\/strong> con estas entradas modificadas<\/li>\n<li><strong>Comparar<\/strong> la soluci\u00f3n calculada contra u_manufacturado<\/li>\n<\/ol>\n<p>Si la soluci\u00f3n num\u00e9rica coincide con la soluci\u00f3n fabricada dentro de los l\u00edmites de error esperados, se verifica su c\u00f3digo.<\/p>\n<p>Vamos a repasar esto con el c\u00f3digo Python concreto. Usaremos dos de los marcos de c\u00f3digo abierto m\u00e1s adoptados: Moose y FenicsX.<\/p>\n<h3>Moose MMS: automatizaci\u00f3n simb\u00f3lica<\/h3>\n<p>El m\u00f3dulo <code>mms<\/code> de Moose envuelve Sympy para derivar funciones de forzamiento autom\u00e1ticamente. As\u00ed es como se configura un estudio de convergencia espacial para una ecuaci\u00f3n de difusi\u00f3n:<\/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 salida le dice exactamente qu\u00e9 poner en su archivo de entrada <code>.i<\/code>:<\/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>Esta derivaci\u00f3n simb\u00f3lica es crucial. Para una ecuaci\u00f3n de difusi\u00f3n simple 1D, puede derivar el t\u00e9rmino fuente a mano. Para Navier-Stokes o elasticidad con t\u00e9rminos acoplados, el c\u00e1lculo simb\u00f3lico no es opcional, es la \u00fanica forma de evitar errores.<\/p>\n<p>El archivo de entrada de alce se ve as\u00ed:<\/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>Luego automatizas el estudio de convergencia:<\/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>En un gr\u00e1fico logar\u00edtmico, la pendiente de cada l\u00ednea le da la tasa de convergencia observada. Para los elementos de primer orden, la pendiente debe acercarse a 2. Para los elementos de segundo orden, deber\u00eda acercarse a 3.<\/p>\n<h3>FenicsX: estudios de convergencia de pit\u00f3n pura<\/h3>\n<p>FenicsX (el sucesor de Fenics\/Dolfin) proporciona una interfaz Python igualmente poderosa. As\u00ed es como calcula las normas de error y las tasas de convergencia:<\/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>La informaci\u00f3n clave aqu\u00ed es <strong>C\u00e1lculo de norma de error confiable<\/strong>. Cuando el error es peque\u00f1o, el c\u00e1lculo directo <code>(u_ex - uh)^2<\/code> puede sufrir errores de redondeo porque est\u00e1 restando dos n\u00fameros casi iguales. El tutorial de FenicsX recomienda interpolar ambas soluciones en un espacio de funci\u00f3n de orden superior primero:<\/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>Luego ejecutas el estudio de convergencia:<\/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 salida de los elementos de primer orden muestra las tasas cercanas a 2:<\/p>\n<pre><code>Rates: [1.61 1.89 1.97 1.99]\n<\/code><\/pre>\n<p>Para los elementos de segundo orden, el enfoque de tasas 3. Esta es la manifestaci\u00f3n emp\u00edrica del an\u00e1lisis de errores te\u00f3ricos de truncamiento que discutimos anteriormente.<\/p>\n<hr>\n<h2>Estudios pr\u00e1cticos de convergencia: interpretaci\u00f3n de los resultados<\/h2>\n<p>Has ejecutado tu estudio de refinamiento de la red. Tiene su parcela de registro. Las pendientes est\u00e1n cerca de los valores te\u00f3ricos. Pero, \u00bfqu\u00e9 te dice esto realmente?<\/p>\n<h3>la f\u00f3rmula de orden observada<\/h3>\n<p>Para los tama\u00f1os de malla H_I y H_{i-1} con los errores correspondientes E_I y E_{i-1}, el orden observado es:<\/p>\n<p>$$P approx frac{ln(e_{i-1} \/ e_i)}{ln(h_{i-1} \/ h_i)}$$<\/p>\n<p>Si la relaci\u00f3n de refinamiento de la red es <strong>r \u2248 2<\/strong> (com\u00fan en estudios), esto se simplifica a:<\/p>\n<p>$$P approx log_2(e_{i-1} \/ e_i)$$<\/p>\n<p>Cuando su orden observado se acerca a la predicci\u00f3n te\u00f3rica, ha confirmado que su c\u00f3digo opera en el r\u00e9gimen asint\u00f3tico. Este es el hito de verificaci\u00f3n.<\/p>\n<h3>Elevaci\u00f3n de t\u00edtulos: un truco pr\u00e1ctico<\/h3>\n<p>Para las normas de error L2, el c\u00e1lculo directo puede ocultar la verdadera tasa de convergencia debido a la redondeo. La t\u00e9cnica de elevaci\u00f3n de grado (interpolando en un espacio un grado superior antes de la resta) es la soluci\u00f3n est\u00e1ndar en FenicsX. Sin \u00e9l, puede informar una convergencia de segundo orden cuando el c\u00f3digo en realidad converge en el tercer orden.<\/p>\n<hr>\n<h2>Cu\u00e1ndo dejar de verificar<\/h2>\n<p>Aqu\u00ed est\u00e1 la realidad pr\u00e1ctica: la verificaci\u00f3n es costosa. Cada refinamiento de malla duplica (o cuadruplica para 2D) su costo computacional. No se puede refinar infinitamente. Entonces, \u00bfcu\u00e1ndo paras?<\/p>\n<p>El campo ha convergido en tres heur\u00edsticas pr\u00e1cticas:<\/p>\n<p><strong>1. El orden observado coincide con la predicci\u00f3n te\u00f3rica.<\/strong> Cuando tiene 3+ refinamientos de malla y el orden observado converge al valor te\u00f3rico dentro de la tolerancia (t\u00edpicamente \u00b10.1), su c\u00f3digo se verifica en el r\u00e9gimen asint\u00f3tico. No se necesita m\u00e1s refinamiento para fines de verificaci\u00f3n.<\/p>\n<p><strong>2. El \u00edndice de convergencia de cuadr\u00edcula (GCI) cae por debajo de ~1%.<\/strong> El GCI cuantifica la banda de incertidumbre del refinamiento de la malla. Cuando GCI &lt; 1% de su cantidad de inter\u00e9s, el error num\u00e9rico es insignificante en relaci\u00f3n con la incertidumbre de modelado.<\/p>\n<p><strong>3. El error num\u00e9rico cae por debajo de la incertidumbre f\u00edsica.<\/strong> Si las propiedades de su material tienen un 5% de incertidumbre, la refinaci\u00f3n hasta que el error num\u00e9rico sea de 0,001% es un desperdicio. La estimaci\u00f3n de error \u03c4 = c h^r le dice d\u00f3nde est\u00e1 el piso pr\u00e1ctico.<\/p>\n<h3>Una lista de verificaci\u00f3n de decisi\u00f3n pr\u00e1ctica<\/h3>\n<ul>\n<li>[ ] Ejecute 3-4 Refinamientos de malla con relaci\u00f3n de refinamiento R \u2248 2<\/li>\n<li>[ ] Calcular el orden observado p de la pendiente logar\u00edtmica<\/li>\n<li>[ ] Verificar p coincide con la predicci\u00f3n te\u00f3rica dentro de \u00b10.1<\/li>\n<li>[ ] Compute GCI para la malla m\u00e1s fina<\/li>\n<li>[ ] Comparar GCI con la incertidumbre de modelado (t\u00edpicamente 1-5%)<\/li>\n<li>[ ] <strong>Stop cuando:<\/strong> se confirma p y GCI &lt; 1% del QOI<\/li>\n<\/ul>\n<p>Si est\u00e1 ejecutando MMS para un c\u00f3digo de producci\u00f3n, esta lista de verificaci\u00f3n es suficiente. Para aplicaciones de seguridad cr\u00edtica (como la simulaci\u00f3n de reactores nucleares seg\u00fan el manual MPACT), se requieren controles adicionales para cada t\u00e9rmino en la ecuaci\u00f3n de gobierno.<\/p>\n<hr>\n<h2>Resumen<\/h2>\n<p>El viaje desde el error de truncamiento hasta la verificaci\u00f3n del c\u00f3digo sigue una ruta clara:<\/p>\n<ol>\n<li><strong>Serie Taylor<\/strong> revela la expresi\u00f3n de error de truncamiento te\u00f3rico \u03c4 = c h^r<\/li>\n<li><strong>Teorema de Lax-RichtMyer<\/strong> garantiza la convergencia cuando el esquema es consistente y estable<\/li>\n<li><strong>MMS<\/strong> proporciona el flujo de trabajo pr\u00e1ctico para verificar que su c\u00f3digo logre la tasa de convergencia te\u00f3rica<\/li>\n<li><strong>Estudios de refinamiento de cuadr\u00edcula<\/strong> Confirmar que las tasas observadas coinciden con las predicciones te\u00f3ricas<\/li>\n<\/ol>\n<p>La idea clave que une esto: el error de truncamiento no es solo un concepto te\u00f3rico: es la cantidad medible que confirman sus estudios de refinamiento de la red. Cuando el orden observado coincide con la predicci\u00f3n te\u00f3rica en 3+ refinamientos, se verifica su c\u00f3digo.<\/p>\n<p>Para los pr\u00f3ximos pasos, consulte nuestro <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">v&amp;v Visi\u00f3n general del framework<\/a> para el contexto de panorama general y nuestro <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">gu\u00eda de estudios de convergencia<\/a> para obtener recomendaciones pr\u00e1cticas de calidad de malla que complementen estos flujos de trabajo de verificaci\u00f3n.<\/p>\n<hr>\n<h2>referencias<\/h2>\n<ul>\n<li>Salari, K. &amp; Parque, K. (2000). \u00abVerificaci\u00f3n de c\u00f3digo por el m\u00e9todo de soluciones fabricadas\u00bb. Informe Laboratorios Nacionales Sandia 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). \u00abVerificaci\u00f3n y validaci\u00f3n en computaci\u00f3n cient\u00edfica\u00bb. Prensa de la Universidad de Cambridge.<\/li>\n<li>Langtangen, H.P. \u00abAn\u00e1lisis de errores de truncamiento para m\u00e9todos de diferencia finita\u00bb. <a href=\"http:\/\/hplgit.github.io\/num-methods-for-PDEs\/doc\/pub\/trunc\/html\/._trunc001.html\">M\u00e9todos num\u00e9ricos para la documentaci\u00f3n de PDES<\/a>.<\/li>\n<li>Documentaci\u00f3n de Moose MMS. <a href=\"https:\/\/mooseframework.inl.gov\/python\/mms.html\" target=\"_blank\" rel=\"nofollow noopener\">marco de alza<\/a><\/li>\n<li>Tutorial de convergencia de FenicsX. <a href=\"https:\/\/jsdokken.com\/dolfinx-tutorial\/chapter4\/convergence.html\" target=\"_blank\" rel=\"nofollow noopener\">tutorial de dolfinx<\/a><\/li>\n<li>Kindo, T. \u00abVerificar simulaciones con el m\u00e9todo de soluciones manufacturadas\u00bb. Blog de comsol. <a href=\"https:\/\/www.comsol.com\/blogs\/verify-simulations-with-the-method-of-manufactured-solutions\" target=\"_blank\" rel=\"nofollow noopener\">Fuente<\/a><\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Comida clave<\/h2>\n<ul>\n<li><strong>Error de truncamiento es la base de toda verificaci\u00f3n de c\u00f3digo<\/strong>: comprender la derivaci\u00f3n de la serie Taylor explica por qu\u00e9 funciona MMS y por qu\u00e9 las tasas de convergencia coinciden con las predicciones te\u00f3ricas.<\/li>\n<li><strong>El m\u00e9todo de soluciones manufacturadas (MMS) ahora est\u00e1 automatizada<\/strong>: los marcos como Moose y Fenicsx usan Sympy para derivar simb\u00f3licamente los t\u00e9rminos de origen, eliminando los errores de c\u00e1lculo manual que plagaron los esfuerzos de verificaci\u00f3n temprana.<\/li>\n<li><strong>Solo necesita 3 a 4 refinamientos de malla<\/strong> \u2014 Una vez observado el orden de precisi\u00f3n coincide con la predicci\u00f3n te\u00f3rica, el refinamiento adicional es un esfuerzo desperdiciado. La verdadera pregunta es: \u00bfcu\u00e1ndo es la verificaci\u00f3n \"suficientemente buena\"?<\/li>\n<li><strong>Los t\u00e9rminos de error de orden l\u00edder son diagn\u00f3sticos<\/strong>: la estructura de la expansi\u00f3n del error de truncamiento le indica exactamente qu\u00e9 aproximaci\u00f3n derivada est\u00e1 fallando, guiando la selecci\u00f3n de su esquema.<\/li>\n<\/ul>\n<hr>\n<h2>lo que en realidad est\u00e1s midiendo<\/h2>\n<p>Antes de sumergirnos en ecuaciones, aclaremos lo que realmente estamos verificando. En la comunidad de simulaci\u00f3n, <strong>verificaci\u00f3n<\/strong> y <strong>validaci\u00f3n<\/strong> a menudo se confunden, pero responden preguntas fundamentalmente diferentes:<\/p>\n<ul>\n<li><strong>Verificaci\u00f3n<\/strong> pregunta: <em>\"\u00bfEstamos resolviendo las ecuaciones correctamente?\"<\/em> Se trata de la consistencia interna. \u00bfLa implementaci\u00f3n num\u00e9rica resuelve fielmente el modelo matem\u00e1tico, independientemente de si ese modelo describe la realidad?<\/li>\n<li><strong>Validaci\u00f3n<\/strong> pregunta: <em>\"\u00bfEstamos resolviendo las ecuaciones correctas?\"<\/em> Compara los resultados de la simulaci\u00f3n con experimentos f\u00edsicos o datos de referencia.<\/li>\n<\/ul>\n<p>Si la publicaci\u00f3n de 182 <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">V&amp;v Framework Overview<\/a> le present\u00f3 el panorama general, este art\u00edculo perfora en la maquinaria matem\u00e1tica que hace que la verificaci\u00f3n sea rigurosa. Piense en ello como la pieza complementaria de nuestra <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">gu\u00eda de estudios de convergencia<\/a>, que cubre el lado emp\u00edrico. Aqu\u00ed, explicaremos <strong>por qu\u00e9<\/strong> los estudios de convergencia funcionan y le mostraremos c\u00f3mo automatizarlos.<\/p>\n<blockquote><p><strong>Marco mental: la br\u00fajula de error de truncamiento.<\/strong> Imagina el error de truncamiento como tu herramienta de navegaci\u00f3n. La expansi\u00f3n de la serie Taylor no solo te da un l\u00edmite: revela la direcci\u00f3n en la que tu esquema est\u00e1 sesgado. \u00bfAsimetr\u00eda de primer orden en las diferencias directas? Esa es su aguja de la br\u00fajula apuntando a la derivada de error dominante.<\/p><\/blockquote>\n<hr>\n<h2>Error de truncamiento: la base matem\u00e1tica<\/h2>\n<p>La fuente m\u00e1s com\u00fan de error num\u00e9rico en los m\u00e9todos de diferencia finita, elementos finitos y de volumen finito es <strong>error de truncamiento<\/strong>: la diferencia entre el operador diferencial exacto y su aproximaci\u00f3n discreta.<\/p>\n<p>Esto es lo que la mayor\u00eda de los libros de texto no enfatizan lo suficiente: la derivaci\u00f3n del error de truncamiento a trav\u00e9s de la serie Taylor no es un ejercicio acad\u00e9mico. Es la base pr\u00e1ctica para cada estudio de refinamiento de la red que ejecutar\u00e1s. Veamos por qu\u00e9.<\/p>\n<p>Considere la derivada del tiempo de Euler hacia atr\u00e1s:<\/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>El t\u00e9rmino de error principal es <strong>positivo<\/strong> y proporcional a <strong>\u0394t<\/strong>. Para el delantero Euler, el signo cambia. Para una diferencia central en el espacio:<\/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>Observe la simetr\u00eda: los t\u00e9rminos de orden impar se cancelan, dando una precisi\u00f3n de <strong>segundo pedido<\/strong>. La simetr\u00eda par\/impar de la expansi\u00f3n de Taylor es la raz\u00f3n por la cual las diferencias centrales superan a los esquemas de avance\/retroceso.<\/p>\n<h3>Una comparaci\u00f3n pr\u00e1ctica<\/h3>\n<table>\n<thead>\n<tr>\n<th>Esquema<\/th>\n<th>F\u00f3rmula<\/th>\n<th>Error de truncamiento<\/th>\n<th>Pedido<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Diferencia hacia adelante<\/td>\n<td><code>(u(x+\u0394x) - u(x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1\u00ba<\/td>\n<\/tr>\n<tr>\n<td>diferencia hacia atr\u00e1s<\/td>\n<td><code>(u(x) - u(x-\u0394x)) \/ \u0394x<\/code><\/td>\n<td><code>\u2212\u00bd u'' \u0394x<\/code><\/td>\n<td>1\u00ba<\/td>\n<\/tr>\n<tr>\n<td>diferencia central<\/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>2do<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La tabla anterior no es solo una comparaci\u00f3n, es una herramienta de diagn\u00f3stico. Si su estudio de convergencia muestra el primer orden cuando se esperaba de segundo orden, el t\u00e9rmino de error de orden principal le indica exactamente qu\u00e9 est\u00e1 mal.<\/p>\n<h3>La expresi\u00f3n de error de truncamiento<\/h3>\n<p>Para una discretizaci\u00f3n general, el error de truncamiento toma la forma:<\/p>\n<p>$$tau = C H^r$$<\/p>\n<p>donde <strong>h<\/strong> es el par\u00e1metro de discretizaci\u00f3n (tama\u00f1o de malla o paso de tiempo) y <strong>r<\/strong> es la tasa de convergencia. Esta expresi\u00f3n es <strong>no<\/strong> solo un l\u00edmite asint\u00f3tico: es la cantidad real que verificas emp\u00edricamente. Cada estudio de refinamiento de la red es fundamentalmente un intento de confirmar que la expresi\u00f3n del error de truncamiento te\u00f3rico coincide con el error medido.<\/p>\n<p>Esta conexi\u00f3n entre el \u03c4 te\u00f3rico y la medici\u00f3n de error emp\u00edrico es lo que hace que la verificaci\u00f3n del c\u00f3digo sea rigurosa en lugar de ondulada con la mano.<\/p>\n<hr>\n<h2>Del error de truncamiento a la convergencia<\/h2>\n<p>Ahora que tenemos la expresi\u00f3n de error de truncamiento, conect\u00e9mosla con el gran teorema del an\u00e1lisis num\u00e9rico: el teorema de equivalencia <strong>lax-richtmyer<\/strong>.<\/p>\n<p>El teorema dice, en ingl\u00e9s sencillo:<\/p>\n<blockquote><p><strong>Para problemas lineales y bien planteados, una discretizaci\u00f3n constante y estable es convergente.<\/strong><\/p><\/blockquote>\n<p>Desempaquemos cada t\u00e9rmino a nivel de practicante:<\/p>\n<p><strong>consistente<\/strong> significa que el error de truncamiento va a cero como H \u2192 0. Si su esquema tiene \u03c4 = o(h\u00b2), es consistente.<\/p>\n<p><strong>estable<\/strong> significa que los errores no crecen sin l\u00edmites. La soluci\u00f3n num\u00e9rica permanece limitada en relaci\u00f3n con los datos iniciales. Verifica la estabilidad a trav\u00e9s del an\u00e1lisis de von Neumann, los m\u00e9todos de energ\u00eda o las comprobaciones pr\u00e1cticas de condici\u00f3n de CFL.<\/p>\n<p><strong>Convergente<\/strong> significa que la soluci\u00f3n num\u00e9rica se acerca a la soluci\u00f3n exacta como H \u2192 0.<\/p>\n<p>El boceto de prueba del teorema (que deber\u00edas saber intuitivamente, no memorizar):<\/p>\n<ol>\n<li>La consistencia garantiza que el operador discreto se aproxima al operador continuo.<\/li>\n<li>La estabilidad limita la propagaci\u00f3n de errores a trav\u00e9s de cada paso de tiempo.<\/li>\n<li>Juntos, garantizan que el error total (error de truncamiento acumulado sobre n = t\/\u0394t pasos) permanece limitado y converge a cero.<\/li>\n<\/ol>\n<p>El teorema de Lax-RichtMyer explica <strong>por qu\u00e9<\/strong> existen requisitos de estabilidad. No puedes simplemente reducir H arbitrariamente; Tambi\u00e9n debe asegurarse de que su esquema sea estable. Para la integraci\u00f3n de tiempo expl\u00edcita, esa es la condici\u00f3n CFL. Para esquemas impl\u00edcitos, por lo general est\u00e1 seguro, pero la tolerancia de iteraci\u00f3n se convierte en la nueva preocupaci\u00f3n de estabilidad.<\/p>\n<hr>\n<h2>El m\u00e9todo de las soluciones manufacturadas<\/h2>\n<p>Ahora, para el pago pr\u00e1ctico: \u00bfc\u00f3mo verificas que tu c\u00f3digo resuelva las ecuaciones correctamente? El enfoque m\u00e1s riguroso es el <strong>m\u00e9todo de soluciones manufacturadas (MMS)<\/strong>.<\/p>\n<p>El informe Sandia 2000 de Salari y Park estableci\u00f3 MMS como el est\u00e1ndar de la industria y ahora tiene m\u00e1s de 555 citas. \u00bfLa raz\u00f3n? MMS funciona para <strong>cualquier PDE<\/strong> \u2014 multif\u00edsico lineal, no lineal, acoplado, mientras que los puntos de referencia anal\u00edticos solo existen para casos de prueba simples.<\/p>\n<h3>El flujo de trabajo de MMS<\/h3>\n<p>La belleza de MMS es que da la vuelta al problema de verificaci\u00f3n en su cabeza:<\/p>\n<ol>\n<li><strong>Elija una soluci\u00f3n manufacturada<\/strong> u_manufactured(x, t) \u2014 una funci\u00f3n suave arbitraria<\/li>\n<li><strong>Sustituya en el PDE<\/strong> para derivar el t\u00e9rmino de forzamiento\/fuente que hace que u_manufactured sea una soluci\u00f3n exacta<\/li>\n<li><strong>Derivar condiciones iniciales y de contorno<\/strong> de u_manufacturado<\/li>\n<li><strong>Ejecutar la simulaci\u00f3n<\/strong> con estas entradas modificadas<\/li>\n<li><strong>Comparar<\/strong> la soluci\u00f3n calculada contra u_manufacturado<\/li>\n<\/ol>\n<p>Si la soluci\u00f3n num\u00e9rica coincide con la soluci\u00f3n fabricada dentro de los l\u00edmites de error esperados, se verifica su c\u00f3digo.<\/p>\n<p>Vamos a repasar esto con el c\u00f3digo Python concreto. Usaremos dos de los marcos de c\u00f3digo abierto m\u00e1s adoptados: Moose y FenicsX.<\/p>\n<h3>Moose MMS: automatizaci\u00f3n simb\u00f3lica<\/h3>\n<p>El m\u00f3dulo <code>mms<\/code> de Moose envuelve Sympy para derivar funciones de forzamiento autom\u00e1ticamente. As\u00ed es como se configura un estudio de convergencia espacial para una ecuaci\u00f3n de difusi\u00f3n:<\/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 salida le dice exactamente qu\u00e9 poner en su archivo de entrada <code>.i<\/code>:<\/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>Esta derivaci\u00f3n simb\u00f3lica es crucial. Para una ecuaci\u00f3n de difusi\u00f3n simple 1D, puede derivar el t\u00e9rmino fuente a mano. Para Navier-Stokes o elasticidad con t\u00e9rminos acoplados, el c\u00e1lculo simb\u00f3lico no es opcional, es la \u00fanica forma de evitar errores.<\/p>\n<p>El archivo de entrada de alce se ve as\u00ed:<\/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>Luego automatizas el estudio de convergencia:<\/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>En un gr\u00e1fico logar\u00edtmico, la pendiente de cada l\u00ednea le da la tasa de convergencia observada. Para los elementos de primer orden, la pendiente debe acercarse a 2. Para los elementos de segundo orden, deber\u00eda acercarse a 3.<\/p>\n<h3>FenicsX: estudios de convergencia de pit\u00f3n pura<\/h3>\n<p>FenicsX (el sucesor de Fenics\/Dolfin) proporciona una interfaz Python igualmente poderosa. As\u00ed es como calcula las normas de error y las tasas de convergencia:<\/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>La informaci\u00f3n clave aqu\u00ed es <strong>C\u00e1lculo de norma de error confiable<\/strong>. Cuando el error es peque\u00f1o, el c\u00e1lculo directo <code>(u_ex - uh)^2<\/code> puede sufrir errores de redondeo porque est\u00e1 restando dos n\u00fameros casi iguales. El tutorial de FenicsX recomienda interpolar ambas soluciones en un espacio de funci\u00f3n de orden superior primero:<\/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>Luego ejecutas el estudio de convergencia:<\/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 salida de los elementos de primer orden muestra las tasas cercanas a 2:<\/p>\n<pre><code>Rates: [1.61 1.89 1.97 1.99]\n<\/code><\/pre>\n<p>Para los elementos de segundo orden, el enfoque de tasas 3. Esta es la manifestaci\u00f3n emp\u00edrica del an\u00e1lisis de errores te\u00f3ricos de truncamiento que discutimos anteriormente.<\/p>\n<hr>\n<h2>Estudios pr\u00e1cticos de convergencia: interpretaci\u00f3n de los resultados<\/h2>\n<p>Has ejecutado tu estudio de refinamiento de la red. Tiene su parcela de registro. Las pendientes est\u00e1n cerca de los valores te\u00f3ricos. Pero, \u00bfqu\u00e9 te dice esto realmente?<\/p>\n<h3>la f\u00f3rmula de orden observada<\/h3>\n<p>Para los tama\u00f1os de malla H_I y H_{i-1} con los errores correspondientes E_I y E_{i-1}, el orden observado es:<\/p>\n<p>$$P approx frac{ln(e_{i-1} \/ e_i)}{ln(h_{i-1} \/ h_i)}$$<\/p>\n<p>Si la relaci\u00f3n de refinamiento de la red es <strong>r \u2248 2<\/strong> (com\u00fan en estudios), esto se simplifica a:<\/p>\n<p>$$P approx log_2(e_{i-1} \/ e_i)$$<\/p>\n<p>Cuando su orden observado se acerca a la predicci\u00f3n te\u00f3rica, ha confirmado que su c\u00f3digo opera en el r\u00e9gimen asint\u00f3tico. Este es el hito de verificaci\u00f3n.<\/p>\n<h3>Elevaci\u00f3n de t\u00edtulos: un truco pr\u00e1ctico<\/h3>\n<p>Para las normas de error L2, el c\u00e1lculo directo puede ocultar la verdadera tasa de convergencia debido a la redondeo. La t\u00e9cnica de elevaci\u00f3n de grado (interpolando en un espacio un grado superior antes de la resta) es la soluci\u00f3n est\u00e1ndar en FenicsX. Sin \u00e9l, puede informar una convergencia de segundo orden cuando el c\u00f3digo en realidad converge en el tercer orden.<\/p>\n<hr>\n<h2>Cu\u00e1ndo dejar de verificar<\/h2>\n<p>Aqu\u00ed est\u00e1 la realidad pr\u00e1ctica: la verificaci\u00f3n es costosa. Cada refinamiento de malla duplica (o cuadruplica para 2D) su costo computacional. No se puede refinar infinitamente. Entonces, \u00bfcu\u00e1ndo paras?<\/p>\n<p>El campo ha convergido en tres heur\u00edsticas pr\u00e1cticas:<\/p>\n<p><strong>1. El orden observado coincide con la predicci\u00f3n te\u00f3rica.<\/strong> Cuando tiene 3+ refinamientos de malla y el orden observado converge al valor te\u00f3rico dentro de la tolerancia (t\u00edpicamente \u00b10.1), su c\u00f3digo se verifica en el r\u00e9gimen asint\u00f3tico. No se necesita m\u00e1s refinamiento para fines de verificaci\u00f3n.<\/p>\n<p><strong>2. El \u00edndice de convergencia de cuadr\u00edcula (GCI) cae por debajo de ~1%.<\/strong> El GCI cuantifica la banda de incertidumbre del refinamiento de la malla. Cuando GCI &lt; 1% de su cantidad de inter\u00e9s, el error num\u00e9rico es insignificante en relaci\u00f3n con la incertidumbre de modelado.<\/p>\n<p><strong>3. El error num\u00e9rico cae por debajo de la incertidumbre f\u00edsica.<\/strong> Si las propiedades de su material tienen un 5% de incertidumbre, la refinaci\u00f3n hasta que el error num\u00e9rico sea de 0,001% es un desperdicio. La estimaci\u00f3n de error \u03c4 = c h^r le dice d\u00f3nde est\u00e1 el piso pr\u00e1ctico.<\/p>\n<h3>Una lista de verificaci\u00f3n de decisi\u00f3n pr\u00e1ctica<\/h3>\n<ul>\n<li>[ ] Ejecute 3-4 Refinamientos de malla con relaci\u00f3n de refinamiento R \u2248 2<\/li>\n<li>[ ] Calcular el orden observado p de la pendiente logar\u00edtmica<\/li>\n<li>[ ] Verificar p coincide con la predicci\u00f3n te\u00f3rica dentro de \u00b10.1<\/li>\n<li>[ ] Compute GCI para la malla m\u00e1s fina<\/li>\n<li>[ ] Comparar GCI con la incertidumbre de modelado (t\u00edpicamente 1-5%)<\/li>\n<li>[ ] <strong>Stop cuando:<\/strong> se confirma p y GCI &lt; 1% del QOI<\/li>\n<\/ul>\n<p>Si est\u00e1 ejecutando MMS para un c\u00f3digo de producci\u00f3n, esta lista de verificaci\u00f3n es suficiente. Para aplicaciones de seguridad cr\u00edtica (como la simulaci\u00f3n de reactores nucleares seg\u00fan el manual MPACT), se requieren controles adicionales para cada t\u00e9rmino en la ecuaci\u00f3n de gobierno.<\/p>\n<hr>\n<h2>Resumen<\/h2>\n<p>El viaje desde el error de truncamiento hasta la verificaci\u00f3n del c\u00f3digo sigue una ruta clara:<\/p>\n<ol>\n<li><strong>Serie Taylor<\/strong> revela la expresi\u00f3n de error de truncamiento te\u00f3rico \u03c4 = c h^r<\/li>\n<li><strong>Teorema de Lax-RichtMyer<\/strong> garantiza la convergencia cuando el esquema es consistente y estable<\/li>\n<li><strong>MMS<\/strong> proporciona el flujo de trabajo pr\u00e1ctico para verificar que su c\u00f3digo logre la tasa de convergencia te\u00f3rica<\/li>\n<li><strong>Estudios de refinamiento de cuadr\u00edcula<\/strong> Confirmar que las tasas observadas coinciden con las predicciones te\u00f3ricas<\/li>\n<\/ol>\n<p>La idea clave que une esto: el error de truncamiento no es solo un concepto te\u00f3rico: es la cantidad medible que confirman sus estudios de refinamiento de la red. Cuando el orden observado coincide con la predicci\u00f3n te\u00f3rica en 3+ refinamientos, se verifica su c\u00f3digo.<\/p>\n<p>Para los pr\u00f3ximos pasos, consulte nuestro <a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">v&amp;v Visi\u00f3n general del framework<\/a> para el contexto de panorama general y nuestro <a href=\"https:\/\/matforge.org\/mesh-quality-convergence-studies-guide-2\/\">gu\u00eda de estudios de convergencia<\/a> para obtener recomendaciones pr\u00e1cticas de calidad de malla que complementen estos flujos de trabajo de verificaci\u00f3n.<\/p>\n<hr>\n<h2>referencias<\/h2>\n<ul>\n<li>Salari, K. &amp; Parque, K. (2000). \"Verificaci\u00f3n de c\u00f3digo por el m\u00e9todo de soluciones fabricadas\". Informe Laboratorios Nacionales Sandia 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). \"Verificaci\u00f3n y validaci\u00f3n en computaci\u00f3n cient\u00edfica\". Prensa de la Universidad de Cambridge.<\/li>\n<li>Langtangen, H.P. \"An\u00e1lisis de errores de truncamiento para m\u00e9todos de diferencia finita\". <a href=\"http:\/\/hplgit.github.io\/num-methods-for-PDEs\/doc\/pub\/trunc\/html\/._trunc001.html\">M\u00e9todos num\u00e9ricos para la documentaci\u00f3n de PDES<\/a>.<\/li>\n<li>Documentaci\u00f3n de Moose MMS. <a href=\"https:\/\/mooseframework.inl.gov\/python\/mms.html\" target=\"_blank\" rel=\"nofollow noopener\">marco de alza<\/a><\/li>\n<li>Tutorial de convergencia de FenicsX. <a href=\"https:\/\/jsdokken.com\/dolfinx-tutorial\/chapter4\/convergence.html\" target=\"_blank\" rel=\"nofollow noopener\">tutorial de dolfinx<\/a><\/li>\n<li>Kindo, T. \"Verificar simulaciones con el m\u00e9todo de soluciones manufacturadas\". Blog de comsol. <a href=\"https:\/\/www.comsol.com\/blogs\/verify-simulations-with-the-method-of-manufactured-solutions\" target=\"_blank\" rel=\"nofollow noopener\">Fuente<\/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>Comida clave Error de truncamiento es la base de toda verificaci\u00f3n de c\u00f3digo: comprender la derivaci\u00f3n de la serie Taylor explica por qu\u00e9 funciona MMS y por qu\u00e9 las tasas de convergencia coinciden con las predicciones te\u00f3ricas. El m\u00e9todo de soluciones manufacturadas (MMS) ahora est\u00e1 automatizada: los marcos como Moose y Fenicsx usan Sympy para [&hellip;]<\/p>\n","protected":false,"raw":""},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=520","iawp_total_views":14,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-785","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - 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\/es\/error-estimation-verification-methods\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  9 minutesComida clave Error de truncamiento es la base de toda verificaci\u00f3n de c\u00f3digo: comprender la derivaci\u00f3n de la serie Taylor explica por qu\u00e9 funciona MMS y por qu\u00e9 las tasas de convergencia coinciden con las predicciones te\u00f3ricas. El m\u00e9todo de soluciones manufacturadas (MMS) ahora est\u00e1 automatizada: los marcos como Moose y Fenicsx usan Sympy para [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T12:21:40+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo\",\"datePublished\":\"2026-07-30T12:21:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/\"},\"wordCount\":2441,\"commentCount\":0,\"articleSection\":[\"Simulaci\u00f3n &amp; Proyectos de modelado\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/\",\"name\":\"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-30T12:21:40+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/error-estimation-verification-methods\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo\"}]},{\"@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\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - 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\/es\/error-estimation-verification-methods\/","og_locale":"es_ES","og_type":"article","og_title":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - matforge.org","og_description":"Reading Time:  9 minutesComida clave Error de truncamiento es la base de toda verificaci\u00f3n de c\u00f3digo: comprender la derivaci\u00f3n de la serie Taylor explica por qu\u00e9 funciona MMS y por qu\u00e9 las tasas de convergencia coinciden con las predicciones te\u00f3ricas. El m\u00e9todo de soluciones manufacturadas (MMS) ahora est\u00e1 automatizada: los marcos como Moose y Fenicsx usan Sympy para [&hellip;]","og_url":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/","og_site_name":"matforge.org","article_published_time":"2026-07-30T12:21:40+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Elena Markovska","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo","datePublished":"2026-07-30T12:21:40+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/"},"wordCount":2441,"commentCount":0,"articleSection":["Simulaci\u00f3n &amp; Proyectos de modelado"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/error-estimation-verification-methods\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/","url":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/","name":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-30T12:21:40+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"breadcrumb":{"@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/error-estimation-verification-methods\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/error-estimation-verification-methods\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"M\u00e9todos de estimaci\u00f3n y verificaci\u00f3n de errores: de error de truncamiento a verificaci\u00f3n de c\u00f3digo"}]},{"@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":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"es","@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\/785","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=785"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/785\/revisions"}],"predecessor-version":[{"id":939,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/785\/revisions\/939"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}