{"id":525,"date":"2026-07-21T14:54:13","date_gmt":"2026-07-21T14:54:13","guid":{"rendered":"https:\/\/matforge.org\/?p=525","raw":"https:\/\/matforge.org\/?p=525"},"modified":"2026-07-21T14:54:13","modified_gmt":"2026-07-21T14:54:13","slug":"adaptive-time-stepping-pde-solvers","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/","title":{"rendered":"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL","raw":"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><article>\n<p>Paso de tiempo adaptativo Cambia el tama\u00f1o del paso de tiempo durante una simulaci\u00f3n. El solucionador toma pasos m\u00e1s peque\u00f1os cuando la soluci\u00f3n cambia r\u00e1pidamente y pasos m\u00e1s grandes cuando la evoluci\u00f3n se vuelve suave.<\/p>\n<p>Un c\u00e1lculo de paso fijo debe usar un valor de <code>\u0394t<\/code> a lo largo de toda la simulaci\u00f3n. Ese valor a menudo se selecciona de acuerdo con el evento m\u00e1s exigente, transitorio o restricci\u00f3n de estabilidad. Luego se usa el mismo peque\u00f1o paso durante largos intervalos donde es innecesario.<\/p>\n<p>Un m\u00e9todo adaptativo estima el error de cada paso propuesto. Acepta el paso cuando el error normalizado est\u00e1 por debajo de la tolerancia solicitada y lo rechaza cuando el error es demasiado grande. Luego, un controlador selecciona un nuevo tama\u00f1o de paso.<\/p>\n<p>El control de errores es solo una parte del proceso. Los m\u00e9todos expl\u00edcitos a\u00fan deben respetar los l\u00edmites de CFL y de difusi\u00f3n. Los m\u00e9todos impl\u00edcitos pueden necesitar restricciones de precisi\u00f3n, convergencia no lineal, resoluci\u00f3n de onda, eventos o restricciones f\u00edsicas. Un solucionador confiable combina estos requisitos en lugar de permitir que una estimaci\u00f3n de error controle todo.<\/p>\n<h2>\u00bfQu\u00e9 es el paso de tiempo adaptativo?<\/h2>\n<p>Despu\u00e9s de la discretizaci\u00f3n espacial, una PDE dependiente del tiempo se convierte com\u00fanmente en un sistema de ecuaciones diferenciales ordinarias:<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Un m\u00e9todo num\u00e9rico avanza la soluci\u00f3n de <code>t\u207f<\/code> a:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Un solucionador adaptativo sigue un ciclo de aceptaci\u00f3n o rechazo:<\/p>\n<ol>\n<li>Proponer un paso de tiempo.<\/li>\n<li>Calcular una soluci\u00f3n de prueba.<\/li>\n<li>Estimar el error temporal local.<\/li>\n<li>Normalice el error utilizando tolerancias absolutas y relativas.<\/li>\n<li>aceptar o rechazar el paso de prueba.<\/li>\n<li>Seleccione el siguiente tama\u00f1o de paso.<\/li>\n<\/ol>\n<p>Los pasos rechazados no adelantan el tiempo de simulaci\u00f3n. El solucionador restaura el estado aceptado anterior y repite el c\u00e1lculo con un valor menor de <code>\u0394t<\/code>.<\/p>\n<h2>Error local y error global<\/h2>\n<p>El error de truncamiento local es el error introducido en un paso de tiempo cuando el paso comienza desde la soluci\u00f3n exacta.<\/p>\n<p>El error global es la diferencia acumulada entre las soluciones num\u00e9ricas y exactas despu\u00e9s de muchos pasos.<\/p>\n<p>Para un m\u00e9todo de orden <code>p<\/code>:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Los m\u00e9todos adaptativos normalmente estiman el error local. Mantener cada estimaci\u00f3n local por debajo de una tolerancia no proporciona un l\u00edmite riguroso universal sobre el error global, pero ofrece un efectivo mecanismo de control pr\u00e1ctico.<\/p>\n<h2>Tolerancias absolutas y relativas<\/h2>\n<p>Un valor de error bruto tiene poco significado sin la escala de cada componente de la soluci\u00f3n. Por lo tanto, los solucionadores adaptativos calculan un error normalizado.<\/p>\n<p>Una escala de componentes comunes es:<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>El error cuadrado medio ponderado normalizado es:<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>El paso se acepta normalmente cuando:<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>La tolerancia absoluta controla los componentes cerca de cero. La tolerancia relativa controla componentes cuyas magnitudes son grandes en comparaci\u00f3n con <code>atol<\/code>.<\/p>\n<p>Diferentes campos pueden requerir diferentes tolerancias absolutas. Una temperatura medida en cientos de Kelvin no deber\u00eda usar necesariamente la misma tolerancia absoluta que una concentraci\u00f3n cercana a <code>10\u207b\u2079<\/code>.<\/p>\n<h2>C\u00f3mo se selecciona el siguiente paso<\/h2>\n<p>Si el error local estimado se comporta como:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Un controlador b\u00e1sico puede usar:<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>El factor de seguridad es menor que uno. Reduce la posibilidad de que el siguiente paso se sit\u00fae directamente en el l\u00edmite de rechazo.<\/p>\n<p>Las implementaciones de producci\u00f3n tambi\u00e9n limitan los cambios de tama\u00f1o de paso:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>El exponente correcto depende del orden representado por el estimador de error y la convenci\u00f3n del controlador. No debe copiarse a ciegas entre m\u00e9todos no relacionados.<\/p>\n<h2>Controladores I, PI y PID<\/h2>\n<p>Un controlador integral simple utiliza solo el error normalizado actual. Esto puede hacer que el historial de pasos de tiempo alterna entre aumentos agresivos y rechazos.<\/p>\n<p>Los controladores PI y PID tambi\u00e9n usan errores de pasos anteriores aceptados. Esto produce cambios de tama\u00f1o de paso m\u00e1s suaves y puede reducir las tasas de rechazo.<\/p>\n<p>Un controlador de PI simplificado tiene el formulario:<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Los coeficientes dependen del orden del m\u00e9todo y el dise\u00f1o del controlador. El control sofisticado es \u00fatil, pero no puede reparar un estimador de error inexacto o un integrador de tiempo inadecuado.<\/p>\n<h2>Pares de Runge-Kutta integrados<\/h2>\n<p>Un par incrustado de Runge-Kutta calcula dos aproximaciones a partir del mismo conjunto de etapas intermedias.<\/p>\n<p>Las dos f\u00f3rmulas tienen diferentes \u00f3rdenes:<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>La diferencia proporciona una estimaci\u00f3n de error:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>Debido a que ambas f\u00f3rmulas comparten sus evaluaciones de etapa, el estimador es mucho m\u00e1s barato que completar dos integraciones independientes.<\/p>\n<p>Los m\u00e9todos incrustados expl\u00edcitos de Runge-Kutta son los m\u00e1s adecuados para los sistemas no r\u00edgidos. Si la rigidez controla el tama\u00f1o del paso, aumentando o disminuyendo <code>\u0394t<\/code><\/p>\n<h2>Pr\u00edncipe 5(4)<\/h2>\n<p>Dormand-Prince 5(4) es un par incrustado de siete etapas. Produce una soluci\u00f3n de quinto orden y una estimaci\u00f3n de error de cuarto orden.<\/p>\n<p>El par utiliza extrapolaci\u00f3n local: la aproximaci\u00f3n de quinto orden se convierte en la soluci\u00f3n aceptada, mientras que la f\u00f3rmula de orden inferior controla el paso.<\/p>\n<p>Tambi\u00e9n tiene una propiedad FSAL en uso ordinario. La \u00faltima evaluaci\u00f3n derivada de un paso aceptado puede convertirse en la primera evaluaci\u00f3n del siguiente paso, reduciendo el n\u00famero de nuevas evaluaciones de funciones despu\u00e9s del inicio.<\/p>\n<p>Dormand-Pr\u00edncipe es utilizado por <code>RK45<\/code> de Scipy y <code>ode45<\/code> de Matlab. Es una fuerte elecci\u00f3n de prop\u00f3sito general para problemas de valor inicial no r\u00edgidos y suaves.<\/p>\n<h2>tsit5<\/h2>\n<p>TSIT5 es el m\u00e9todo de Runge-Kutta integrado Tsitouras 5(4). Es ampliamente utilizado en el ecosistema SCIML como m\u00e9todo predeterminado para problemas no r\u00edgidos en tolerancias ordinarias.<\/p>\n<p>El m\u00e9todo est\u00e1 dise\u00f1ado para proporcionar un equilibrio favorable entre la calidad de la estimaci\u00f3n de errores, el costo de la etapa y la eficiencia pr\u00e1ctica.<\/p>\n<p>sigue siendo un m\u00e9todo expl\u00edcito. Si una PDE semidiscreta es r\u00edgida debido a la difusi\u00f3n, las reacciones o las escalas de tiempo fuertemente separadas, un m\u00e9todo impl\u00edcito, Rosenbrock, BDF o IMEX pueden ser m\u00e1s eficientes.<\/p>\n<h2>Bogacki-Shammine 3(2)<\/h2>\n<p>Bogacki-Shampin 3(2) es un par incrustado de cuatro etapas. Proporciona una soluci\u00f3n aceptada de tercer orden con un estimador de error de segundo orden.<\/p>\n<p>Se implementa como <code>RK23<\/code> en scipy y subyace al <code>ode23<\/code> de Matlab.<\/p>\n<p>El par puede ser \u00fatil cuando la precisi\u00f3n moderada es suficiente o cuando las evaluaciones de funciones son econ\u00f3micas. Su orden inferior puede requerir pasos m\u00e1s aceptados que un m\u00e9todo de quinto orden cuando se solicitan tolerancias estrictas.<\/p>\n<h2>paso a paso<\/h2>\n<p>La duplicaci\u00f3n de pasos estima el error temporal al comparar el mismo m\u00e9todo num\u00e9rico en dos resoluciones.<\/p>\n<p>El procedimiento calcula:<\/p>\n<ol>\n<li>Un paso completo de longitud <code>\u0394t<\/code>.<\/li>\n<li>Dos semi-seguros de longitud <code>\u0394t\/2<\/code>.<\/li>\n<li>La diferencia entre los dos resultados.<\/li>\n<\/ol>\n<p>Para un m\u00e9todo de orden <code>p<\/code>, una estimaci\u00f3n del error en el resultado de dos pasos refinado es:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>La soluci\u00f3n aceptada normalmente deber\u00eda ser el resultado de los dos semi-pasos porque es m\u00e1s precisa.<\/p>\n<p>La duplicaci\u00f3n de pasos requiere tres aplicaciones del m\u00e9todo subyacente: un paso completo y dos medios pasos. Por lo tanto, una implementaci\u00f3n impl\u00edcita puede requerir tres soluciones no lineales o lineales a menos que se pueda reutilizar alg\u00fan trabajo de configuraci\u00f3n.<\/p>\n<h2>Estimaci\u00f3n de residuos y defectos<\/h2>\n<p>Los m\u00e9todos basados en residuos eval\u00faan qu\u00e9 tan de cerca una trayectoria num\u00e9rica reconstruida satisface la ecuaci\u00f3n diferencial entre puntos aceptados.<\/p>\n<p>Una reconstrucci\u00f3n continua <code>\u0169(t)<\/code> tiene un defecto:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>El defecto puede soportar una estimaci\u00f3n de error cuando se combina con informaci\u00f3n de estabilidad o una norma apropiada.<\/p>\n<p>El residuo algebraico de una soluci\u00f3n impl\u00edcita no es autom\u00e1ticamente una estimaci\u00f3n de error temporal. El m\u00e9todo de Newton puede reducir la ecuaci\u00f3n discreta residual casi a cero incluso cuando el paso de tiempo es demasiado grande para representar la soluci\u00f3n f\u00edsica con precisi\u00f3n.<\/p>\n<p>Por lo tanto, la convergencia algebraica y el error de truncamiento temporal requieren controles separados.<\/p>\n<h2>M\u00e9todos BDF adaptativos<\/h2>\n<p>Las f\u00f3rmulas de diferenciaci\u00f3n hacia atr\u00e1s son m\u00e9todos impl\u00edcitos de varios pasos que se utilizan para sistemas r\u00edgidos. Las implementaciones de orden variable com\u00fanmente cambian entre los pedidos del uno al cinco.<\/p>\n<p>Un solucionador de BDF almacena informaci\u00f3n de estados anteriores aceptados. Construye un predictor para el nuevo estado, resuelve la ecuaci\u00f3n impl\u00edcita y estima el error de truncamiento local usando diferencias divididas o una representaci\u00f3n de historia similar a Nordsieck.<\/p>\n<p>El solucionador puede cambiar:<\/p>\n<ul>\n<li>El tama\u00f1o de paso de tiempo<\/li>\n<li>El orden BDF<\/li>\n<li>La frecuencia de las actualizaciones jacobianas<\/li>\n<li>El solucionador lineal o la configuraci\u00f3n del preacondicionador<\/li>\n<\/ul>\n<p>Una soluci\u00f3n suave puede justificar el aumento del orden. Un evento, fase de inicio, discontinuidad o prueba de error fallida puede obligar al solucionador a reducir su orden y tama\u00f1o de paso.<\/p>\n<p>BDF2 es una f\u00f3rmula de diferenciaci\u00f3n hacia atr\u00e1s. No es Crank-Nicolson, aunque ambos m\u00e9todos son de segundo orden.<\/p>\n<h2>Control de errores en Comsol BDF<\/h2>\n<p>El controlador BDF de COMSOL eval\u00faa una estimaci\u00f3n de error local cuadrado medio ponderado de la ra\u00edz. Un paso pasa cuando el error normalizado est\u00e1 por debajo de uno.<\/p>\n<p>El solucionador puede usar \u00f3rdenes BDF de uno a cinco. Examina la suavidad de la soluci\u00f3n, selecciona un orden, intenta un paso y repite el paso con un tama\u00f1o m\u00e1s peque\u00f1o cuando falla la prueba de error local.<\/p>\n<p>Su registro de solucionador incluye:<\/p>\n<ul>\n<li><code>Order<\/code> para el orden BDF actual<\/li>\n<li><code>Tfail<\/code> para pruebas de error de paso de tiempo fallidas<\/li>\n<li><code>NLfail<\/code> Para fallos de solucionador no lineal<\/li>\n<\/ul>\n<p>Un recuento alto de <code>Tfail<\/code> sugiere que el controlador frecuentemente propon\u00eda pasos que eran demasiado grandes para la precisi\u00f3n solicitada. Un recuento alto de <code>NLfail<\/code> indica que la soluci\u00f3n algebraica no lineal luch\u00f3.<\/p>\n<p>Estas dos fallas no deben interpretarse como el mismo problema.<\/p>\n<p>El mecanismo detallado se describe en <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">Paso de tiempo autom\u00e1tico y selecci\u00f3n de pedidos en problemas dependientes del tiempo<\/a>.<\/p>\n<h2>Error algebraico y error temporal<\/h2>\n<p>Un m\u00e9todo impl\u00edcito resuelve un sistema no lineal en cada paso de tiempo. Si Newton o el solucionador lineal termina demasiado pronto, el error algebraico puede volverse comparable al error temporal.<\/p>\n<p>El controlador de paso de tiempo puede entonces reaccionar a un error que proviene de una convergencia algebraica incompleta en lugar de la discretizaci\u00f3n del tiempo.<\/p>\n<p>Una configuraci\u00f3n de solucionador cre\u00edble deber\u00eda hacer que la tolerancia algebraica sea lo suficientemente estrecha que el objetivo temporal. Hacer que sea innecesariamente estricto tambi\u00e9n desperdicia el trabajo.<\/p>\n<p>Algunos solucionadores coordinan la convergencia no lineal y la selecci\u00f3n de pasos de tiempo. Un controlador no lineal puede reducir el paso cuando la estabilidad de Newton requiere un valor menor que el que propone el estimador de precisi\u00f3n BDF.<\/p>\n<h2>L\u00edmites CFL y pasos adaptativos<\/h2>\n<p>El control de error expl\u00edcito no puede anular una restricci\u00f3n de estabilidad expl\u00edcita.<\/p>\n<p>Para la advecci\u00f3n, un l\u00edmite CFL t\u00edpico es:<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>Para la difusi\u00f3n expl\u00edcitamente integrada:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Las constantes dependen de la discretizaci\u00f3n espacial, la dimensi\u00f3n, la geometr\u00eda de la malla y el integrador de tiempo.<\/p>\n<p>El paso utilizable puede ser:<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Un m\u00e9todo adaptativo Runge-Kutta puede informar un error muy peque\u00f1o y a\u00fan as\u00ed volverse inestable si se viola el l\u00edmite de CFL.<\/p>\n<h2>\u00bfLos m\u00e9todos impl\u00edcitos necesitan un l\u00edmite CFL?<\/h2>\n<p>Una discretizaci\u00f3n impl\u00edcita estable de un modelo lineal puede no tener el mismo l\u00edmite de estabilidad de CFL expl\u00edcito. Eso no significa que el paso de tiempo pueda ser arbitrariamente grande.<\/p>\n<p>Grandes pasos impl\u00edcitos pueden:<\/p>\n<ul>\n<li>Miss olas y transitorios r\u00e1pidos<\/li>\n<li>introducir una amortiguaci\u00f3n num\u00e9rica excesiva<\/li>\n<li>perder la monotonicidad<\/li>\n<li>dificultar las iteraciones de Newton<\/li>\n<li>cruzar un evento sin resolverlo<\/li>\n<li>Reducir la precisi\u00f3n de los procesos no lineales acoplados<\/li>\n<\/ul>\n<p>Estas restricciones deben denominarse exactitud, convergencia no lineal o l\u00edmites de resoluci\u00f3n f\u00edsica en lugar de una condici\u00f3n CFL universal.<\/p>\n<h2>Restricciones de paso de tiempo m\u00faltiples<\/h2>\n<p>Los c\u00f3digos de simulaci\u00f3n grandes a menudo calculan varios tama\u00f1os de paso candidatos. PISM, por ejemplo, considera las restricciones espec\u00edficas del modelo relacionadas con la advecci\u00f3n, la difusi\u00f3n, los intervalos de informaci\u00f3n y otros procesos f\u00edsicos.<\/p>\n<p>Es \u00fatil registrar la raz\u00f3n por la que limita cada paso aceptado. Un c\u00e1lculo dominado por un controlador de error requiere una optimizaci\u00f3n diferente de una limitada por la velocidad m\u00e1s r\u00e1pida o la celda de malla m\u00e1s fina.<\/p>\n<p>El pism <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">documento de paso de tiempo<\/a> proporciona una pr\u00e1ctica Ejemplo de control de m\u00faltiples restricciones.<\/p>\n<h2>Tiempos de salida y pasos internos<\/h2>\n<p>Los tiempos de salida solicitados no siempre necesitan convertirse en pasos de integraci\u00f3n. Muchos solucionadores utilizan una salida densa o una interpolaci\u00f3n para calcular los resultados almacenados entre los niveles de tiempo internos aceptados.<\/p>\n<p>Forzar cada tiempo de salida para que se convierta en un paso de solucionador exacto puede reducir la eficiencia cuando se solicita una salida frecuente.<\/p>\n<p>La alineaci\u00f3n de pasos exacta puede seguir siendo apropiada cuando:<\/p>\n<ul>\n<li>una carga discontinua cambia en un momento conocido.<\/li>\n<li>una condici\u00f3n de contorno cambia abruptamente.<\/li>\n<li>Un evento cambia las ecuaciones gobernantes.<\/li>\n<li>Una acci\u00f3n de control debe ocurrir en un instante preciso.<\/li>\n<li>El m\u00e9todo carece de una salida densa suficientemente precisa.<\/li>\n<\/ul>\n<p>Despu\u00e9s de una discontinuidad, es posible que el historial de varios pasos o el controlador adaptativo deban reiniciarse.<\/p>\n<h2>Paso de tiempo adaptativo en Fipy<\/h2>\n<p>Fipy resuelve ecuaciones de volumen finito espacialmente discretizadas pero no gira una llamada como:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>en un controlador de error temporal incrustado. Las tolerancias del solucionador en Fipy controlan principalmente la soluci\u00f3n lineal algebraica.<\/p>\n<p>La documentaci\u00f3n actual de Fipy recomienda el paquete externo <code>steppyngstounes<\/code> para la gesti\u00f3n de pasos adaptativa. Los ejemplos de Fipy utilizan errores de controlador derivados de residuos de ecuaci\u00f3n, controles de conservaci\u00f3n u otros criterios espec\u00edficos de la aplicaci\u00f3n.<\/p>\n<p>Consulte la <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n de pasos adaptativos de FIPY<\/a>.<\/p>\n<h2>Un ejemplo de duplicaci\u00f3n de pasos ficticios<\/h2>\n<p>El siguiente ejemplo educativo envuelve la discretizaci\u00f3n transitoria impl\u00edcita de primer orden de Fipy en un controlador de duplicaci\u00f3n de pasos.<\/p>\n<p>Realiza un paso completo de Euler hacia atr\u00e1s y dos medios pasos. El resultado de dos pasos se acepta cuando su error normalizado est\u00e1 por debajo de uno.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Esta implementaci\u00f3n es intencionalmente simple. Cada intervalo de intentos requiere tres soluciones impl\u00edcitas, por lo que puede ser costoso. Un BDF de producci\u00f3n o m\u00e9todo integrado normalmente proporciona un estimador m\u00e1s eficiente y un controlador PI o PID m\u00e1s suave.<\/p>\n<h2>Agregar una restricci\u00f3n CFL expl\u00edcita<\/h2>\n<p>Para un t\u00e9rmino de advecci\u00f3n expl\u00edcitamente integrado, el paso seleccionado por error se puede limitar por separado:<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Para mallas no uniformes, utilice la escala de celda local m\u00e1s restrictiva o una estimaci\u00f3n basada en rostros apropiada para el m\u00e9todo espacial.<\/p>\n<h2>Elegir tolerancias<\/h2>\n<p>No existe un par universal de tolerancias adecuadas para cada PDE.<\/p>\n<p>Un proceso pr\u00e1ctico es:<\/p>\n<ol>\n<li>Elija tolerancias absolutas de acuerdo con la escala f\u00edsica de cada campo.<\/li>\n<li>Seleccione una tolerancia relativa moderada.<\/li>\n<li>Repita la simulaci\u00f3n con tolerancias reducidas por un factor de diez.<\/li>\n<li>Comparar las cantidades de inter\u00e9s cient\u00edfico.<\/li>\n<li>Contin\u00fae apretando hasta que el resultado cambie menos que el error temporal aceptado.<\/li>\n<\/ol>\n<p>Reducir <code>rtol<\/code> hace que el requisito sea m\u00e1s estricto y normalmente aumenta el costo computacional. El aumento de <code>rtol<\/code> afloja el requisito y normalmente reduce la precisi\u00f3n.<\/p>\n<p>Una tolerancia absoluta que es demasiado peque\u00f1a puede forzar un trabajo excesivo cuando un componente pasa por cero. Uno que es demasiado grande puede ocultar cambios significativos en las peque\u00f1as variables.<\/p>\n<h2>Rechazo de pasos<\/h2>\n<p>Un paso expl\u00edcito rechazado desperdicia las evaluaciones de etapa. Un paso impl\u00edcito rechazado puede desperdiciar iteraciones no lineales, c\u00e1lculos jacobianos, factorizaciones y configuraci\u00f3n de preacondicionador.<\/p>\n<p>Un peque\u00f1o n\u00famero de pasos rechazados es normal. Una alta tasa de rechazo puede indicar:<\/p>\n<ul>\n<li>un paso inicial que es demasiado grande<\/li>\n<li>un controlador demasiado agresivo<\/li>\n<li>una discontinuidad o evento<\/li>\n<li>Tolerancias mal escaladas<\/li>\n<li>Un estimador de error poco confiable<\/li>\n<li>Rigidez en un m\u00e9todo expl\u00edcito<\/li>\n<li>Convergencia no lineal incompleta<\/li>\n<li>un modelo incorrecto o mal condicionado<\/li>\n<\/ul>\n<p>El ajuste del controlador no debe usarse para ocultar las fallas del modelo o del solucionador.<\/p>\n<h2>Cuando los pasos adaptativos pueden pasar por alto una din\u00e1mica importante<\/h2>\n<p>Un estimador de error mide la soluci\u00f3n num\u00e9rica generada por el m\u00e9todo elegido. No sabe autom\u00e1ticamente qu\u00e9 caracter\u00edsticas f\u00edsicas importan.<\/p>\n<p>Un solucionador puede tomar medidas que son demasiado grandes para:<\/p>\n<ul>\n<li>impulsos externos cortos<\/li>\n<li>Ondas de alta frecuencia<\/li>\n<li>Eventos de umbral<\/li>\n<li>Activaci\u00f3n de contacto<\/li>\n<li>Cambios r\u00e1pidos de fase<\/li>\n<li>T\u00e9rminos de origen discontinuos<\/li>\n<\/ul>\n<p>Utilice restricciones de paso m\u00e1ximo, manejo de eventos o niveles de tiempo forzados cuando se deban resolver dichas funciones.<\/p>\n<h2>Cuando los pasos fijos son \u00fatiles<\/h2>\n<p>El paso de tiempo fijo sigue siendo apropiado cuando:<\/p>\n<ul>\n<li>Un m\u00e9todo de conservaci\u00f3n de estructura requiere un paso constante.<\/li>\n<li>Se necesitan trayectorias discretas id\u00e9nticas para la depuraci\u00f3n.<\/li>\n<li>La soluci\u00f3n tiene una escala de tiempo casi uniforme.<\/li>\n<li>La simulaci\u00f3n se sincroniza con los datos medidos.<\/li>\n<li>Una GPU o una implementaci\u00f3n en paralelo funciona mejor con cargas de trabajo predecibles.<\/li>\n<li>El estudio de convergencia paso a tiempo requiere un refinamiento controlado.<\/li>\n<\/ul>\n<p>Los solucionadores adaptativos a\u00fan pueden devolver resultados en tiempos de salida comunes a trav\u00e9s de la interpolaci\u00f3n. Por lo tanto, no se requiere un paso fijo para comparar ejecuciones en marcas de tiempo especificadas.<\/p>\n<h2>Pasos adaptativos y reproducibilidad<\/h2>\n<p>Peque\u00f1os cambios en las tolerancias, las versiones del solucionador, la aritm\u00e9tica de hardware o la convergencia no lineal pueden alterar la secuencia de pasos aceptada.<\/p>\n<p>Un informe reproducible debe registrar:<\/p>\n<ul>\n<li>Integrador de tiempo y versi\u00f3n<\/li>\n<li>Tolerancias relativas y absolutas<\/li>\n<li>Pasos iniciales, m\u00ednimos y m\u00e1ximos<\/li>\n<li>Norma de error<\/li>\n<li>Tipo de controlador<\/li>\n<li>CFL o restricciones basadas en la f\u00edsica<\/li>\n<li>Horarios de eventos<\/li>\n<li>Recuentos de pasos aceptados y rechazados<\/li>\n<li>Tolerancias del solucionador no lineal y lineal<\/li>\n<\/ul>\n<h2>Errores comunes<\/h2>\n<ul>\n<li>Uso de tolerancia residual algebraica como tolerancia de error temporal<\/li>\n<li>Asumiendo los cambios finos <code>dt<\/code> a <code>rtol<\/code> y <code>atol<\/code> argumentos<\/li>\n<li>Aceptar el resultado de paso completo menos preciso en la duplicaci\u00f3n de pasos<\/li>\n<li>Olvidando el factor <code>2^p - 1<\/code> en la estimaci\u00f3n de Richardson<\/li>\n<li>Uso de un exponente de controlador fijo para cada estimador<\/li>\n<li>Ignorar el l\u00edmite CFL de un esquema expl\u00edcito<\/li>\n<li>Llamar a toda limitaci\u00f3n impl\u00edcita una condici\u00f3n CFL<\/li>\n<li>Uso de dormand-pr\u00edncipe para un problema de difusi\u00f3n fuertemente r\u00edgido<\/li>\n<li>Aflojamiento <code>rtol<\/code> Cuando se requiere mayor precisi\u00f3n<\/li>\n<li>Permitir que un paso cruzar una carga discontinua sin un evento<\/li>\n<li>confuso <code>Tfail<\/code> con falla del solucionador no lineal<\/li>\n<li>Comparaci\u00f3n de solucionadores adaptativos solo por conteo de pasos aceptado<\/li>\n<\/ul>\n<h2>un flujo de trabajo pr\u00e1ctico<\/h2>\n<ol>\n<li>Verifique primero la implementaci\u00f3n de paso fijo.<\/li>\n<li>Determine si el sistema semidiscreto es r\u00edgido.<\/li>\n<li>Seleccione un estimador de error adecuado al m\u00e9todo.<\/li>\n<li>Escale cada componente de la soluci\u00f3n con tolerancias justificadas.<\/li>\n<li>Agregue las restricciones de paso m\u00e1ximo basadas en CFL y f\u00edsica.<\/li>\n<li>manejar discontinuidades y eventos expl\u00edcitamente.<\/li>\n<li>Registre los pasos, rechazos y razones limitantes aceptadas.<\/li>\n<li>Repita la simulaci\u00f3n con tolerancias m\u00e1s estrictas.<\/li>\n<li>Compare las cantidades f\u00edsicas en lugar de solo los registros del solucionador.<\/li>\n<li>Benchmark Total Runtime con el mismo error medido.<\/li>\n<\/ol>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">m\u00e9todos de integraci\u00f3n de tiempo para solucionadores de PDE: esquemas expl\u00edcitos frente a impl\u00edcitos<\/a> \u2014 Compare las regiones de estabilidad, Amortiguaci\u00f3n, rigidez y costo computacional.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\">M\u00e9todos impl\u00edcitos versus expl\u00edcitos: estabilidad, precisi\u00f3n y cu\u00e1ndo usar cada<\/a> \u2014 Separa la estabilidad num\u00e9rica de la precisi\u00f3n temporal.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Elegir el solucionador de PDE de Python correcto: Fipy vs PY-PDE frente a Fenics<\/a> \u2014 Compare los marcos de Python y sus flujos de trabajo de integraci\u00f3n de tiempo.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">C\u00f3mo maneja Fipy las mallas y las estructuras de cuadr\u00edcula<\/a>: comprender c\u00f3mo el tama\u00f1o de celda y la estructura de malla afectan los l\u00edmites de estabilidad.<\/li>\n<\/ul>\n<h2>Lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL: Paso de tiempo autom\u00e1tico y selecci\u00f3n de pedidos en problemas dependientes del tiempo<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n de PISM: Pasos de tiempo<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind y Wang: pasos de tiempo adaptativos y estabilidad computacional<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n Scipy Solve_IVP<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n SCIML TSIT5<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n Fipy: pasos adaptativos<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale: comprensi\u00f3n de la condici\u00f3n CFL<\/a><\/li>\n<\/ul>\n<h2>Conclusi\u00f3n<\/h2>\n<p>El paso de tiempo adaptativo mejora la eficiencia al hacer coincidir el esfuerzo computacional con la soluci\u00f3n en evoluci\u00f3n. Reduce el paso cerca de transitorios r\u00e1pidos y lo aumenta cuando la soluci\u00f3n se vuelve suave.<\/p>\n<p>Error de estimaci\u00f3n de pares de Runge-Kutta integrados desde etapas compartidas. La duplicaci\u00f3n de pasos compara un paso completo con dos medios pasos. Los m\u00e9todos BDF de orden variable utilizan el historial de soluciones, la predicci\u00f3n y las diferencias divididas para controlar el tama\u00f1o y el orden del paso.<\/p>\n<p>El control de errores no reemplaza el an\u00e1lisis de estabilidad. Los m\u00e9todos expl\u00edcitos deben respetar las restricciones de CFL y de difusi\u00f3n. Los m\u00e9todos impl\u00edcitos a\u00fan necesitan pasos lo suficientemente peque\u00f1os como para resolver la f\u00edsica y permitir una convergencia no lineal confiable.<\/p>\n<p>Fipy no proporciona la adaptaci\u00f3n temporal autom\u00e1tica a trav\u00e9s de argumentos ordinarios <code>rtol<\/code> y <code>atol<\/code> a <code>solve()<\/code>. Los flujos de trabajo Fipy adaptativos requieren un controlador de pasos externo o una l\u00f3gica de error personalizada.<\/p>\n<p>Un c\u00e1lculo adaptativo cre\u00edble documenta sus tolerancias, norma de error, controlador, pasos rechazados, restricciones de estabilidad, manejo de eventos y convergencia en configuraciones m\u00e1s estrictas. El objetivo no es minimizar el n\u00famero de pasos. Es alcanzar la precisi\u00f3n f\u00edsica requerida con el menor costo computacional fiable.<\/p>\n<\/article>\n","protected":false,"raw":"<article>\n<p>Paso de tiempo adaptativo Cambia el tama\u00f1o del paso de tiempo durante una simulaci\u00f3n. El solucionador toma pasos m\u00e1s peque\u00f1os cuando la soluci\u00f3n cambia r\u00e1pidamente y pasos m\u00e1s grandes cuando la evoluci\u00f3n se vuelve suave.<\/p>\n<p>Un c\u00e1lculo de paso fijo debe usar un valor de <code>\u0394t<\/code> a lo largo de toda la simulaci\u00f3n. Ese valor a menudo se selecciona de acuerdo con el evento m\u00e1s exigente, transitorio o restricci\u00f3n de estabilidad. Luego se usa el mismo peque\u00f1o paso durante largos intervalos donde es innecesario.<\/p>\n<p>Un m\u00e9todo adaptativo estima el error de cada paso propuesto. Acepta el paso cuando el error normalizado est\u00e1 por debajo de la tolerancia solicitada y lo rechaza cuando el error es demasiado grande. Luego, un controlador selecciona un nuevo tama\u00f1o de paso.<\/p>\n<p>El control de errores es solo una parte del proceso. Los m\u00e9todos expl\u00edcitos a\u00fan deben respetar los l\u00edmites de CFL y de difusi\u00f3n. Los m\u00e9todos impl\u00edcitos pueden necesitar restricciones de precisi\u00f3n, convergencia no lineal, resoluci\u00f3n de onda, eventos o restricciones f\u00edsicas. Un solucionador confiable combina estos requisitos en lugar de permitir que una estimaci\u00f3n de error controle todo.<\/p>\n<h2>\u00bfQu\u00e9 es el paso de tiempo adaptativo?<\/h2>\n<p>Despu\u00e9s de la discretizaci\u00f3n espacial, una PDE dependiente del tiempo se convierte com\u00fanmente en un sistema de ecuaciones diferenciales ordinarias:<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Un m\u00e9todo num\u00e9rico avanza la soluci\u00f3n de <code>t\u207f<\/code> a:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Un solucionador adaptativo sigue un ciclo de aceptaci\u00f3n o rechazo:<\/p>\n<ol>\n<li>Proponer un paso de tiempo.<\/li>\n<li>Calcular una soluci\u00f3n de prueba.<\/li>\n<li>Estimar el error temporal local.<\/li>\n<li>Normalice el error utilizando tolerancias absolutas y relativas.<\/li>\n<li>aceptar o rechazar el paso de prueba.<\/li>\n<li>Seleccione el siguiente tama\u00f1o de paso.<\/li>\n<\/ol>\n<p>Los pasos rechazados no adelantan el tiempo de simulaci\u00f3n. El solucionador restaura el estado aceptado anterior y repite el c\u00e1lculo con un valor menor de <code>\u0394t<\/code>.<\/p>\n<h2>Error local y error global<\/h2>\n<p>El error de truncamiento local es el error introducido en un paso de tiempo cuando el paso comienza desde la soluci\u00f3n exacta.<\/p>\n<p>El error global es la diferencia acumulada entre las soluciones num\u00e9ricas y exactas despu\u00e9s de muchos pasos.<\/p>\n<p>Para un m\u00e9todo de orden <code>p<\/code>:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Los m\u00e9todos adaptativos normalmente estiman el error local. Mantener cada estimaci\u00f3n local por debajo de una tolerancia no proporciona un l\u00edmite riguroso universal sobre el error global, pero ofrece un efectivo mecanismo de control pr\u00e1ctico.<\/p>\n<h2>Tolerancias absolutas y relativas<\/h2>\n<p>Un valor de error bruto tiene poco significado sin la escala de cada componente de la soluci\u00f3n. Por lo tanto, los solucionadores adaptativos calculan un error normalizado.<\/p>\n<p>Una escala de componentes comunes es:<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>El error cuadrado medio ponderado normalizado es:<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>El paso se acepta normalmente cuando:<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>La tolerancia absoluta controla los componentes cerca de cero. La tolerancia relativa controla componentes cuyas magnitudes son grandes en comparaci\u00f3n con <code>atol<\/code>.<\/p>\n<p>Diferentes campos pueden requerir diferentes tolerancias absolutas. Una temperatura medida en cientos de Kelvin no deber\u00eda usar necesariamente la misma tolerancia absoluta que una concentraci\u00f3n cercana a <code>10\u207b\u2079<\/code>.<\/p>\n<h2>C\u00f3mo se selecciona el siguiente paso<\/h2>\n<p>Si el error local estimado se comporta como:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Un controlador b\u00e1sico puede usar:<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>El factor de seguridad es menor que uno. Reduce la posibilidad de que el siguiente paso se sit\u00fae directamente en el l\u00edmite de rechazo.<\/p>\n<p>Las implementaciones de producci\u00f3n tambi\u00e9n limitan los cambios de tama\u00f1o de paso:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>El exponente correcto depende del orden representado por el estimador de error y la convenci\u00f3n del controlador. No debe copiarse a ciegas entre m\u00e9todos no relacionados.<\/p>\n<h2>Controladores I, PI y PID<\/h2>\n<p>Un controlador integral simple utiliza solo el error normalizado actual. Esto puede hacer que el historial de pasos de tiempo alterna entre aumentos agresivos y rechazos.<\/p>\n<p>Los controladores PI y PID tambi\u00e9n usan errores de pasos anteriores aceptados. Esto produce cambios de tama\u00f1o de paso m\u00e1s suaves y puede reducir las tasas de rechazo.<\/p>\n<p>Un controlador de PI simplificado tiene el formulario:<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Los coeficientes dependen del orden del m\u00e9todo y el dise\u00f1o del controlador. El control sofisticado es \u00fatil, pero no puede reparar un estimador de error inexacto o un integrador de tiempo inadecuado.<\/p>\n<h2>Pares de Runge-Kutta integrados<\/h2>\n<p>Un par incrustado de Runge-Kutta calcula dos aproximaciones a partir del mismo conjunto de etapas intermedias.<\/p>\n<p>Las dos f\u00f3rmulas tienen diferentes \u00f3rdenes:<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>La diferencia proporciona una estimaci\u00f3n de error:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>Debido a que ambas f\u00f3rmulas comparten sus evaluaciones de etapa, el estimador es mucho m\u00e1s barato que completar dos integraciones independientes.<\/p>\n<p>Los m\u00e9todos incrustados expl\u00edcitos de Runge-Kutta son los m\u00e1s adecuados para los sistemas no r\u00edgidos. Si la rigidez controla el tama\u00f1o del paso, aumentando o disminuyendo <code>\u0394t<\/code><\/p><h2>Pr\u00edncipe 5(4)<\/h2>\n<p>Dormand-Prince 5(4) es un par incrustado de siete etapas. Produce una soluci\u00f3n de quinto orden y una estimaci\u00f3n de error de cuarto orden.<\/p>\n<p>El par utiliza extrapolaci\u00f3n local: la aproximaci\u00f3n de quinto orden se convierte en la soluci\u00f3n aceptada, mientras que la f\u00f3rmula de orden inferior controla el paso.<\/p>\n<p>Tambi\u00e9n tiene una propiedad FSAL en uso ordinario. La \u00faltima evaluaci\u00f3n derivada de un paso aceptado puede convertirse en la primera evaluaci\u00f3n del siguiente paso, reduciendo el n\u00famero de nuevas evaluaciones de funciones despu\u00e9s del inicio.<\/p>\n<p>Dormand-Pr\u00edncipe es utilizado por <code>RK45<\/code> de Scipy y <code>ode45<\/code> de Matlab. Es una fuerte elecci\u00f3n de prop\u00f3sito general para problemas de valor inicial no r\u00edgidos y suaves.<\/p>\n<h2>tsit5<\/h2>\n<p>TSIT5 es el m\u00e9todo de Runge-Kutta integrado Tsitouras 5(4). Es ampliamente utilizado en el ecosistema SCIML como m\u00e9todo predeterminado para problemas no r\u00edgidos en tolerancias ordinarias.<\/p>\n<p>El m\u00e9todo est\u00e1 dise\u00f1ado para proporcionar un equilibrio favorable entre la calidad de la estimaci\u00f3n de errores, el costo de la etapa y la eficiencia pr\u00e1ctica.<\/p>\n<p>sigue siendo un m\u00e9todo expl\u00edcito. Si una PDE semidiscreta es r\u00edgida debido a la difusi\u00f3n, las reacciones o las escalas de tiempo fuertemente separadas, un m\u00e9todo impl\u00edcito, Rosenbrock, BDF o IMEX pueden ser m\u00e1s eficientes.<\/p>\n<h2>Bogacki-Shammine 3(2)<\/h2>\n<p>Bogacki-Shampin 3(2) es un par incrustado de cuatro etapas. Proporciona una soluci\u00f3n aceptada de tercer orden con un estimador de error de segundo orden.<\/p>\n<p>Se implementa como <code>RK23<\/code> en scipy y subyace al <code>ode23<\/code> de Matlab.<\/p>\n<p>El par puede ser \u00fatil cuando la precisi\u00f3n moderada es suficiente o cuando las evaluaciones de funciones son econ\u00f3micas. Su orden inferior puede requerir pasos m\u00e1s aceptados que un m\u00e9todo de quinto orden cuando se solicitan tolerancias estrictas.<\/p>\n<h2>paso a paso<\/h2>\n<p>La duplicaci\u00f3n de pasos estima el error temporal al comparar el mismo m\u00e9todo num\u00e9rico en dos resoluciones.<\/p>\n<p>El procedimiento calcula:<\/p>\n<ol>\n<li>Un paso completo de longitud <code>\u0394t<\/code>.<\/li>\n<li>Dos semi-seguros de longitud <code>\u0394t\/2<\/code>.<\/li>\n<li>La diferencia entre los dos resultados.<\/li>\n<\/ol>\n<p>Para un m\u00e9todo de orden <code>p<\/code>, una estimaci\u00f3n del error en el resultado de dos pasos refinado es:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>La soluci\u00f3n aceptada normalmente deber\u00eda ser el resultado de los dos semi-pasos porque es m\u00e1s precisa.<\/p>\n<p>La duplicaci\u00f3n de pasos requiere tres aplicaciones del m\u00e9todo subyacente: un paso completo y dos medios pasos. Por lo tanto, una implementaci\u00f3n impl\u00edcita puede requerir tres soluciones no lineales o lineales a menos que se pueda reutilizar alg\u00fan trabajo de configuraci\u00f3n.<\/p>\n<h2>Estimaci\u00f3n de residuos y defectos<\/h2>\n<p>Los m\u00e9todos basados en residuos eval\u00faan qu\u00e9 tan de cerca una trayectoria num\u00e9rica reconstruida satisface la ecuaci\u00f3n diferencial entre puntos aceptados.<\/p>\n<p>Una reconstrucci\u00f3n continua <code>\u0169(t)<\/code> tiene un defecto:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>El defecto puede soportar una estimaci\u00f3n de error cuando se combina con informaci\u00f3n de estabilidad o una norma apropiada.<\/p>\n<p>El residuo algebraico de una soluci\u00f3n impl\u00edcita no es autom\u00e1ticamente una estimaci\u00f3n de error temporal. El m\u00e9todo de Newton puede reducir la ecuaci\u00f3n discreta residual casi a cero incluso cuando el paso de tiempo es demasiado grande para representar la soluci\u00f3n f\u00edsica con precisi\u00f3n.<\/p>\n<p>Por lo tanto, la convergencia algebraica y el error de truncamiento temporal requieren controles separados.<\/p>\n<h2>M\u00e9todos BDF adaptativos<\/h2>\n<p>Las f\u00f3rmulas de diferenciaci\u00f3n hacia atr\u00e1s son m\u00e9todos impl\u00edcitos de varios pasos que se utilizan para sistemas r\u00edgidos. Las implementaciones de orden variable com\u00fanmente cambian entre los pedidos del uno al cinco.<\/p>\n<p>Un solucionador de BDF almacena informaci\u00f3n de estados anteriores aceptados. Construye un predictor para el nuevo estado, resuelve la ecuaci\u00f3n impl\u00edcita y estima el error de truncamiento local usando diferencias divididas o una representaci\u00f3n de historia similar a Nordsieck.<\/p>\n<p>El solucionador puede cambiar:<\/p>\n<ul>\n<li>El tama\u00f1o de paso de tiempo<\/li>\n<li>El orden BDF<\/li>\n<li>La frecuencia de las actualizaciones jacobianas<\/li>\n<li>El solucionador lineal o la configuraci\u00f3n del preacondicionador<\/li>\n<\/ul>\n<p>Una soluci\u00f3n suave puede justificar el aumento del orden. Un evento, fase de inicio, discontinuidad o prueba de error fallida puede obligar al solucionador a reducir su orden y tama\u00f1o de paso.<\/p>\n<p>BDF2 es una f\u00f3rmula de diferenciaci\u00f3n hacia atr\u00e1s. No es Crank-Nicolson, aunque ambos m\u00e9todos son de segundo orden.<\/p>\n<h2>Control de errores en Comsol BDF<\/h2>\n<p>El controlador BDF de COMSOL eval\u00faa una estimaci\u00f3n de error local cuadrado medio ponderado de la ra\u00edz. Un paso pasa cuando el error normalizado est\u00e1 por debajo de uno.<\/p>\n<p>El solucionador puede usar \u00f3rdenes BDF de uno a cinco. Examina la suavidad de la soluci\u00f3n, selecciona un orden, intenta un paso y repite el paso con un tama\u00f1o m\u00e1s peque\u00f1o cuando falla la prueba de error local.<\/p>\n<p>Su registro de solucionador incluye:<\/p>\n<ul>\n<li><code>Order<\/code> para el orden BDF actual<\/li>\n<li><code>Tfail<\/code> para pruebas de error de paso de tiempo fallidas<\/li>\n<li><code>NLfail<\/code> Para fallos de solucionador no lineal<\/li>\n<\/ul>\n<p>Un recuento alto de <code>Tfail<\/code> sugiere que el controlador frecuentemente propon\u00eda pasos que eran demasiado grandes para la precisi\u00f3n solicitada. Un recuento alto de <code>NLfail<\/code> indica que la soluci\u00f3n algebraica no lineal luch\u00f3.<\/p>\n<p>Estas dos fallas no deben interpretarse como el mismo problema.<\/p>\n<p>El mecanismo detallado se describe en <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">Paso de tiempo autom\u00e1tico y selecci\u00f3n de pedidos en problemas dependientes del tiempo<\/a>.<\/p>\n<h2>Error algebraico y error temporal<\/h2>\n<p>Un m\u00e9todo impl\u00edcito resuelve un sistema no lineal en cada paso de tiempo. Si Newton o el solucionador lineal termina demasiado pronto, el error algebraico puede volverse comparable al error temporal.<\/p>\n<p>El controlador de paso de tiempo puede entonces reaccionar a un error que proviene de una convergencia algebraica incompleta en lugar de la discretizaci\u00f3n del tiempo.<\/p>\n<p>Una configuraci\u00f3n de solucionador cre\u00edble deber\u00eda hacer que la tolerancia algebraica sea lo suficientemente estrecha que el objetivo temporal. Hacer que sea innecesariamente estricto tambi\u00e9n desperdicia el trabajo.<\/p>\n<p>Algunos solucionadores coordinan la convergencia no lineal y la selecci\u00f3n de pasos de tiempo. Un controlador no lineal puede reducir el paso cuando la estabilidad de Newton requiere un valor menor que el que propone el estimador de precisi\u00f3n BDF.<\/p>\n<h2>L\u00edmites CFL y pasos adaptativos<\/h2>\n<p>El control de error expl\u00edcito no puede anular una restricci\u00f3n de estabilidad expl\u00edcita.<\/p>\n<p>Para la advecci\u00f3n, un l\u00edmite CFL t\u00edpico es:<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>Para la difusi\u00f3n expl\u00edcitamente integrada:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Las constantes dependen de la discretizaci\u00f3n espacial, la dimensi\u00f3n, la geometr\u00eda de la malla y el integrador de tiempo.<\/p>\n<p>El paso utilizable puede ser:<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Un m\u00e9todo adaptativo Runge-Kutta puede informar un error muy peque\u00f1o y a\u00fan as\u00ed volverse inestable si se viola el l\u00edmite de CFL.<\/p>\n<h2>\u00bfLos m\u00e9todos impl\u00edcitos necesitan un l\u00edmite CFL?<\/h2>\n<p>Una discretizaci\u00f3n impl\u00edcita estable de un modelo lineal puede no tener el mismo l\u00edmite de estabilidad de CFL expl\u00edcito. Eso no significa que el paso de tiempo pueda ser arbitrariamente grande.<\/p>\n<p>Grandes pasos impl\u00edcitos pueden:<\/p>\n<ul>\n<li>Miss olas y transitorios r\u00e1pidos<\/li>\n<li>introducir una amortiguaci\u00f3n num\u00e9rica excesiva<\/li>\n<li>perder la monotonicidad<\/li>\n<li>dificultar las iteraciones de Newton<\/li>\n<li>cruzar un evento sin resolverlo<\/li>\n<li>Reducir la precisi\u00f3n de los procesos no lineales acoplados<\/li>\n<\/ul>\n<p>Estas restricciones deben denominarse exactitud, convergencia no lineal o l\u00edmites de resoluci\u00f3n f\u00edsica en lugar de una condici\u00f3n CFL universal.<\/p>\n<h2>Restricciones de paso de tiempo m\u00faltiples<\/h2>\n<p>Los c\u00f3digos de simulaci\u00f3n grandes a menudo calculan varios tama\u00f1os de paso candidatos. PISM, por ejemplo, considera las restricciones espec\u00edficas del modelo relacionadas con la advecci\u00f3n, la difusi\u00f3n, los intervalos de informaci\u00f3n y otros procesos f\u00edsicos.<\/p>\n<p>Es \u00fatil registrar la raz\u00f3n por la que limita cada paso aceptado. Un c\u00e1lculo dominado por un controlador de error requiere una optimizaci\u00f3n diferente de una limitada por la velocidad m\u00e1s r\u00e1pida o la celda de malla m\u00e1s fina.<\/p>\n<p>El pism <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">documento de paso de tiempo<\/a> proporciona una pr\u00e1ctica Ejemplo de control de m\u00faltiples restricciones.<\/p>\n<h2>Tiempos de salida y pasos internos<\/h2>\n<p>Los tiempos de salida solicitados no siempre necesitan convertirse en pasos de integraci\u00f3n. Muchos solucionadores utilizan una salida densa o una interpolaci\u00f3n para calcular los resultados almacenados entre los niveles de tiempo internos aceptados.<\/p>\n<p>Forzar cada tiempo de salida para que se convierta en un paso de solucionador exacto puede reducir la eficiencia cuando se solicita una salida frecuente.<\/p>\n<p>La alineaci\u00f3n de pasos exacta puede seguir siendo apropiada cuando:<\/p>\n<ul>\n<li>una carga discontinua cambia en un momento conocido.<\/li>\n<li>una condici\u00f3n de contorno cambia abruptamente.<\/li>\n<li>Un evento cambia las ecuaciones gobernantes.<\/li>\n<li>Una acci\u00f3n de control debe ocurrir en un instante preciso.<\/li>\n<li>El m\u00e9todo carece de una salida densa suficientemente precisa.<\/li>\n<\/ul>\n<p>Despu\u00e9s de una discontinuidad, es posible que el historial de varios pasos o el controlador adaptativo deban reiniciarse.<\/p>\n<h2>Paso de tiempo adaptativo en Fipy<\/h2>\n<p>Fipy resuelve ecuaciones de volumen finito espacialmente discretizadas pero no gira una llamada como:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>en un controlador de error temporal incrustado. Las tolerancias del solucionador en Fipy controlan principalmente la soluci\u00f3n lineal algebraica.<\/p>\n<p>La documentaci\u00f3n actual de Fipy recomienda el paquete externo <code>steppyngstounes<\/code> para la gesti\u00f3n de pasos adaptativa. Los ejemplos de Fipy utilizan errores de controlador derivados de residuos de ecuaci\u00f3n, controles de conservaci\u00f3n u otros criterios espec\u00edficos de la aplicaci\u00f3n.<\/p>\n<p>Consulte la <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n de pasos adaptativos de FIPY<\/a>.<\/p>\n<h2>Un ejemplo de duplicaci\u00f3n de pasos ficticios<\/h2>\n<p>El siguiente ejemplo educativo envuelve la discretizaci\u00f3n transitoria impl\u00edcita de primer orden de Fipy en un controlador de duplicaci\u00f3n de pasos.<\/p>\n<p>Realiza un paso completo de Euler hacia atr\u00e1s y dos medios pasos. El resultado de dos pasos se acepta cuando su error normalizado est\u00e1 por debajo de uno.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Esta implementaci\u00f3n es intencionalmente simple. Cada intervalo de intentos requiere tres soluciones impl\u00edcitas, por lo que puede ser costoso. Un BDF de producci\u00f3n o m\u00e9todo integrado normalmente proporciona un estimador m\u00e1s eficiente y un controlador PI o PID m\u00e1s suave.<\/p>\n<h2>Agregar una restricci\u00f3n CFL expl\u00edcita<\/h2>\n<p>Para un t\u00e9rmino de advecci\u00f3n expl\u00edcitamente integrado, el paso seleccionado por error se puede limitar por separado:<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Para mallas no uniformes, utilice la escala de celda local m\u00e1s restrictiva o una estimaci\u00f3n basada en rostros apropiada para el m\u00e9todo espacial.<\/p>\n<h2>Elegir tolerancias<\/h2>\n<p>No existe un par universal de tolerancias adecuadas para cada PDE.<\/p>\n<p>Un proceso pr\u00e1ctico es:<\/p>\n<ol>\n<li>Elija tolerancias absolutas de acuerdo con la escala f\u00edsica de cada campo.<\/li>\n<li>Seleccione una tolerancia relativa moderada.<\/li>\n<li>Repita la simulaci\u00f3n con tolerancias reducidas por un factor de diez.<\/li>\n<li>Comparar las cantidades de inter\u00e9s cient\u00edfico.<\/li>\n<li>Contin\u00fae apretando hasta que el resultado cambie menos que el error temporal aceptado.<\/li>\n<\/ol>\n<p>Reducir <code>rtol<\/code> hace que el requisito sea m\u00e1s estricto y normalmente aumenta el costo computacional. El aumento de <code>rtol<\/code> afloja el requisito y normalmente reduce la precisi\u00f3n.<\/p>\n<p>Una tolerancia absoluta que es demasiado peque\u00f1a puede forzar un trabajo excesivo cuando un componente pasa por cero. Uno que es demasiado grande puede ocultar cambios significativos en las peque\u00f1as variables.<\/p>\n<h2>Rechazo de pasos<\/h2>\n<p>Un paso expl\u00edcito rechazado desperdicia las evaluaciones de etapa. Un paso impl\u00edcito rechazado puede desperdiciar iteraciones no lineales, c\u00e1lculos jacobianos, factorizaciones y configuraci\u00f3n de preacondicionador.<\/p>\n<p>Un peque\u00f1o n\u00famero de pasos rechazados es normal. Una alta tasa de rechazo puede indicar:<\/p>\n<ul>\n<li>un paso inicial que es demasiado grande<\/li>\n<li>un controlador demasiado agresivo<\/li>\n<li>una discontinuidad o evento<\/li>\n<li>Tolerancias mal escaladas<\/li>\n<li>Un estimador de error poco confiable<\/li>\n<li>Rigidez en un m\u00e9todo expl\u00edcito<\/li>\n<li>Convergencia no lineal incompleta<\/li>\n<li>un modelo incorrecto o mal condicionado<\/li>\n<\/ul>\n<p>El ajuste del controlador no debe usarse para ocultar las fallas del modelo o del solucionador.<\/p>\n<h2>Cuando los pasos adaptativos pueden pasar por alto una din\u00e1mica importante<\/h2>\n<p>Un estimador de error mide la soluci\u00f3n num\u00e9rica generada por el m\u00e9todo elegido. No sabe autom\u00e1ticamente qu\u00e9 caracter\u00edsticas f\u00edsicas importan.<\/p>\n<p>Un solucionador puede tomar medidas que son demasiado grandes para:<\/p>\n<ul>\n<li>impulsos externos cortos<\/li>\n<li>Ondas de alta frecuencia<\/li>\n<li>Eventos de umbral<\/li>\n<li>Activaci\u00f3n de contacto<\/li>\n<li>Cambios r\u00e1pidos de fase<\/li>\n<li>T\u00e9rminos de origen discontinuos<\/li>\n<\/ul>\n<p>Utilice restricciones de paso m\u00e1ximo, manejo de eventos o niveles de tiempo forzados cuando se deban resolver dichas funciones.<\/p>\n<h2>Cuando los pasos fijos son \u00fatiles<\/h2>\n<p>El paso de tiempo fijo sigue siendo apropiado cuando:<\/p>\n<ul>\n<li>Un m\u00e9todo de conservaci\u00f3n de estructura requiere un paso constante.<\/li>\n<li>Se necesitan trayectorias discretas id\u00e9nticas para la depuraci\u00f3n.<\/li>\n<li>La soluci\u00f3n tiene una escala de tiempo casi uniforme.<\/li>\n<li>La simulaci\u00f3n se sincroniza con los datos medidos.<\/li>\n<li>Una GPU o una implementaci\u00f3n en paralelo funciona mejor con cargas de trabajo predecibles.<\/li>\n<li>El estudio de convergencia paso a tiempo requiere un refinamiento controlado.<\/li>\n<\/ul>\n<p>Los solucionadores adaptativos a\u00fan pueden devolver resultados en tiempos de salida comunes a trav\u00e9s de la interpolaci\u00f3n. Por lo tanto, no se requiere un paso fijo para comparar ejecuciones en marcas de tiempo especificadas.<\/p>\n<h2>Pasos adaptativos y reproducibilidad<\/h2>\n<p>Peque\u00f1os cambios en las tolerancias, las versiones del solucionador, la aritm\u00e9tica de hardware o la convergencia no lineal pueden alterar la secuencia de pasos aceptada.<\/p>\n<p>Un informe reproducible debe registrar:<\/p>\n<ul>\n<li>Integrador de tiempo y versi\u00f3n<\/li>\n<li>Tolerancias relativas y absolutas<\/li>\n<li>Pasos iniciales, m\u00ednimos y m\u00e1ximos<\/li>\n<li>Norma de error<\/li>\n<li>Tipo de controlador<\/li>\n<li>CFL o restricciones basadas en la f\u00edsica<\/li>\n<li>Horarios de eventos<\/li>\n<li>Recuentos de pasos aceptados y rechazados<\/li>\n<li>Tolerancias del solucionador no lineal y lineal<\/li>\n<\/ul>\n<h2>Errores comunes<\/h2>\n<ul>\n<li>Uso de tolerancia residual algebraica como tolerancia de error temporal<\/li>\n<li>Asumiendo los cambios finos <code>dt<\/code> a <code>rtol<\/code> y <code>atol<\/code> argumentos<\/li>\n<li>Aceptar el resultado de paso completo menos preciso en la duplicaci\u00f3n de pasos<\/li>\n<li>Olvidando el factor <code>2^p - 1<\/code> en la estimaci\u00f3n de Richardson<\/li>\n<li>Uso de un exponente de controlador fijo para cada estimador<\/li>\n<li>Ignorar el l\u00edmite CFL de un esquema expl\u00edcito<\/li>\n<li>Llamar a toda limitaci\u00f3n impl\u00edcita una condici\u00f3n CFL<\/li>\n<li>Uso de dormand-pr\u00edncipe para un problema de difusi\u00f3n fuertemente r\u00edgido<\/li>\n<li>Aflojamiento <code>rtol<\/code> Cuando se requiere mayor precisi\u00f3n<\/li>\n<li>Permitir que un paso cruzar una carga discontinua sin un evento<\/li>\n<li>confuso <code>Tfail<\/code> con falla del solucionador no lineal<\/li>\n<li>Comparaci\u00f3n de solucionadores adaptativos solo por conteo de pasos aceptado<\/li>\n<\/ul>\n<h2>un flujo de trabajo pr\u00e1ctico<\/h2>\n<ol>\n<li>Verifique primero la implementaci\u00f3n de paso fijo.<\/li>\n<li>Determine si el sistema semidiscreto es r\u00edgido.<\/li>\n<li>Seleccione un estimador de error adecuado al m\u00e9todo.<\/li>\n<li>Escale cada componente de la soluci\u00f3n con tolerancias justificadas.<\/li>\n<li>Agregue las restricciones de paso m\u00e1ximo basadas en CFL y f\u00edsica.<\/li>\n<li>manejar discontinuidades y eventos expl\u00edcitamente.<\/li>\n<li>Registre los pasos, rechazos y razones limitantes aceptadas.<\/li>\n<li>Repita la simulaci\u00f3n con tolerancias m\u00e1s estrictas.<\/li>\n<li>Compare las cantidades f\u00edsicas en lugar de solo los registros del solucionador.<\/li>\n<li>Benchmark Total Runtime con el mismo error medido.<\/li>\n<\/ol>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">m\u00e9todos de integraci\u00f3n de tiempo para solucionadores de PDE: esquemas expl\u00edcitos frente a impl\u00edcitos<\/a> \u2014 Compare las regiones de estabilidad, Amortiguaci\u00f3n, rigidez y costo computacional.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\">M\u00e9todos impl\u00edcitos versus expl\u00edcitos: estabilidad, precisi\u00f3n y cu\u00e1ndo usar cada<\/a> \u2014 Separa la estabilidad num\u00e9rica de la precisi\u00f3n temporal.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Elegir el solucionador de PDE de Python correcto: Fipy vs PY-PDE frente a Fenics<\/a> \u2014 Compare los marcos de Python y sus flujos de trabajo de integraci\u00f3n de tiempo.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">C\u00f3mo maneja Fipy las mallas y las estructuras de cuadr\u00edcula<\/a>: comprender c\u00f3mo el tama\u00f1o de celda y la estructura de malla afectan los l\u00edmites de estabilidad.<\/li>\n<\/ul>\n<h2>Lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL: Paso de tiempo autom\u00e1tico y selecci\u00f3n de pedidos en problemas dependientes del tiempo<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n de PISM: Pasos de tiempo<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind y Wang: pasos de tiempo adaptativos y estabilidad computacional<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n Scipy Solve_IVP<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n SCIML TSIT5<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Documentaci\u00f3n Fipy: pasos adaptativos<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale: comprensi\u00f3n de la condici\u00f3n CFL<\/a><\/li>\n<\/ul>\n<h2>Conclusi\u00f3n<\/h2>\n<p>El paso de tiempo adaptativo mejora la eficiencia al hacer coincidir el esfuerzo computacional con la soluci\u00f3n en evoluci\u00f3n. Reduce el paso cerca de transitorios r\u00e1pidos y lo aumenta cuando la soluci\u00f3n se vuelve suave.<\/p>\n<p>Error de estimaci\u00f3n de pares de Runge-Kutta integrados desde etapas compartidas. La duplicaci\u00f3n de pasos compara un paso completo con dos medios pasos. Los m\u00e9todos BDF de orden variable utilizan el historial de soluciones, la predicci\u00f3n y las diferencias divididas para controlar el tama\u00f1o y el orden del paso.<\/p>\n<p>El control de errores no reemplaza el an\u00e1lisis de estabilidad. Los m\u00e9todos expl\u00edcitos deben respetar las restricciones de CFL y de difusi\u00f3n. Los m\u00e9todos impl\u00edcitos a\u00fan necesitan pasos lo suficientemente peque\u00f1os como para resolver la f\u00edsica y permitir una convergencia no lineal confiable.<\/p>\n<p>Fipy no proporciona la adaptaci\u00f3n temporal autom\u00e1tica a trav\u00e9s de argumentos ordinarios <code>rtol<\/code> y <code>atol<\/code> a <code>solve()<\/code>. Los flujos de trabajo Fipy adaptativos requieren un controlador de pasos externo o una l\u00f3gica de error personalizada.<\/p>\n<p>Un c\u00e1lculo adaptativo cre\u00edble documenta sus tolerancias, norma de error, controlador, pasos rechazados, restricciones de estabilidad, manejo de eventos y convergencia en configuraciones m\u00e1s estrictas. El objetivo no es minimizar el n\u00famero de pasos. Es alcanzar la precisi\u00f3n f\u00edsica requerida con el menor costo computacional fiable.<\/p>\n<\/article>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>El paso de tiempo adaptativo ajusta din\u00e1micamente \u0394T en funci\u00f3n del error estimado. Aprenda pares de RK incrustados, estimaci\u00f3n de errores de BDF, restricciones de CFL e implementaci\u00f3n de FIPY.<\/p>\n","protected":false,"raw":"El paso de tiempo adaptativo ajusta din\u00e1micamente \u0394T en funci\u00f3n del error estimado. Aprenda pares de RK incrustados, estimaci\u00f3n de errores de BDF, restricciones de CFL e implementaci\u00f3n de FIPY."},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=501","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-525","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Paso de tiempo adaptativo para solucionadores de PDE<\/title>\n<meta name=\"description\" content=\"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Paso de tiempo adaptativo para solucionadores de PDE\" \/>\n<meta property=\"og:description\" content=\"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-21T14:54:13+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL\",\"datePublished\":\"2026-07-21T14:54:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"wordCount\":3722,\"commentCount\":0,\"articleSection\":[\"Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/\",\"name\":\"Paso de tiempo adaptativo para solucionadores de PDE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-21T14:54:13+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Paso de tiempo adaptativo para solucionadores de PDE","description":"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/","og_locale":"es_ES","og_type":"article","og_title":"Paso de tiempo adaptativo para solucionadores de PDE","og_description":"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.","og_url":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/","og_site_name":"matforge.org","article_published_time":"2026-07-21T14:54:13+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Tomas Delgado","Tiempo de lectura":"21 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL","datePublished":"2026-07-21T14:54:13+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/"},"wordCount":3722,"commentCount":0,"articleSection":["Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/","url":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/","name":"Paso de tiempo adaptativo para solucionadores de PDE","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-21T14:54:13+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"Aprenda c\u00f3mo los pares de Runge-Kutta, la duplicaci\u00f3n de pasos, los controladores BDF, los l\u00edmites de CFL, las tolerancias y los flujos de trabajo de Fipy adaptan los pasos de tiempo de PDE.","breadcrumb":{"@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/adaptive-time-stepping-pde-solvers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Paso de tiempo adaptativo para solucionadores PDE: estimaci\u00f3n de errores y CFL"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=525"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/525\/revisions"}],"predecessor-version":[{"id":532,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/525\/revisions\/532"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}