{"id":543,"date":"2026-07-22T08:18:02","date_gmt":"2026-07-22T08:18:02","guid":{"rendered":"https:\/\/matforge.org\/?p=543","raw":"https:\/\/matforge.org\/?p=543"},"modified":"2026-07-22T08:18:02","modified_gmt":"2026-07-22T08:18:02","slug":"discontinuous-galerkin-method-tutorial","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/","title":{"rendered":"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python","raw":"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python"},"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\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><article>\n<p>El m\u00e9todo de Galerkin discontinuo, generalmente acortado a DG, es una t\u00e9cnica num\u00e9rica para resolver ecuaciones diferenciales parciales. Combina varias propiedades \u00fatiles de los m\u00e9todos de volumen finito y de elementos finitos. Al igual que el m\u00e9todo de volumen finito, DG puede conservar las cantidades localmente a trav\u00e9s de flujos cuidadosamente definidos. Al igual que el m\u00e9todo de elementos finitos, admite mallas flexibles y aproximaciones polin\u00f3micas dentro de cada elemento.<\/p>\n<p>La caracter\u00edstica definitoria de DG es que la soluci\u00f3n num\u00e9rica no necesita permanecer continua a trav\u00e9s de los l\u00edmites de los elementos. Cada elemento tiene su propia representaci\u00f3n polin\u00f3mica. Los elementos vecinos se comunican a trav\u00e9s de flujos num\u00e9ricos evaluados en sus interfaces compartidas.<\/p>\n<p>Esta estructura hace que DG sea \u00fatil para la propagaci\u00f3n de ondas, ecuaciones de transporte, flujo compresible, sistemas de aguas poco profundas, electromagn\u00e9ticos y problemas que contienen choques o interfaces de materiales. Tambi\u00e9n es atractivo para la computaci\u00f3n en paralelo porque muchos c\u00e1lculos se pueden realizar de forma independiente dentro de cada elemento.<\/p>\n<h2>\u00bfEn qu\u00e9 se diferencia DG de otros m\u00e9todos?<\/h2>\n<p>Un m\u00e9todo de volumen finito generalmente almacena un valor promedio en cada celda y calcula el flujo de una cantidad conservada a trav\u00e9s de las caras de las celdas. Proporciona una fuerte conservaci\u00f3n local, pero muchos esquemas b\u00e1sicos de volumen finito utilizan aproximaciones espaciales de orden relativamente bajo.<\/p>\n<p>Un m\u00e9todo de elementos finitos continuos representa la soluci\u00f3n con funciones de base polin\u00f3mica que se conectan continuamente a trav\u00e9s de los l\u00edmites de los elementos. Esto ofrece flexibilidad geom\u00e9trica y aproximaci\u00f3n de alto orden, pero las discontinuidades no se pueden representar directamente sin tratamiento adicional.<\/p>\n<p>DG utiliza funciones de base polinomial dentro de cada elemento mientras permite valores separados en ambos lados de una interfaz. Los flujos num\u00e9ricos determinan c\u00f3mo interact\u00faan esos valores. Por lo tanto, el m\u00e9todo proporciona conservaci\u00f3n local, aproximaci\u00f3n de alto orden y soporte directo para soluciones discontinuas.<\/p>\n<h2>La ecuaci\u00f3n de advecci\u00f3n continua<\/h2>\n<p>La ecuaci\u00f3n de advecci\u00f3n lineal unidimensional proporciona una clara introducci\u00f3n al DG:<\/p>\n<pre><code>\u2202u\/\u2202t + \u2202f(u)\/\u2202x = 0<\/code><\/pre>\n<p>Para la velocidad de transporte constante <code>a<\/code>, el flujo f\u00edsico es:<\/p>\n<pre><code>f(u) = a u<\/code><\/pre>\n<p>La ecuaci\u00f3n entonces se convierte en:<\/p>\n<pre><code>\u2202u\/\u2202t + a \u2202u\/\u2202x = 0<\/code><\/pre>\n<p>Este modelo describe un perfil que se mueve a trav\u00e9s del dominio sin cambiar de forma. Cuando <code>a<\/code> es positivo, la informaci\u00f3n viaja de izquierda a derecha. Cuando es negativo, la informaci\u00f3n viaja de derecha a izquierda.<\/p>\n<h2>Dividir el dominio en elementos<\/h2>\n<p>Suponga que el dominio se extiende de cero a <code>L<\/code>. DG lo divide en elementos no superpuestos:<\/p>\n<pre><code>\u03a9 = K\u2081 \u222a K\u2082 \u222a ... \u222a K\u2099<\/code><\/pre>\n<p>Dentro de cada elemento, la soluci\u00f3n num\u00e9rica est\u00e1 representada por un polinomio:<\/p>\n<pre><code>u\u2095(x, t) = \u03a3 U\u1d62(t) \u03c6\u1d62(x)<\/code><\/pre>\n<p>Las funciones <code>\u03c6\u1d62<\/code> son funciones de base local, y los coeficientes <code>U\u1d62<\/code> son los grados de libertad que cambian con el tiempo.<\/p>\n<p>Un polinomio de grado cero almacena un valor constante en cada elemento. Una aproximaci\u00f3n lineal utiliza dos grados de libertad locales en una dimensi\u00f3n. Una aproximaci\u00f3n cuadr\u00e1tica utiliza tres.<\/p>\n<p>A diferencia de los elementos finitos continuos, DG no fuerza al polinomio de un elemento para que coincida con el polinomio en el siguiente. En una interfaz compartida, la soluci\u00f3n puede tener, por lo tanto, un valor izquierdo y un valor derecho.<\/p>\n<h2>Derivando la forma d\u00e9bil en cuanto a elementos<\/h2>\n<p>La formulaci\u00f3n de DG comienza multiplicando la ecuaci\u00f3n de gobierno por una funci\u00f3n de prueba <code>v<\/code> e integrando sobre un elemento:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx + \u222bK (\u2202f(u\u2095)\/\u2202x) v dx = 0<\/code><\/pre>\n<p>La integraci\u00f3n por partes mueve la derivada espacial del flujo f\u00edsico a la funci\u00f3n de prueba:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx\n- \u222bK f(u\u2095) \u2202v\/\u2202x dx\n+ f(u\u2095) v |\u2202K = 0<\/code><\/pre>\n<p>El t\u00e9rmino l\u00edmite es esencial. Describe el flujo a trav\u00e9s de los lados izquierdo y derecho del elemento.<\/p>\n<p>Debido a que la soluci\u00f3n DG puede ser discontinua en una interfaz, el flujo f\u00edsico no est\u00e1 definido de manera \u00fanica all\u00ed. Un elemento proporciona un valor desde la izquierda, mientras que su vecino proporciona otro valor desde la derecha. DG reemplaza el flujo f\u00edsico ambiguo con un flujo num\u00e9rico:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a)<\/code><\/pre>\n<p>La forma d\u00e9bil final para un elemento es:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx\n- \u222bK f(u\u2095) \u2202v\/\u2202x dx\n+ f\u0302R vR\n- f\u0302L vL = 0<\/code><\/pre>\n<p>Esta ecuaci\u00f3n contiene una contribuci\u00f3n de volumen local y dos contribuciones de interfaz. Los flujos num\u00e9ricos son los \u00fanicos t\u00e9rminos que conectan directamente los elementos vecinos.<\/p>\n<h2>Por qu\u00e9 importan los flujos num\u00e9ricos<\/h2>\n<p>Un flujo num\u00e9rico debe ser consistente. Cuando los dos valores de la interfaz son iguales, deber\u00eda reproducir el flujo f\u00edsico:<\/p>\n<pre><code>f\u0302(u, u) = f(u)<\/code><\/pre>\n<p>Tambi\u00e9n debe proporcionar una estabilidad adecuada. Para los problemas de transporte, el flujo debe respetar la direcci\u00f3n en la que se mueve la informaci\u00f3n.<\/p>\n<p>La elecci\u00f3n de flujo controla la fuerza con que interact\u00faan los elementos vecinos y cu\u00e1nta disipaci\u00f3n num\u00e9rica se introduce. Un flujo inadecuado puede crear oscilaciones, suavizado excesivo o velocidades de onda incorrectas.<\/p>\n<h2>Flujo contra el viento<\/h2>\n<p>Para la advecci\u00f3n lineal con velocidad positiva, la informaci\u00f3n proviene del lado izquierdo de una interfaz. Por lo tanto, el flujo contra el viento es:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a) = a u\u207b    when a &gt; 0<\/code><\/pre>\n<p>Para la velocidad negativa, la informaci\u00f3n proviene de la derecha:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a) = a u\u207a    when a &lt; 0<\/code><\/pre>\n<p>Una expresi\u00f3n compacta es:<\/p>\n<pre><code>f\u0302 = a\u207au\u207b + a\u207bu\u207a\n\na\u207a = max(a, 0)\na\u207b = min(a, 0)<\/code><\/pre>\n<p>El flujo contra el viento es simple, estable y ampliamente utilizado. Introduce cierta disipaci\u00f3n num\u00e9rica, pero la cantidad generalmente disminuye a medida que se refina la malla o aumenta el orden polinomial.<\/p>\n<h2>Flujo local de Lax-Friedrichs<\/h2>\n<p>El flujo local de Lax-Friedrichs, tambi\u00e9n llamado Flux Rusanov, se usa con frecuencia para las leyes de conservaci\u00f3n no lineales:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a)\n= 0.5[f(u\u207b) + f(u\u207a)]\n- 0.5 \u03b1(u\u207a - u\u207b)<\/code><\/pre>\n<p>El par\u00e1metro <code>\u03b1<\/code> es una estimaci\u00f3n de la mayor velocidad caracter\u00edstica en la interfaz. Para la advecci\u00f3n lineal constante, suele ser <code>|a|<\/code>.<\/p>\n<p>La primera parte promedia los flujos f\u00edsicos. La segunda parte agrega disipaci\u00f3n que ayuda a controlar los modos de interfaz inestables. Este flujo es robusto y f\u00e1cil de implementar, aunque puede ser m\u00e1s difusivo que un solucionador de Riemann aproximado especializado.<\/p>\n<h2>Solucionadores de Riemann<\/h2>\n<p>Los sistemas hiperb\u00f3licos no lineales pueden contener varias ondas que viajan a diferentes velocidades. Los ejemplos incluyen las ecuaciones de Euler para el flujo compresible y las ecuaciones de aguas poco profundas.<\/p>\n<p>Un solucionador de Riemann examina los estados izquierdo y derecho en una interfaz y estima las ondas producidas por su interacci\u00f3n. Los solucionadores exactos de Riemann pueden ser costosos, por lo que los c\u00f3digos DG pr\u00e1cticos com\u00fanmente utilizan m\u00e9todos aproximados como ROE, HLL, HLLC o flujos de Rusanov.<\/p>\n<p>La elecci\u00f3n correcta depende de la ecuaci\u00f3n, la precisi\u00f3n deseada, los requisitos de robustez y la capacidad de preservar importantes propiedades f\u00edsicas.<\/p>\n<h2>El sistema de matriz semidiscreto<\/h2>\n<p>Despu\u00e9s de seleccionar las funciones de base y prueba, la forma d\u00e9bil se puede expresar como un sistema de ecuaciones diferenciales ordinarias:<\/p>\n<pre><code>M dU\/dt = R(U)<\/code><\/pre>\n<p>La matriz de masa contiene integrales de productos de funci\u00f3n base:<\/p>\n<pre><code>M\u1d62\u2c7c = \u222bK \u03c6\u1d62 \u03c6\u2c7c dx<\/code><\/pre>\n<p>El residuo <code>R(U)<\/code> incluye las contribuciones de flujo derivado y num\u00e9rico.<\/p>\n<p>Debido a que las funciones de base de DG pertenecen a elementos individuales, la matriz de masa global tiene una estructura de bloque-diagonal. Cada elemento aporta un peque\u00f1o bloque independiente. Estos bloques se pueden invertir por separado.<\/p>\n<p>La matriz de masas no es autom\u00e1ticamente diagonal para cada base y regla de integraci\u00f3n. Se vuelve diagonal o aproximadamente diagonal en formulaciones DG nodales comunes que utilizan puntos de interpolaci\u00f3n y cuadratura coincidentes, como la colocaci\u00f3n de Gauss-Lobatto. Otras formulaciones utilizan matrices de elementos densos peque\u00f1os.<\/p>\n<h2>Elegir funciones b\u00e1sicas y cuadratura<\/h2>\n<p>Los m\u00e9todos DG com\u00fanmente usan bases polin\u00f3micas nodales o nodales. Una base modal representa la soluci\u00f3n a trav\u00e9s de modos polin\u00f3micos, a menudo basado en polinomios de Legendre. Una base nodal almacena valores de soluci\u00f3n en los nodos de interpolaci\u00f3n dentro del elemento.<\/p>\n<p>Las formulaciones nodales son convenientes porque los valores de la interfaz se pueden obtener directamente cuando los nodos se colocan en los l\u00edmites de los elementos. Los puntos Gauss-Lobatto incluyen ambos puntos finales del elemento de referencia, mientras que los puntos gauss permanecen dentro de \u00e9l.<\/p>\n<p>La cuadratura num\u00e9rica eval\u00faa las integrales en la forma d\u00e9bil. La regla de cuadratura debe ser lo suficientemente precisa para el grado polin\u00f3mico y cualquier t\u00e9rmino no lineal. La cuadratura insuficiente puede introducir errores de alias e inestabilidad.<\/p>\n<h2>Orden y precisi\u00f3n polin\u00f3micas<\/h2>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>grado polin\u00f3mico<\/th>\n<th>Grados de libertad locales en 1D<\/th>\n<th>Papel t\u00edpico<\/th>\n<\/tr>\n<tr>\n<td><code>p = 0<\/code><\/td>\n<td>1<\/td>\n<td>Aproximaci\u00f3n constante por partes similares a un m\u00e9todo de volumen finito de primer orden<\/td>\n<\/tr>\n<tr>\n<td><code>p = 1<\/code><\/td>\n<td>2<\/td>\n<td>Punto de partida pr\u00e1ctico con variaci\u00f3n lineal dentro de cada elemento<\/td>\n<\/tr>\n<tr>\n<td><code>p = 2<\/code><\/td>\n<td>3<\/td>\n<td>Mayor precisi\u00f3n para soluciones suaves a un costo adicional moderado<\/td>\n<\/tr>\n<tr>\n<td><code>p = 3<\/code><\/td>\n<td>4<\/td>\n<td>Aproximaci\u00f3n de alto orden que requiere una estabilidad m\u00e1s estricta y un control en cuadratura<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para soluciones suficientemente suaves, un m\u00e9todo DG bien dise\u00f1ado puede lograr un error proporcional a aproximadamente <code>h^(p+1)<\/code>. Por lo tanto, aumentar el grado polinomial puede mejorar la precisi\u00f3n sin agregar m\u00e1s elementos.<\/p>\n<p>El orden superior no siempre es mejor. Los choques y las discontinuidades agudas pueden crear oscilaciones cerca del salto. Es posible que se necesiten limitadores, viscosidad artificial, filtrado o t\u00e9cnicas de captura de golpes.<\/p>\n<h2>Un solucionador de DG lineal en numpy<\/h2>\n<p>El siguiente ejemplo educativo implementa un m\u00e9todo DG lineal <code>p = 1<\/code> para la advecci\u00f3n unidimensional peri\u00f3dica. Cada elemento contiene dos grados de libertad ubicados en sus puntos finales.<\/p>\n<p>La implementaci\u00f3n utiliza el elemento forma d\u00e9bil, un flujo contra el viento y un m\u00e9todo Runge-Kutta que preserva la estabilidad fuerte de tercer orden.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\n# Domain and model parameters\nlength = 1.0\nnumber_of_elements = 80\nvelocity = 1.0\nfinal_time = 0.5\n\nelement_width = length \/ number_of_elements\njacobian = element_width \/ 2.0\n\n# Reference-element mass matrix for linear basis functions\nmass_reference = np.array([\n    [2.0 \/ 3.0, 1.0 \/ 3.0],\n    [1.0 \/ 3.0, 2.0 \/ 3.0]\n])\n\nmass_matrix = jacobian * mass_reference\ninverse_mass = np.linalg.inv(mass_matrix)\n\n# S[i, j] = integral(phi_j * derivative(phi_i)) on [-1, 1]\nvolume_matrix = np.array([\n    [-0.5, -0.5],\n    [ 0.5,  0.5]\n])\n\nleft_vector = np.array([1.0, 0.0])\nright_vector = np.array([0.0, 1.0])\n\n# Physical coordinates of local DG nodes\nleft_edges = np.arange(number_of_elements) * element_width\nright_edges = left_edges + element_width\ncoordinates = np.column_stack((left_edges, right_edges))\n\n# Smooth periodic initial condition\nsolution = (\n    0.5\n    + 0.5 * np.sin(2.0 * np.pi * coordinates \/ length)\n)\n\ndef upwind_flux(left_state, right_state, speed):\n    positive_speed = max(speed, 0.0)\n    negative_speed = min(speed, 0.0)\n\n    return (\n        positive_speed * left_state\n        + negative_speed * right_state\n    )\n\ndef spatial_residual(values):\n    residual = np.zeros_like(values)\n\n    for element in range(number_of_elements):\n        left_neighbor = (element - 1) % number_of_elements\n        right_neighbor = (element + 1) % number_of_elements\n\n        # States on the left interface\n        left_inside = values[element, 0]\n        left_outside = values[left_neighbor, 1]\n\n        # States on the right interface\n        right_inside = values[element, 1]\n        right_outside = values[right_neighbor, 0]\n\n        flux_left = upwind_flux(\n            left_outside,\n            left_inside,\n            velocity\n        )\n\n        flux_right = upwind_flux(\n            right_inside,\n            right_outside,\n            velocity\n        )\n\n        local_rhs = (\n            velocity * volume_matrix @ values[element]\n            + flux_left * left_vector\n            - flux_right * right_vector\n        )\n\n        residual[element] = inverse_mass @ local_rhs\n\n    return residual\n\n# Conservative time-step estimate\ntime_step = 0.1 * element_width \/ abs(velocity)\ncurrent_time = 0.0\n\nwhile current_time &lt; final_time:\n    dt = min(time_step, final_time - current_time)\n\n    # SSP-RK3 stage 1\n    stage_one = solution + dt * spatial_residual(solution)\n\n    # SSP-RK3 stage 2\n    stage_two = (\n        0.75 * solution\n        + 0.25 * (\n            stage_one\n            + dt * spatial_residual(stage_one)\n        )\n    )\n\n    # SSP-RK3 stage 3\n    solution = (\n        (1.0 \/ 3.0) * solution\n        + (2.0 \/ 3.0) * (\n            stage_two\n            + dt * spatial_residual(stage_two)\n        )\n    )\n\n    current_time += dt\n\nprint(\"Simulation completed\")\nprint(\"Final time:\", current_time)\nprint(\"Minimum value:\", solution.min())\nprint(\"Maximum value:\", solution.max())<\/code><\/pre>\n<p>Este ejemplo se limita intencionalmente a un problema lineal suave. Los solucionadores de DG de producci\u00f3n tambi\u00e9n necesitan tratamientos de contorno robustos, mapeos multidimensionales, cuadratura precisa, evaluaci\u00f3n de flujo no lineal, limitadores e integraci\u00f3n de tiempo m\u00e1s avanzada.<\/p>\n<h2>Integraci\u00f3n del tiempo y la condici\u00f3n CFL<\/h2>\n<p>La discretizaci\u00f3n espacial DG crea un sistema de ecuaciones diferenciales ordinarias. Un m\u00e9todo expl\u00edcito como Runge-Kutta puede entonces avanzar en ese sistema a tiempo.<\/p>\n<p>El paso de tiempo m\u00e1ximo estable depende de la velocidad de la onda, el tama\u00f1o del elemento, el grado polinomial, el flujo y el integrador de tiempo. Un escalado com\u00fan es:<\/p>\n<pre><code>\u0394t \u221d h \/ [(2p + 1)|a|]<\/code><\/pre>\n<p>La constante de estabilidad exacta depende del m\u00e9todo. Debe establecerse a trav\u00e9s del an\u00e1lisis, la documentaci\u00f3n o las pruebas num\u00e9ricas en lugar de tratarse como universales.<\/p>\n<p>El aumento del orden polinomial normalmente reduce el paso de tiempo expl\u00edcito estable m\u00e1s grande. Por lo tanto, la DG de alto orden puede requerir m\u00e1s pasos incluso cuando necesita menos elementos.<\/p>\n<h2>DG para problemas dominados por la advecci\u00f3n<\/h2>\n<p>Los m\u00e9todos est\u00e1ndar continuos de Galerkin pueden desarrollar oscilaciones cuando la advecci\u00f3n domina la difusi\u00f3n. Los m\u00e9todos continuos estabilizados como SUPG modifican las funciones de prueba para agregar control a lo largo de las l\u00edneas de corriente.<\/p>\n<p>DG maneja el transporte a trav\u00e9s de flujos de interfaz. Los flujos de Riemann o aproximados de Riemann introducen la estabilizaci\u00f3n consciente de la direcci\u00f3n y preservan la conservaci\u00f3n local.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Aspecto<\/th>\n<th>DG con flujo contra el viento<\/th>\n<th>sorbo<\/th>\n<\/tr>\n<tr>\n<td>Espacio de soluci\u00f3n<\/td>\n<td>discontinuo entre elementos<\/td>\n<td>generalmente continuo<\/td>\n<\/tr>\n<tr>\n<td>Conservaci\u00f3n<\/td>\n<td>Conservaci\u00f3n de elementos locales<\/td>\n<td>Depende de la formulaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>Estabilizaci\u00f3n<\/td>\n<td>introducido a trav\u00e9s de flujos de interfaz<\/td>\n<td>introducido a trav\u00e9s de funciones de prueba modificadas<\/td>\n<\/tr>\n<tr>\n<td>discontinuidades<\/td>\n<td>representado directamente<\/td>\n<td>Por lo general, untado a trav\u00e9s de elementos continuos<\/td>\n<\/tr>\n<tr>\n<td>N\u00famero de inc\u00f3gnitas<\/td>\n<td>m\u00e1s alto porque las interfaces no comparten grados de libertad<\/td>\n<td>m\u00e1s bajo porque los elementos vecinos comparten nodos<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>SUPG sigue siendo efectivo para muchos problemas suaves dominados por convecci\u00f3n. La DG es atractiva cuando la conservaci\u00f3n local, las soluciones discontinuas, las mallas complejas o la adaptabilidad en cuanto a elementos son requisitos centrales.<\/p>\n<h2>DG frente a FVM y FEM continua<\/h2>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>M\u00e9todo de volumen finito<\/th>\n<th>FEM continua<\/th>\n<th>Galerkin discontinuo<\/th>\n<\/tr>\n<tr>\n<td>Conservaci\u00f3n local<\/td>\n<td>Fuerte<\/td>\n<td>No autom\u00e1tico en formulaciones est\u00e1ndar<\/td>\n<td>Fuerte a trav\u00e9s de flujos num\u00e9ricos<\/td>\n<\/tr>\n<tr>\n<td>Flexibilidad polin\u00f3mica<\/td>\n<td>Por lo general, limitado en esquemas b\u00e1sicos<\/td>\n<td>Elevado<\/td>\n<td>Elevado<\/td>\n<\/tr>\n<tr>\n<td>Discontinuidades de la interfaz<\/td>\n<td>Almacenamiento a trav\u00e9s de medias celulares y reconstrucci\u00f3n<\/td>\n<td>no representado directamente<\/td>\n<td>representado naturalmente<\/td>\n<\/tr>\n<tr>\n<td>Recuento desconocido<\/td>\n<td>relativamente bajo<\/td>\n<td>Reducido a trav\u00e9s de nodos compartidos<\/td>\n<td>m\u00e1s altos porque los grados de libertad son elementos-locales<\/td>\n<\/tr>\n<tr>\n<td>estructura paralela<\/td>\n<td>Bueno<\/td>\n<td>Requiere acoplamiento global<\/td>\n<td>Localidad de elementos fuertes con comunicaci\u00f3n facial<\/td>\n<\/tr>\n<tr>\n<td>dificultad de implementaci\u00f3n<\/td>\n<td>De bajo a moderado<\/td>\n<td>Moderar<\/td>\n<td>Moderado a alto<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Ventajas del m\u00e9todo DG<\/h2>\n<ul>\n<li>La conservaci\u00f3n local est\u00e1 integrada en el equilibrio del flujo de la interfaz.<\/li>\n<li>El grado polinomial puede variar entre elementos.<\/li>\n<li>Las discontinuidades no violan el espacio de aproximaci\u00f3n.<\/li>\n<li>Los c\u00e1lculos de elementos se adaptan bien al hardware paralelo.<\/li>\n<li>Se pueden soportar mallas complejas y no estructuradas.<\/li>\n<li>Se puede combinar el refinamiento de malla y el enriquecimiento polin\u00f3mico.<\/li>\n<li>Se pueden seleccionar diferentes flujos num\u00e9ricos para diferentes ecuaciones.<\/li>\n<\/ul>\n<h2>Limitaciones de DG<\/h2>\n<p>DG normalmente utiliza m\u00e1s grados de libertad que un m\u00e9todo de elementos finitos continuos del mismo grado polinomial porque los elementos vecinos no comparten valores de interfaz.<\/p>\n<p>El m\u00e9todo tambi\u00e9n requiere un cuidadoso dise\u00f1o de flujo. Las ecuaciones hiperb\u00f3licas, el\u00edpticas y mixtas necesitan diferentes tratamientos de interfaz. Los operadores de difusi\u00f3n requieren formulaciones como penalizaci\u00f3n interior, DG local o t\u00e9cnicas relacionadas.<\/p>\n<p>Los m\u00e9todos DG expl\u00edcitos de orden superior pueden tener l\u00edmites de paso de tiempo restrictivos. Los problemas no lineales pueden requerir limitadores, flujos estables de entrop\u00eda, preservaci\u00f3n de la positividad o viscosidad artificial.<\/p>\n<p>Estas caracter\u00edsticas hacen que DG sea potente pero m\u00e1s dif\u00edcil de implementar correctamente que la diferencia finita b\u00e1sica o los esquemas de volumen finito.<\/p>\n<h2>Errores de implementaci\u00f3n comunes<\/h2>\n<p>Un error com\u00fan es usar el flujo f\u00edsico directamente en una interfaz discontinua sin definir c\u00f3mo se deben combinar los dos valores vecinos.<\/p>\n<p>Otros errores frecuentes incluyen:<\/p>\n<ul>\n<li>Usar el signo err\u00f3neo para la contribuci\u00f3n del l\u00edmite izquierdo o derecho<\/li>\n<li>Aplicaci\u00f3n de orientaciones vectoriales normales inconsistentes<\/li>\n<li>Asumiendo que la matriz de masa es siempre diagonal<\/li>\n<li>Usando una cuadratura que es demasiado d\u00e9bil para t\u00e9rminos no lineales<\/li>\n<li>Ignorar la dependencia polinomial-grado del l\u00edmite CFL<\/li>\n<li>Aplicar incorrectamente las condiciones de contorno peri\u00f3dicas o f\u00edsicas<\/li>\n<li>Uso de polinomios de alto orden cerca de amortiguadores sin limitador<\/li>\n<li>Probando solo la salida visual en lugar de la convergencia y la conservaci\u00f3n<\/li>\n<\/ul>\n<h2>C\u00f3mo validar un solucionador de DG<\/h2>\n<p>Comience con un problema que tiene una soluci\u00f3n anal\u00edtica conocida. La advecci\u00f3n lineal peri\u00f3dica es \u00fatil porque el perfil exacto simplemente se desplaza <code>a t<\/code>.<\/p>\n<p>Ejecute el solucionador con varias resoluciones de malla y mida una norma de error. Para una soluci\u00f3n suave, la tasa de convergencia observada debe abordar el orden te\u00f3rico del m\u00e9todo.<\/p>\n<p>Compruebe la conservaci\u00f3n integrando la soluci\u00f3n en todo el dominio. Para la advecci\u00f3n peri\u00f3dica, la masa total debe permanecer casi constante.<\/p>\n<p>Pruebe las velocidades positivas y negativas para verificar la direcci\u00f3n contra el viento. Los datos iniciales constantes deben permanecer constantes. Los estados de contorno tambi\u00e9n deben probarse por separado antes de pasar a ecuaciones no lineales.<\/p>\n<h2>Cu\u00e1ndo elegir DG<\/h2>\n<p>DG es una fuerte opci\u00f3n cuando el problema contiene ondas, choques, interfaces de materiales o comportamiento dominado por el transporte. Tambi\u00e9n es \u00fatil cuando la conservaci\u00f3n local es esencial o cuando la simulaci\u00f3n se beneficia de la precisi\u00f3n de alto orden en una malla no estructurada.<\/p>\n<p>Un m\u00e9todo b\u00e1sico de volumen finito puede seguir siendo m\u00e1s simple para problemas de conservaci\u00f3n de bajo orden. Los elementos finitos continuos pueden ser m\u00e1s eficientes para problemas el\u00edpticos o estructurales suaves donde no se esperan discontinuidades.<\/p>\n<p>El m\u00e9todo num\u00e9rico debe seguir la estructura matem\u00e1tica de la PDE en lugar de la popularidad actual o la disponibilidad de software.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>El m\u00e9todo Galerkin discontinuo representa la soluci\u00f3n con polinomios independientes dentro de cada elemento. Su formulaci\u00f3n d\u00e9bil produce t\u00e9rminos de contorno naturales que son reemplazados por flujos num\u00e9ricos. Estos flujos controlan c\u00f3mo se mueve la informaci\u00f3n entre los elementos y permiten el m\u00e9todo completo para conservar las cantidades localmente.<\/p>\n<p>DG combina una aproximaci\u00f3n polinomial de alto orden, flexibilidad geom\u00e9trica, manejo de discontinuidad y una fuerte localidad de elementos. Estas ventajas lo hacen valioso para la propagaci\u00f3n de olas, las leyes de conservaci\u00f3n hiperb\u00f3lica, los sistemas dominados por convecci\u00f3n y las grandes simulaciones paralelas.<\/p>\n<p>El m\u00e9todo tambi\u00e9n introduce complejidad adicional. Los flujos, cuadratura, restricciones de paso de tiempo, limitadores y condiciones de contorno deben seleccionarse cuidadosamente. Se debe desarrollar gradualmente una implementaci\u00f3n confiable, comenzando con una ecuaci\u00f3n lineal simple y verificada mediante pruebas de convergencia y conservaci\u00f3n.<\/p>\n<p>Para los investigadores que ya entienden los m\u00e9todos de volumen finito o elementos finitos, DG proporciona un siguiente paso natural hacia los solucionadores de PDE de alto orden localmente conservadores en Python cient\u00edfico.<\/p>\n<\/article>\n","protected":false,"raw":"<article>\n<p>El m\u00e9todo de Galerkin discontinuo, generalmente acortado a DG, es una t\u00e9cnica num\u00e9rica para resolver ecuaciones diferenciales parciales. Combina varias propiedades \u00fatiles de los m\u00e9todos de volumen finito y de elementos finitos. Al igual que el m\u00e9todo de volumen finito, DG puede conservar las cantidades localmente a trav\u00e9s de flujos cuidadosamente definidos. Al igual que el m\u00e9todo de elementos finitos, admite mallas flexibles y aproximaciones polin\u00f3micas dentro de cada elemento.<\/p>\n<p>La caracter\u00edstica definitoria de DG es que la soluci\u00f3n num\u00e9rica no necesita permanecer continua a trav\u00e9s de los l\u00edmites de los elementos. Cada elemento tiene su propia representaci\u00f3n polin\u00f3mica. Los elementos vecinos se comunican a trav\u00e9s de flujos num\u00e9ricos evaluados en sus interfaces compartidas.<\/p>\n<p>Esta estructura hace que DG sea \u00fatil para la propagaci\u00f3n de ondas, ecuaciones de transporte, flujo compresible, sistemas de aguas poco profundas, electromagn\u00e9ticos y problemas que contienen choques o interfaces de materiales. Tambi\u00e9n es atractivo para la computaci\u00f3n en paralelo porque muchos c\u00e1lculos se pueden realizar de forma independiente dentro de cada elemento.<\/p>\n<h2>\u00bfEn qu\u00e9 se diferencia DG de otros m\u00e9todos?<\/h2>\n<p>Un m\u00e9todo de volumen finito generalmente almacena un valor promedio en cada celda y calcula el flujo de una cantidad conservada a trav\u00e9s de las caras de las celdas. Proporciona una fuerte conservaci\u00f3n local, pero muchos esquemas b\u00e1sicos de volumen finito utilizan aproximaciones espaciales de orden relativamente bajo.<\/p>\n<p>Un m\u00e9todo de elementos finitos continuos representa la soluci\u00f3n con funciones de base polin\u00f3mica que se conectan continuamente a trav\u00e9s de los l\u00edmites de los elementos. Esto ofrece flexibilidad geom\u00e9trica y aproximaci\u00f3n de alto orden, pero las discontinuidades no se pueden representar directamente sin tratamiento adicional.<\/p>\n<p>DG utiliza funciones de base polinomial dentro de cada elemento mientras permite valores separados en ambos lados de una interfaz. Los flujos num\u00e9ricos determinan c\u00f3mo interact\u00faan esos valores. Por lo tanto, el m\u00e9todo proporciona conservaci\u00f3n local, aproximaci\u00f3n de alto orden y soporte directo para soluciones discontinuas.<\/p>\n<h2>La ecuaci\u00f3n de advecci\u00f3n continua<\/h2>\n<p>La ecuaci\u00f3n de advecci\u00f3n lineal unidimensional proporciona una clara introducci\u00f3n al DG:<\/p>\n<pre><code>\u2202u\/\u2202t + \u2202f(u)\/\u2202x = 0<\/code><\/pre>\n<p>Para la velocidad de transporte constante <code>a<\/code>, el flujo f\u00edsico es:<\/p>\n<pre><code>f(u) = a u<\/code><\/pre>\n<p>La ecuaci\u00f3n entonces se convierte en:<\/p>\n<pre><code>\u2202u\/\u2202t + a \u2202u\/\u2202x = 0<\/code><\/pre>\n<p>Este modelo describe un perfil que se mueve a trav\u00e9s del dominio sin cambiar de forma. Cuando <code>a<\/code> es positivo, la informaci\u00f3n viaja de izquierda a derecha. Cuando es negativo, la informaci\u00f3n viaja de derecha a izquierda.<\/p>\n<h2>Dividir el dominio en elementos<\/h2>\n<p>Suponga que el dominio se extiende de cero a <code>L<\/code>. DG lo divide en elementos no superpuestos:<\/p>\n<pre><code>\u03a9 = K\u2081 \u222a K\u2082 \u222a ... \u222a K\u2099<\/code><\/pre>\n<p>Dentro de cada elemento, la soluci\u00f3n num\u00e9rica est\u00e1 representada por un polinomio:<\/p>\n<pre><code>u\u2095(x, t) = \u03a3 U\u1d62(t) \u03c6\u1d62(x)<\/code><\/pre>\n<p>Las funciones <code>\u03c6\u1d62<\/code> son funciones de base local, y los coeficientes <code>U\u1d62<\/code> son los grados de libertad que cambian con el tiempo.<\/p>\n<p>Un polinomio de grado cero almacena un valor constante en cada elemento. Una aproximaci\u00f3n lineal utiliza dos grados de libertad locales en una dimensi\u00f3n. Una aproximaci\u00f3n cuadr\u00e1tica utiliza tres.<\/p>\n<p>A diferencia de los elementos finitos continuos, DG no fuerza al polinomio de un elemento para que coincida con el polinomio en el siguiente. En una interfaz compartida, la soluci\u00f3n puede tener, por lo tanto, un valor izquierdo y un valor derecho.<\/p>\n<h2>Derivando la forma d\u00e9bil en cuanto a elementos<\/h2>\n<p>La formulaci\u00f3n de DG comienza multiplicando la ecuaci\u00f3n de gobierno por una funci\u00f3n de prueba <code>v<\/code> e integrando sobre un elemento:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx + \u222bK (\u2202f(u\u2095)\/\u2202x) v dx = 0<\/code><\/pre>\n<p>La integraci\u00f3n por partes mueve la derivada espacial del flujo f\u00edsico a la funci\u00f3n de prueba:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx\n- \u222bK f(u\u2095) \u2202v\/\u2202x dx\n+ f(u\u2095) v |\u2202K = 0<\/code><\/pre>\n<p>El t\u00e9rmino l\u00edmite es esencial. Describe el flujo a trav\u00e9s de los lados izquierdo y derecho del elemento.<\/p>\n<p>Debido a que la soluci\u00f3n DG puede ser discontinua en una interfaz, el flujo f\u00edsico no est\u00e1 definido de manera \u00fanica all\u00ed. Un elemento proporciona un valor desde la izquierda, mientras que su vecino proporciona otro valor desde la derecha. DG reemplaza el flujo f\u00edsico ambiguo con un flujo num\u00e9rico:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a)<\/code><\/pre>\n<p>La forma d\u00e9bil final para un elemento es:<\/p>\n<pre><code>\u222bK (\u2202u\u2095\/\u2202t) v dx\n- \u222bK f(u\u2095) \u2202v\/\u2202x dx\n+ f\u0302R vR\n- f\u0302L vL = 0<\/code><\/pre>\n<p>Esta ecuaci\u00f3n contiene una contribuci\u00f3n de volumen local y dos contribuciones de interfaz. Los flujos num\u00e9ricos son los \u00fanicos t\u00e9rminos que conectan directamente los elementos vecinos.<\/p>\n<h2>Por qu\u00e9 importan los flujos num\u00e9ricos<\/h2>\n<p>Un flujo num\u00e9rico debe ser consistente. Cuando los dos valores de la interfaz son iguales, deber\u00eda reproducir el flujo f\u00edsico:<\/p>\n<pre><code>f\u0302(u, u) = f(u)<\/code><\/pre>\n<p>Tambi\u00e9n debe proporcionar una estabilidad adecuada. Para los problemas de transporte, el flujo debe respetar la direcci\u00f3n en la que se mueve la informaci\u00f3n.<\/p>\n<p>La elecci\u00f3n de flujo controla la fuerza con que interact\u00faan los elementos vecinos y cu\u00e1nta disipaci\u00f3n num\u00e9rica se introduce. Un flujo inadecuado puede crear oscilaciones, suavizado excesivo o velocidades de onda incorrectas.<\/p>\n<h2>Flujo contra el viento<\/h2>\n<p>Para la advecci\u00f3n lineal con velocidad positiva, la informaci\u00f3n proviene del lado izquierdo de una interfaz. Por lo tanto, el flujo contra el viento es:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a) = a u\u207b    when a &gt; 0<\/code><\/pre>\n<p>Para la velocidad negativa, la informaci\u00f3n proviene de la derecha:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a) = a u\u207a    when a &lt; 0<\/code><\/pre>\n<p>Una expresi\u00f3n compacta es:<\/p>\n<pre><code>f\u0302 = a\u207au\u207b + a\u207bu\u207a\n\na\u207a = max(a, 0)\na\u207b = min(a, 0)<\/code><\/pre>\n<p>El flujo contra el viento es simple, estable y ampliamente utilizado. Introduce cierta disipaci\u00f3n num\u00e9rica, pero la cantidad generalmente disminuye a medida que se refina la malla o aumenta el orden polinomial.<\/p>\n<h2>Flujo local de Lax-Friedrichs<\/h2>\n<p>El flujo local de Lax-Friedrichs, tambi\u00e9n llamado Flux Rusanov, se usa con frecuencia para las leyes de conservaci\u00f3n no lineales:<\/p>\n<pre><code>f\u0302(u\u207b, u\u207a)\n= 0.5[f(u\u207b) + f(u\u207a)]\n- 0.5 \u03b1(u\u207a - u\u207b)<\/code><\/pre>\n<p>El par\u00e1metro <code>\u03b1<\/code> es una estimaci\u00f3n de la mayor velocidad caracter\u00edstica en la interfaz. Para la advecci\u00f3n lineal constante, suele ser <code>|a|<\/code>.<\/p>\n<p>La primera parte promedia los flujos f\u00edsicos. La segunda parte agrega disipaci\u00f3n que ayuda a controlar los modos de interfaz inestables. Este flujo es robusto y f\u00e1cil de implementar, aunque puede ser m\u00e1s difusivo que un solucionador de Riemann aproximado especializado.<\/p>\n<h2>Solucionadores de Riemann<\/h2>\n<p>Los sistemas hiperb\u00f3licos no lineales pueden contener varias ondas que viajan a diferentes velocidades. Los ejemplos incluyen las ecuaciones de Euler para el flujo compresible y las ecuaciones de aguas poco profundas.<\/p>\n<p>Un solucionador de Riemann examina los estados izquierdo y derecho en una interfaz y estima las ondas producidas por su interacci\u00f3n. Los solucionadores exactos de Riemann pueden ser costosos, por lo que los c\u00f3digos DG pr\u00e1cticos com\u00fanmente utilizan m\u00e9todos aproximados como ROE, HLL, HLLC o flujos de Rusanov.<\/p>\n<p>La elecci\u00f3n correcta depende de la ecuaci\u00f3n, la precisi\u00f3n deseada, los requisitos de robustez y la capacidad de preservar importantes propiedades f\u00edsicas.<\/p>\n<h2>El sistema de matriz semidiscreto<\/h2>\n<p>Despu\u00e9s de seleccionar las funciones de base y prueba, la forma d\u00e9bil se puede expresar como un sistema de ecuaciones diferenciales ordinarias:<\/p>\n<pre><code>M dU\/dt = R(U)<\/code><\/pre>\n<p>La matriz de masa contiene integrales de productos de funci\u00f3n base:<\/p>\n<pre><code>M\u1d62\u2c7c = \u222bK \u03c6\u1d62 \u03c6\u2c7c dx<\/code><\/pre>\n<p>El residuo <code>R(U)<\/code> incluye las contribuciones de flujo derivado y num\u00e9rico.<\/p>\n<p>Debido a que las funciones de base de DG pertenecen a elementos individuales, la matriz de masa global tiene una estructura de bloque-diagonal. Cada elemento aporta un peque\u00f1o bloque independiente. Estos bloques se pueden invertir por separado.<\/p>\n<p>La matriz de masas no es autom\u00e1ticamente diagonal para cada base y regla de integraci\u00f3n. Se vuelve diagonal o aproximadamente diagonal en formulaciones DG nodales comunes que utilizan puntos de interpolaci\u00f3n y cuadratura coincidentes, como la colocaci\u00f3n de Gauss-Lobatto. Otras formulaciones utilizan matrices de elementos densos peque\u00f1os.<\/p>\n<h2>Elegir funciones b\u00e1sicas y cuadratura<\/h2>\n<p>Los m\u00e9todos DG com\u00fanmente usan bases polin\u00f3micas nodales o nodales. Una base modal representa la soluci\u00f3n a trav\u00e9s de modos polin\u00f3micos, a menudo basado en polinomios de Legendre. Una base nodal almacena valores de soluci\u00f3n en los nodos de interpolaci\u00f3n dentro del elemento.<\/p>\n<p>Las formulaciones nodales son convenientes porque los valores de la interfaz se pueden obtener directamente cuando los nodos se colocan en los l\u00edmites de los elementos. Los puntos Gauss-Lobatto incluyen ambos puntos finales del elemento de referencia, mientras que los puntos gauss permanecen dentro de \u00e9l.<\/p>\n<p>La cuadratura num\u00e9rica eval\u00faa las integrales en la forma d\u00e9bil. La regla de cuadratura debe ser lo suficientemente precisa para el grado polin\u00f3mico y cualquier t\u00e9rmino no lineal. La cuadratura insuficiente puede introducir errores de alias e inestabilidad.<\/p>\n<h2>Orden y precisi\u00f3n polin\u00f3micas<\/h2>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>grado polin\u00f3mico<\/th>\n<th>Grados de libertad locales en 1D<\/th>\n<th>Papel t\u00edpico<\/th>\n<\/tr>\n<tr>\n<td><code>p = 0<\/code><\/td>\n<td>1<\/td>\n<td>Aproximaci\u00f3n constante por partes similares a un m\u00e9todo de volumen finito de primer orden<\/td>\n<\/tr>\n<tr>\n<td><code>p = 1<\/code><\/td>\n<td>2<\/td>\n<td>Punto de partida pr\u00e1ctico con variaci\u00f3n lineal dentro de cada elemento<\/td>\n<\/tr>\n<tr>\n<td><code>p = 2<\/code><\/td>\n<td>3<\/td>\n<td>Mayor precisi\u00f3n para soluciones suaves a un costo adicional moderado<\/td>\n<\/tr>\n<tr>\n<td><code>p = 3<\/code><\/td>\n<td>4<\/td>\n<td>Aproximaci\u00f3n de alto orden que requiere una estabilidad m\u00e1s estricta y un control en cuadratura<\/td>\n<\/tr>\n<\/tbody><\/table>\n<p>Para soluciones suficientemente suaves, un m\u00e9todo DG bien dise\u00f1ado puede lograr un error proporcional a aproximadamente <code>h^(p+1)<\/code>. Por lo tanto, aumentar el grado polinomial puede mejorar la precisi\u00f3n sin agregar m\u00e1s elementos.<\/p>\n<p>El orden superior no siempre es mejor. Los choques y las discontinuidades agudas pueden crear oscilaciones cerca del salto. Es posible que se necesiten limitadores, viscosidad artificial, filtrado o t\u00e9cnicas de captura de golpes.<\/p>\n<h2>Un solucionador de DG lineal en numpy<\/h2>\n<p>El siguiente ejemplo educativo implementa un m\u00e9todo DG lineal <code>p = 1<\/code> para la advecci\u00f3n unidimensional peri\u00f3dica. Cada elemento contiene dos grados de libertad ubicados en sus puntos finales.<\/p>\n<p>La implementaci\u00f3n utiliza el elemento forma d\u00e9bil, un flujo contra el viento y un m\u00e9todo Runge-Kutta que preserva la estabilidad fuerte de tercer orden.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\n# Domain and model parameters\nlength = 1.0\nnumber_of_elements = 80\nvelocity = 1.0\nfinal_time = 0.5\n\nelement_width = length \/ number_of_elements\njacobian = element_width \/ 2.0\n\n# Reference-element mass matrix for linear basis functions\nmass_reference = np.array([\n    [2.0 \/ 3.0, 1.0 \/ 3.0],\n    [1.0 \/ 3.0, 2.0 \/ 3.0]\n])\n\nmass_matrix = jacobian * mass_reference\ninverse_mass = np.linalg.inv(mass_matrix)\n\n# S[i, j] = integral(phi_j * derivative(phi_i)) on [-1, 1]\nvolume_matrix = np.array([\n    [-0.5, -0.5],\n    [ 0.5,  0.5]\n])\n\nleft_vector = np.array([1.0, 0.0])\nright_vector = np.array([0.0, 1.0])\n\n# Physical coordinates of local DG nodes\nleft_edges = np.arange(number_of_elements) * element_width\nright_edges = left_edges + element_width\ncoordinates = np.column_stack((left_edges, right_edges))\n\n# Smooth periodic initial condition\nsolution = (\n    0.5\n    + 0.5 * np.sin(2.0 * np.pi * coordinates \/ length)\n)\n\ndef upwind_flux(left_state, right_state, speed):\n    positive_speed = max(speed, 0.0)\n    negative_speed = min(speed, 0.0)\n\n    return (\n        positive_speed * left_state\n        + negative_speed * right_state\n    )\n\ndef spatial_residual(values):\n    residual = np.zeros_like(values)\n\n    for element in range(number_of_elements):\n        left_neighbor = (element - 1) % number_of_elements\n        right_neighbor = (element + 1) % number_of_elements\n\n        # States on the left interface\n        left_inside = values[element, 0]\n        left_outside = values[left_neighbor, 1]\n\n        # States on the right interface\n        right_inside = values[element, 1]\n        right_outside = values[right_neighbor, 0]\n\n        flux_left = upwind_flux(\n            left_outside,\n            left_inside,\n            velocity\n        )\n\n        flux_right = upwind_flux(\n            right_inside,\n            right_outside,\n            velocity\n        )\n\n        local_rhs = (\n            velocity * volume_matrix @ values[element]\n            + flux_left * left_vector\n            - flux_right * right_vector\n        )\n\n        residual[element] = inverse_mass @ local_rhs\n\n    return residual\n\n# Conservative time-step estimate\ntime_step = 0.1 * element_width \/ abs(velocity)\ncurrent_time = 0.0\n\nwhile current_time &lt; final_time:\n    dt = min(time_step, final_time - current_time)\n\n    # SSP-RK3 stage 1\n    stage_one = solution + dt * spatial_residual(solution)\n\n    # SSP-RK3 stage 2\n    stage_two = (\n        0.75 * solution\n        + 0.25 * (\n            stage_one\n            + dt * spatial_residual(stage_one)\n        )\n    )\n\n    # SSP-RK3 stage 3\n    solution = (\n        (1.0 \/ 3.0) * solution\n        + (2.0 \/ 3.0) * (\n            stage_two\n            + dt * spatial_residual(stage_two)\n        )\n    )\n\n    current_time += dt\n\nprint(\"Simulation completed\")\nprint(\"Final time:\", current_time)\nprint(\"Minimum value:\", solution.min())\nprint(\"Maximum value:\", solution.max())<\/code><\/pre>\n<p>Este ejemplo se limita intencionalmente a un problema lineal suave. Los solucionadores de DG de producci\u00f3n tambi\u00e9n necesitan tratamientos de contorno robustos, mapeos multidimensionales, cuadratura precisa, evaluaci\u00f3n de flujo no lineal, limitadores e integraci\u00f3n de tiempo m\u00e1s avanzada.<\/p>\n<h2>Integraci\u00f3n del tiempo y la condici\u00f3n CFL<\/h2>\n<p>La discretizaci\u00f3n espacial DG crea un sistema de ecuaciones diferenciales ordinarias. Un m\u00e9todo expl\u00edcito como Runge-Kutta puede entonces avanzar en ese sistema a tiempo.<\/p>\n<p>El paso de tiempo m\u00e1ximo estable depende de la velocidad de la onda, el tama\u00f1o del elemento, el grado polinomial, el flujo y el integrador de tiempo. Un escalado com\u00fan es:<\/p>\n<pre><code>\u0394t \u221d h \/ [(2p + 1)|a|]<\/code><\/pre>\n<p>La constante de estabilidad exacta depende del m\u00e9todo. Debe establecerse a trav\u00e9s del an\u00e1lisis, la documentaci\u00f3n o las pruebas num\u00e9ricas en lugar de tratarse como universales.<\/p>\n<p>El aumento del orden polinomial normalmente reduce el paso de tiempo expl\u00edcito estable m\u00e1s grande. Por lo tanto, la DG de alto orden puede requerir m\u00e1s pasos incluso cuando necesita menos elementos.<\/p>\n<h2>DG para problemas dominados por la advecci\u00f3n<\/h2>\n<p>Los m\u00e9todos est\u00e1ndar continuos de Galerkin pueden desarrollar oscilaciones cuando la advecci\u00f3n domina la difusi\u00f3n. Los m\u00e9todos continuos estabilizados como SUPG modifican las funciones de prueba para agregar control a lo largo de las l\u00edneas de corriente.<\/p>\n<p>DG maneja el transporte a trav\u00e9s de flujos de interfaz. Los flujos de Riemann o aproximados de Riemann introducen la estabilizaci\u00f3n consciente de la direcci\u00f3n y preservan la conservaci\u00f3n local.<\/p>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Aspecto<\/th>\n<th>DG con flujo contra el viento<\/th>\n<th>sorbo<\/th>\n<\/tr>\n<tr>\n<td>Espacio de soluci\u00f3n<\/td>\n<td>discontinuo entre elementos<\/td>\n<td>generalmente continuo<\/td>\n<\/tr>\n<tr>\n<td>Conservaci\u00f3n<\/td>\n<td>Conservaci\u00f3n de elementos locales<\/td>\n<td>Depende de la formulaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>Estabilizaci\u00f3n<\/td>\n<td>introducido a trav\u00e9s de flujos de interfaz<\/td>\n<td>introducido a trav\u00e9s de funciones de prueba modificadas<\/td>\n<\/tr>\n<tr>\n<td>discontinuidades<\/td>\n<td>representado directamente<\/td>\n<td>Por lo general, untado a trav\u00e9s de elementos continuos<\/td>\n<\/tr>\n<tr>\n<td>N\u00famero de inc\u00f3gnitas<\/td>\n<td>m\u00e1s alto porque las interfaces no comparten grados de libertad<\/td>\n<td>m\u00e1s bajo porque los elementos vecinos comparten nodos<\/td>\n<\/tr>\n<\/tbody><\/table>\n<p>SUPG sigue siendo efectivo para muchos problemas suaves dominados por convecci\u00f3n. La DG es atractiva cuando la conservaci\u00f3n local, las soluciones discontinuas, las mallas complejas o la adaptabilidad en cuanto a elementos son requisitos centrales.<\/p>\n<h2>DG frente a FVM y FEM continua<\/h2>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Caracter\u00edstica<\/th>\n<th>M\u00e9todo de volumen finito<\/th>\n<th>FEM continua<\/th>\n<th>Galerkin discontinuo<\/th>\n<\/tr>\n<tr>\n<td>Conservaci\u00f3n local<\/td>\n<td>Fuerte<\/td>\n<td>No autom\u00e1tico en formulaciones est\u00e1ndar<\/td>\n<td>Fuerte a trav\u00e9s de flujos num\u00e9ricos<\/td>\n<\/tr>\n<tr>\n<td>Flexibilidad polin\u00f3mica<\/td>\n<td>Por lo general, limitado en esquemas b\u00e1sicos<\/td>\n<td>Elevado<\/td>\n<td>Elevado<\/td>\n<\/tr>\n<tr>\n<td>Discontinuidades de la interfaz<\/td>\n<td>Almacenamiento a trav\u00e9s de medias celulares y reconstrucci\u00f3n<\/td>\n<td>no representado directamente<\/td>\n<td>representado naturalmente<\/td>\n<\/tr>\n<tr>\n<td>Recuento desconocido<\/td>\n<td>relativamente bajo<\/td>\n<td>Reducido a trav\u00e9s de nodos compartidos<\/td>\n<td>m\u00e1s altos porque los grados de libertad son elementos-locales<\/td>\n<\/tr>\n<tr>\n<td>estructura paralela<\/td>\n<td>Bueno<\/td>\n<td>Requiere acoplamiento global<\/td>\n<td>Localidad de elementos fuertes con comunicaci\u00f3n facial<\/td>\n<\/tr>\n<tr>\n<td>dificultad de implementaci\u00f3n<\/td>\n<td>De bajo a moderado<\/td>\n<td>Moderar<\/td>\n<td>Moderado a alto<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h2>Ventajas del m\u00e9todo DG<\/h2>\n<ul>\n<li>La conservaci\u00f3n local est\u00e1 integrada en el equilibrio del flujo de la interfaz.<\/li>\n<li>El grado polinomial puede variar entre elementos.<\/li>\n<li>Las discontinuidades no violan el espacio de aproximaci\u00f3n.<\/li>\n<li>Los c\u00e1lculos de elementos se adaptan bien al hardware paralelo.<\/li>\n<li>Se pueden soportar mallas complejas y no estructuradas.<\/li>\n<li>Se puede combinar el refinamiento de malla y el enriquecimiento polin\u00f3mico.<\/li>\n<li>Se pueden seleccionar diferentes flujos num\u00e9ricos para diferentes ecuaciones.<\/li>\n<\/ul>\n<h2>Limitaciones de DG<\/h2>\n<p>DG normalmente utiliza m\u00e1s grados de libertad que un m\u00e9todo de elementos finitos continuos del mismo grado polinomial porque los elementos vecinos no comparten valores de interfaz.<\/p>\n<p>El m\u00e9todo tambi\u00e9n requiere un cuidadoso dise\u00f1o de flujo. Las ecuaciones hiperb\u00f3licas, el\u00edpticas y mixtas necesitan diferentes tratamientos de interfaz. Los operadores de difusi\u00f3n requieren formulaciones como penalizaci\u00f3n interior, DG local o t\u00e9cnicas relacionadas.<\/p>\n<p>Los m\u00e9todos DG expl\u00edcitos de orden superior pueden tener l\u00edmites de paso de tiempo restrictivos. Los problemas no lineales pueden requerir limitadores, flujos estables de entrop\u00eda, preservaci\u00f3n de la positividad o viscosidad artificial.<\/p>\n<p>Estas caracter\u00edsticas hacen que DG sea potente pero m\u00e1s dif\u00edcil de implementar correctamente que la diferencia finita b\u00e1sica o los esquemas de volumen finito.<\/p>\n<h2>Errores de implementaci\u00f3n comunes<\/h2>\n<p>Un error com\u00fan es usar el flujo f\u00edsico directamente en una interfaz discontinua sin definir c\u00f3mo se deben combinar los dos valores vecinos.<\/p>\n<p>Otros errores frecuentes incluyen:<\/p>\n<ul>\n<li>Usar el signo err\u00f3neo para la contribuci\u00f3n del l\u00edmite izquierdo o derecho<\/li>\n<li>Aplicaci\u00f3n de orientaciones vectoriales normales inconsistentes<\/li>\n<li>Asumiendo que la matriz de masa es siempre diagonal<\/li>\n<li>Usando una cuadratura que es demasiado d\u00e9bil para t\u00e9rminos no lineales<\/li>\n<li>Ignorar la dependencia polinomial-grado del l\u00edmite CFL<\/li>\n<li>Aplicar incorrectamente las condiciones de contorno peri\u00f3dicas o f\u00edsicas<\/li>\n<li>Uso de polinomios de alto orden cerca de amortiguadores sin limitador<\/li>\n<li>Probando solo la salida visual en lugar de la convergencia y la conservaci\u00f3n<\/li>\n<\/ul>\n<h2>C\u00f3mo validar un solucionador de DG<\/h2>\n<p>Comience con un problema que tiene una soluci\u00f3n anal\u00edtica conocida. La advecci\u00f3n lineal peri\u00f3dica es \u00fatil porque el perfil exacto simplemente se desplaza <code>a t<\/code>.<\/p>\n<p>Ejecute el solucionador con varias resoluciones de malla y mida una norma de error. Para una soluci\u00f3n suave, la tasa de convergencia observada debe abordar el orden te\u00f3rico del m\u00e9todo.<\/p>\n<p>Compruebe la conservaci\u00f3n integrando la soluci\u00f3n en todo el dominio. Para la advecci\u00f3n peri\u00f3dica, la masa total debe permanecer casi constante.<\/p>\n<p>Pruebe las velocidades positivas y negativas para verificar la direcci\u00f3n contra el viento. Los datos iniciales constantes deben permanecer constantes. Los estados de contorno tambi\u00e9n deben probarse por separado antes de pasar a ecuaciones no lineales.<\/p>\n<h2>Cu\u00e1ndo elegir DG<\/h2>\n<p>DG es una fuerte opci\u00f3n cuando el problema contiene ondas, choques, interfaces de materiales o comportamiento dominado por el transporte. Tambi\u00e9n es \u00fatil cuando la conservaci\u00f3n local es esencial o cuando la simulaci\u00f3n se beneficia de la precisi\u00f3n de alto orden en una malla no estructurada.<\/p>\n<p>Un m\u00e9todo b\u00e1sico de volumen finito puede seguir siendo m\u00e1s simple para problemas de conservaci\u00f3n de bajo orden. Los elementos finitos continuos pueden ser m\u00e1s eficientes para problemas el\u00edpticos o estructurales suaves donde no se esperan discontinuidades.<\/p>\n<p>El m\u00e9todo num\u00e9rico debe seguir la estructura matem\u00e1tica de la PDE en lugar de la popularidad actual o la disponibilidad de software.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>El m\u00e9todo Galerkin discontinuo representa la soluci\u00f3n con polinomios independientes dentro de cada elemento. Su formulaci\u00f3n d\u00e9bil produce t\u00e9rminos de contorno naturales que son reemplazados por flujos num\u00e9ricos. Estos flujos controlan c\u00f3mo se mueve la informaci\u00f3n entre los elementos y permiten el m\u00e9todo completo para conservar las cantidades localmente.<\/p>\n<p>DG combina una aproximaci\u00f3n polinomial de alto orden, flexibilidad geom\u00e9trica, manejo de discontinuidad y una fuerte localidad de elementos. Estas ventajas lo hacen valioso para la propagaci\u00f3n de olas, las leyes de conservaci\u00f3n hiperb\u00f3lica, los sistemas dominados por convecci\u00f3n y las grandes simulaciones paralelas.<\/p>\n<p>El m\u00e9todo tambi\u00e9n introduce complejidad adicional. Los flujos, cuadratura, restricciones de paso de tiempo, limitadores y condiciones de contorno deben seleccionarse cuidadosamente. Se debe desarrollar gradualmente una implementaci\u00f3n confiable, comenzando con una ecuaci\u00f3n lineal simple y verificada mediante pruebas de convergencia y conservaci\u00f3n.<\/p>\n<p>Para los investigadores que ya entienden los m\u00e9todos de volumen finito o elementos finitos, DG proporciona un siguiente paso natural hacia los solucionadores de PDE de alto orden localmente conservadores en Python cient\u00edfico.<\/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\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Derivaci\u00f3n paso a paso del m\u00e9todo Galerkin discontinuo, comparaci\u00f3n de flujo num\u00e9rico y una implementaci\u00f3n 1D completa en Python. Aprenda cu\u00e1ndo DG supera a FVM y FEM continuo.<\/p>\n","protected":false,"raw":"Derivaci\u00f3n paso a paso del m\u00e9todo Galerkin discontinuo, comparaci\u00f3n de flujo num\u00e9rico y una implementaci\u00f3n 1D completa en Python. Aprenda cu\u00e1ndo DG supera a FVM y FEM continuo."},"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=465","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-543","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>M\u00e9todo de Galerkin discontinuo en Python<\/title>\n<meta name=\"description\" content=\"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.\" \/>\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\/discontinuous-galerkin-method-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M\u00e9todo de Galerkin discontinuo en Python\" \/>\n<meta property=\"og:description\" content=\"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T08:18:02+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=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python\",\"datePublished\":\"2026-07-22T08:18:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/\"},\"wordCount\":2914,\"commentCount\":0,\"articleSection\":[\"Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/\",\"name\":\"M\u00e9todo de Galerkin discontinuo en Python\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-22T08:18:02+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/discontinuous-galerkin-method-tutorial\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python\"}]},{\"@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":"M\u00e9todo de Galerkin discontinuo en Python","description":"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.","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\/discontinuous-galerkin-method-tutorial\/","og_locale":"es_ES","og_type":"article","og_title":"M\u00e9todo de Galerkin discontinuo en Python","og_description":"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.","og_url":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/","og_site_name":"matforge.org","article_published_time":"2026-07-22T08:18:02+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Tomas Delgado","Tiempo de lectura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python","datePublished":"2026-07-22T08:18:02+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/"},"wordCount":2914,"commentCount":0,"articleSection":["Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/","url":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/","name":"M\u00e9todo de Galerkin discontinuo en Python","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-22T08:18:02+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"Aprenda c\u00f3mo los m\u00e9todos DG utilizan formas d\u00e9biles, flujos num\u00e9ricos, bases polin\u00f3micas y conservaci\u00f3n local para resolver las PDE en Python cient\u00edfico.","breadcrumb":{"@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/discontinuous-galerkin-method-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Tutorial discontinuo del m\u00e9todo Galerkin: derivaci\u00f3n, flujos e implementaci\u00f3n de Python"}]},{"@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\/543","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=543"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/543\/revisions"}],"predecessor-version":[{"id":746,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/543\/revisions\/746"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}