{"id":1108,"date":"2026-08-19T09:48:35","date_gmt":"2026-08-19T09:48:35","guid":{"rendered":"https:\/\/matforge.org\/?p=1108","raw":"https:\/\/matforge.org\/?p=1108"},"modified":"2026-08-19T09:48:35","modified_gmt":"2026-08-19T09:48:35","slug":"physics-informed-neural-networks-pytorch-guide","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/","title":{"rendered":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python","raw":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de 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\"> 14<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Las redes neuronales informadas por la f\u00edsica (PINN) resuelven ecuaciones diferenciales parciales al incorporar ecuaciones de gobierno directamente en funciones de p\u00e9rdida de red neuronal, lo que permite una soluci\u00f3n simult\u00e1nea y una estimaci\u00f3n de par\u00e1metros sin generaci\u00f3n de malla. Combinan la diferenciaci\u00f3n autom\u00e1tica con la optimizaci\u00f3n basada en gradiente para aproximar las soluciones PDE y, cuando se combinan con las estrategias de entrenamiento adecuadas, pueden recuperar par\u00e1metros f\u00edsicos a partir de datos de observaci\u00f3n escasos.<\/p>\n<hr>\n<h2>Comida clave<\/h2>\n<ol>\n<li>Los pins incrustan los residuos de PDE como t\u00e9rminos de p\u00e9rdida de f\u00edsica, por lo que la red aprende a satisfacer simult\u00e1neamente las condiciones de contorno y las ecuaciones diferenciales.<\/li>\n<li><strong>La hibridaci\u00f3n del optimizador importa<\/strong>: Adam para el entrenamiento inicial (\u00e9pocas de 20K\u201380K) seguido de L-BFGS para el ajuste fino (~30 \u00e9pocas) es la secuencia recomendada emp\u00edricamente.<\/li>\n<li>Los pins sobresalen en problemas inversos (estimaci\u00f3n de par\u00e1metros) y reg\u00edmenes de datos dispersos, pero los puntos de referencia recientes muestran que siguen siendo inferiores a los solucionadores num\u00e9ricos tradicionales para problemas directos.<\/li>\n<li>El recuento de puntos de colocaci\u00f3n afecta cr\u00edticamente la convergencia: ~8192 puntos a menudo es suficiente saturaci\u00f3n; M\u00e1s all\u00e1 de eso, las ganancias son marginales a un costo de c\u00e1lculo significativo.<\/li>\n<li>Se requiere <code>torch.func.jacrev<\/code> + <code>torch.func.vmap<\/code> para el c\u00e1lculo jacobiano en los pins de salida m\u00faltiple: fallas puras <code>torch.autograd.grad<\/code> para los modelos con valores vectoriales por lotes.<\/li>\n<li>Las t\u00e9cnicas de equilibrio de p\u00e9rdida (reponderaci\u00f3n basada en LRA, NTK) y la descomposici\u00f3n de dominio (FBPINP) abordan la tasa de falla de la tarea de ~60 % de los pines de vainilla reveladas por el punto de referencia de Pinnacle.<\/li>\n<\/ol>\n<hr>\n<h2>\u00bfQu\u00e9 son las redes neuronales informadas en la f\u00edsica?<\/h2>\n<p>Los pinns fueron introducidos por Raissi, Perdikaris y Karniadakis en 2019 como un enfoque sin malla para resolver PDE utilizando redes neuronales profundas. Esto representa un cambio significativo de los m\u00e9todos tradicionales basados en la malla como los enfoques de elementos finitos y diferencias finitas cubiertos en nuestra <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introducci\u00f3n al modelado de materiales<\/a>. La idea central es elegante pero pr\u00e1cticamente sutil: en lugar de discretizar el dominio en una malla (como en los m\u00e9todos de diferencias finitas o de elementos finitos), se define la soluci\u00f3n como una red neuronal continua y penaliza las violaciones de la f\u00edsica gobernante durante el entrenamiento.<\/p>\n<p>Considere una PDE gen\u00e9rica:<\/p>\n<pre><code>\ud835\udca9(u(x,t), x, t) = 0,   (x,t) \u2208 \u03a9\n<\/code><\/pre>\n<p>donde <code>\ud835\udca9<\/code> es un operador diferencial, <code>u(x,t)<\/code> es la soluci\u00f3n desconocida y <code>\u03a9<\/code> es el dominio espacio-temporal. Un PINN parametriza <code>u<\/code> como una red neuronal <code>u(x,t; \u03b8)<\/code> con pesos <code>\u03b8<\/code>. La funci\u00f3n de p\u00e9rdida combina tres componentes:<\/p>\n<pre><code>Loss(\u03b8) = LossPhysics + LossBoundary + LossData\n<\/code><\/pre>\n<ul>\n<li><strong>Lossphysics<\/strong>: El residuo de PDE <code>\ud835\udca9(u(x,t; \u03b8))<\/code> evaluado en los puntos de colocaci\u00f3n muestreados en todo el dominio.<\/li>\n<li><strong>LossBoundary<\/strong>: Violaci\u00f3n de los l\u00edmites y las condiciones iniciales.<\/li>\n<li><strong>LossData<\/strong>: discrepancia (opcional) entre los valores predichos y los datos de observaci\u00f3n escasos.<\/li>\n<\/ul>\n<p>La red est\u00e1 capacitada para minimizar <code>Loss(\u03b8)<\/code> usando descenso de gradiente, y la red resultante proporciona una aproximaci\u00f3n continua y diferenciable de la soluci\u00f3n en todo el dominio.<\/p>\n<hr>\n<h2>Generaci\u00f3n de puntos de colocaci\u00f3n<\/h2>\n<p>La elecci\u00f3n y distribuci\u00f3n de los puntos de colocaci\u00f3n es posiblemente el hiperpar\u00e1metro m\u00e1s importante en el entrenamiento de Pinn. Los puntos de colocaci\u00f3n son las ubicaciones donde se eval\u00faa el residuo de PDE para calcular la p\u00e9rdida de la f\u00edsica.<\/p>\n<h3>Estrategia<\/h3>\n<p>El enfoque est\u00e1ndar muestra puntos de manera uniforme en todo el dominio. Para un dominio espacial 1D <code>[x_min, x_max]<\/code> y un dominio de tiempo <code>[t_min, t_max]<\/code>, genera <code>N_spatial<\/code> puntos espaciales y <code>N_temporal<\/code> puntos temporales, luego forma una cuadr\u00edcula de <code>N_total = N_spatial \u00d7 N_temporal<\/code> puntos de colocaci\u00f3n.<\/p>\n<pre><code class=\"language-python\">import torch\n\ndef sample_collocation_points(N_spatial, N_temporal, x_range, t_range):\n    \"\"\"Sample uniform collocation points for a 1D spatial-temporal domain.\n    \n    Args:\n        N_spatial: Number of spatial points\n        N_temporal: Number of temporal points  \n        x_range: Tuple (x_min, x_max)\n        t_range: Tuple (t_min, t_max)\n    \n    Returns:\n        Points tensor of shape (N_total, 2)\n    \"\"\"\n    x = torch.linspace(x_range[0], x_range[1], N_spatial)\n    t = torch.linspace(t_range[0], t_range[1], N_temporal)\n    \n    # Create meshgrid\n    X, T = torch.meshgrid(x, t, indexing='ij')\n    \n    # Flatten and stack\n    points = torch.stack([X.flatten(), T.flatten()], dim=1)\n    \n    return points\n\n# Example: 200 spatial points \u00d7 200 temporal points = 40,000 collocation points\ncollocation_points = sample_collocation_points(200, 200, [0, 1], [0, 0.5])\n<\/code><\/pre>\n<h3>Sensibilidad al conteo de puntos<\/h3>\n<p>Los experimentos de referencia de Pinnacle demuestran que el tama\u00f1o de lote (recuento de puntos de colocaci\u00f3n) afecta dr\u00e1sticamente la convergencia. El estudio de escalado progresivo encontr\u00f3:<\/p>\n<ul>\n<li><strong>512 puntos<\/strong>: converge pero conserva un error relativamente alto<\/li>\n<li><strong>8192 puntos<\/strong>: a menudo saturaci\u00f3n suficiente para una precisi\u00f3n moderada<\/li>\n<li><strong>32768 puntos<\/strong>: mejora de error marginal a un costo de c\u00e1lculo significativo<\/li>\n<\/ul>\n<p>Para la mayor\u00eda de los fines pr\u00e1cticos, 8192 puntos de colocaci\u00f3n proporcionan una precisi\u00f3n adecuada sin sobrecarga computacional excesiva. La idea clave es que m\u00e1s puntos no siempre significan una mejor convergencia: el panorama de p\u00e9rdidas puede volverse m\u00e1s complejo con el sobremuestreo y los rendimientos decrecientes se establecen r\u00e1pidamente.<\/p>\n<h3>Muestreo adaptativo (avanzado)<\/h3>\n<p>Para PDE desafiantes con gradientes o discontinuidades localizadas, el refinamiento adaptativo basado en residuos (RAR) puede volver a muestrear din\u00e1micamente los puntos de colocaci\u00f3n para enfocarse en regiones con residuos de PDE altos. Este enfoque aborda uno de los modos de falla clave del muestreo uniforme en las tareas de geometr\u00eda compleja de Pinnacle.<\/p>\n<hr>\n<h2>Problema hacia adelante: Resolviendo la ecuaci\u00f3n de calor<\/h2>\n<p>El problema de reenv\u00edo pregunta: Dada una PDE y las condiciones iniciales\/l\u00edmites, busque la soluci\u00f3n. Resolveremos la ecuaci\u00f3n de calor 1D:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1 \u2202\u00b2u\/\u2202x\u00b2,   x \u2208 [0, 1], t \u2208 [0, T]\n<\/code><\/pre>\n<p>con condici\u00f3n inicial <code>u(x, 0) = f(x)<\/code> y condiciones de contorno <code>u(0, t) = u(L, t) = 0<\/code>.<\/p>\n<h3>arquitectura de red<\/h3>\n<pre><code class=\"language-python\">import torch\nimport torch.nn as nn\n\nclass PINN(nn.Module):\n    \"\"\"Neural network that maps (x, t) \u2192 u(x, t) for a PINN.\"\"\"\n    \n    def __init__(self, input_dim=2, output_dim=1, hidden_dims=[64, 64, 64, 64]):\n        super().__init__()\n        self.layers = nn.ModuleList()\n        \n        # Input layer\n        self.layers.append(nn.Linear(input_dim, hidden_dims[0]))\n        \n        # Hidden layers\n        for i in range(len(hidden_dims) - 1):\n            self.layers.append(nn.Linear(hidden_dims[i], hidden_dims[i+1]))\n        \n        # Output layer\n        self.layers.append(nn.Linear(hidden_dims[-1], output_dim))\n        \n        # Initialize weights (tanh activation)\n        self.activation = nn.Tanh()\n        \n        # Weight initialization: Xavier uniform for linear layers\n        for layer in self.layers:\n            if isinstance(layer, nn.Linear):\n                nn.init.xavier_uniform_(layer.weight)\n                nn.init.zeros_(layer.bias)\n    \n    def forward(self, x):\n        \"\"\"Forward pass: (x, t) \u2192 u(x, t).\"\"\"\n        h = self.layers[0](x)\n        h = self.activation(h)\n        for layer in self.layers[1:-1]:\n            h = layer(h)\n            h = self.activation(h)\n        return self.layers[-1](h)\n<\/code><\/pre>\n<h3>Inform\u00e1tica derivadas con Autograd<\/h3>\n<p>La innovaci\u00f3n cr\u00edtica de los pins es el c\u00e1lculo de derivados de la salida de la red con respecto a sus entradas utilizando la diferenciaci\u00f3n autom\u00e1tica. Para la ecuaci\u00f3n de calor, necesitamos:<\/p>\n<pre><code class=\"language-python\">def compute_pde_residual(net, x_col, t_col, alpha):\n    \"\"\"Compute the PDE residual for the heat equation.\n    \n    The physics loss is the squared L2 norm of the PDE residual evaluated\n    at the collocation points.\n    \"\"\"\n    x_col.requires_grad_(True)\n    t_col.requires_grad_(True)\n    \n    # Stack points into (N, 2)\n    pts = torch.stack([x_col, t_col], dim=1)\n    pts.requires_grad_(True)\n    \n    # Forward pass\n    u = net(pts)\n    \n    # Compute derivatives via autograd\n    u_t = torch.autograd.grad(u.sum(), pts, create_graph=True)[0][:, 1:2]  # \u2202u\/\u2202t\n    u_x = torch.autograd.grad(u.sum(), pts, create_graph=True)[0][:, 0:1]  # \u2202u\/\u2202x\n    \n    # Need second derivative: \u2202\u00b2u\/\u2202x\u00b2\n    u_xx = torch.autograd.grad(u_x.sum(), pts, create_graph=True)[0][:, 0:1]\n    \n    # PDE residual: \u2202u\/\u2202t - \u03b1 \u2202\u00b2u\/\u2202x\u00b2 = 0\n    residual = u_t - alpha * u_xx\n    \n    return residual\n<\/code><\/pre>\n<p><strong>Nota importante<\/strong>: el enfoque <code>torch.autograd.grad<\/code> anterior funciona para redes de salida \u00fanica, pero <strong> falla para modelos de valores de vector por lotes<\/strong>. Como se demostr\u00f3 en los tutoriales recientes de PyTorch, se requiere <code>torch.func.jacrev<\/code> combinado con <code>torch.func.vmap<\/code> para un c\u00e1lculo jacobiano adecuado cuando la red produce salidas con valores vectoriales sobre entradas por lotes. Consulte la secci\u00f3n de implementaci\u00f3n avanzada a continuaci\u00f3n.<\/p>\n<h3>bucle de entrenamiento<\/h3>\n<pre><code class=\"language-python\">def train_pin_net(net, collocation_points, boundary_points, \n                initial_points, alpha, N_epochs=50000):\n    \"\"\"Train a PINN for the heat equation forward problem.\"\"\"\n    \n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(N_epochs):\n        # Collect collocation points (physics loss)\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Boundary conditions (x=0 and x=1)\n        x_bc = torch.tensor([[0.0], [1.0]]).repeat(1, len(t_bc))\n        t_bc = boundary_points\n        u_bc = net(torch.cat([x_bc, t_bc], dim=1))\n        # Dirichlet BC: u = 0 at boundaries\n        bc_loss = torch.mean(u_bc ** 2)\n        \n        # Initial condition (t=0)\n        x_ic = initial_points[:, 0]\n        t_ic = torch.zeros_like(initial_points[:, 0])\n        u_ic = net(torch.cat([x_ic, t_ic], dim=1))\n        # Initial condition: u(x,0) = f(x)\n        f_exact = torch.sin(torch.pi * x_ic)\n        ic_loss = torch.mean((u_ic - f_exact) ** 2)\n        \n        # Total loss\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        if epoch % 1000 == 0:\n            print(f\"Epoch {epoch}: loss={loss.item():.6f}, \"\n                  f\"physics={physics_loss.item():.6f}, \"\n                  f\"bc={bc_loss.item():.6f}, \"\n                  f\"ic={ic_loss.item():.6f}\")\n<\/code><\/pre>\n<hr>\n<h2>Problema inverso: estimaci\u00f3n de par\u00e1metros<\/h2>\n<p>El problema inverso pregunta: Dados los escasos datos de observaci\u00f3n, identifique par\u00e1metros desconocidos en las ecuaciones de gobierno. Aqu\u00ed es donde los pines realmente brillan: los solucionadores tradicionales requieren que especifique todos los par\u00e1metros por adelantado, mientras que los pines pueden <strong>aprender<\/strong> a partir de los datos simult\u00e1neamente.<\/p>\n<h3>Configuraci\u00f3n del problema<\/h3>\n<p>Considere la misma ecuaci\u00f3n de calor pero con un <strong>coeficiente de difusi\u00f3n desconocido<\/strong> <code>\u03b1<\/code>:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1(\u03b8) \u2202\u00b2u\/\u2202x\u00b2\n<\/code><\/pre>\n<p>donde <code>\u03b1(\u03b8)<\/code> se parametriza como escalar entrenable dentro de la red.<\/p>\n<h3>Red modificada para problemas inversos<\/h3>\n<pre><code class=\"language-python\">class PINN_Inverse(nn.Module):\n    \"\"\"PINN for inverse problems: learns PDE parameters from data.\"\"\"\n    \n    def __init__(self, input_dim=2, hidden_dims=[64, 64, 64, 64]):\n        super().__init__()\n        self.net = PINN(input_dim, 1, hidden_dims)\n        \n        # Trainable parameter: diffusion coefficient \u03b1\n        self.alpha = nn.Parameter(torch.tensor(1.0))\n    \n    def forward(self, x):\n        return self.net(x)\n    \n    def compute_inverse_residual(self, pts, data_points, data_values):\n        \"\"\"Compute combined physics + data loss with trainable \u03b1.\"\"\"\n        \n        # PDE residual (same as forward problem)\n        x_col, t_col = pts[:, 0], pts[:, 1]\n        residual = self._compute_residual(x_col, t_col, self.alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Data loss at sparse observation points\n        data_x = data_points[:, 0]\n        data_t = data_points[:, 1]\n        u_pred = self.net(torch.cat([data_x, data_t], dim=1))\n        data_loss = torch.mean((u_pred - data_values) ** 2)\n        \n        return physics_loss, data_loss, self.alpha.item()\n<\/code><\/pre>\n<h3>Entrenamiento con estimaci\u00f3n de par\u00e1metros<\/h3>\n<pre><code class=\"language-python\">def train_inverse_pin(net, collocation_points, data_points, data_values,\n                      N_epochs=50000):\n    \"\"\"Train PINN for inverse problem (parameter estimation).\"\"\"\n    \n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(N_epochs):\n        # Compute losses\n        physics_loss, data_loss, alpha_est = net.compute_inverse_residual(\n            collocation_points, data_points, data_values\n        )\n        \n        # Weight data loss higher during parameter estimation\n        loss = physics_loss + 10 * data_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        # Track parameter estimate\n        if epoch % 5000 == 0:\n            print(f\"Epoch {epoch}: \u03b1 \u2248 {alpha_est:.4f}\")\n    \n    # Return estimated parameter\n    return net.alpha.item()\n<\/code><\/pre>\n<p>El problema inverso demuestra la ventaja \u00fanica de los pins: en lugar de resolver una PDE con par\u00e1metros conocidos, la red descubre simult\u00e1neamente la soluci\u00f3n e identifica las constantes f\u00edsicas que gobiernan. Esto es particularmente valioso en entornos experimentales donde los par\u00e1metros son dif\u00edciles o costosos de medir directamente.<\/p>\n<hr>\n<h2>Implementaci\u00f3n avanzada: Torch.func para salidas con valores vectoriales<\/h2>\n<p>El enfoque est\u00e1ndar <code>torch.autograd.grad<\/code> que se muestra arriba funciona para redes simples de salida \u00fanica. Sin embargo, cuando se introducen las entradas por lotes para obtener eficiencia, la red produce salidas con valores vectoriales, y <code>torch.autograd.grad<\/code> solo falla.<\/p>\n<p>El enfoque correcto utiliza <code>torch.func.jacrev<\/code> combinado con <code>torch.func.vmap<\/code>:<\/p>\n<pre><code class=\"language-python\">import torch.func as func\n\ndef _single_point_residual(net, pt, alpha):\n    \"\"\"Compute PDE residual for a single (x, t) point.\n    \n    Args:\n        net: PINN network\n        pt: Tensor of shape (2,) \u2014 [x, t]\n        alpha: Diffusion coefficient\n    \n    Returns:\n        PDE residual as scalar\n    \"\"\"\n    pt = pt.unsqueeze(0)  # (1, 2) for network input\n    u = net(pt)\n    \n    # Compute derivatives using torch.func.jacrev\n    u_x = torch.autograd.grad(u.sum(), pt, create_graph=True)[0]\n    \n    # For second derivative, we need gradient of gradient\n    u_xx = torch.autograd.grad(u_x.sum(), pt, create_graph=True)[0]\n    \n    # PDE residual\n    return u_x[:, 1] - alpha * u_xx[:, 0]  # \u2202u\/\u2202t - \u03b1 \u2202\u00b2u\/\u2202x\u00b2\n\n# Vectorize over batch\njac_fn = func.jacrev(_single_point_residual)\n\ndef compute_batch_residual(net, batch_points, alpha):\n    \"\"\"Compute residuals for a batch of points using jacrev + vmap.\n    \n    Args:\n        batch_points: Tensor of shape (N, 2)\n        alpha: Diffusion coefficient\n    \n    Returns:\n        Residuals of shape (N,)\n    \"\"\"\n    return func.vmap(jac_fn, in_dims=0, out_dims=0)(\n        net, batch_points, alpha\n    )\n<\/code><\/pre>\n<p>Este enfoque no se menciona en la mayor\u00eda de los tutoriales de PINN, pero es cr\u00edtico para el c\u00e1lculo de gradiente adecuado cuando se entrena con lotes grandes. Sin \u00e9l, puede encontrar fallas silenciosas o gradientes incorrectos.<\/p>\n<hr>\n<h2>Estrategia del Optimizador: ADAM \u2192 L-BFGS Hibridaci\u00f3n<\/h2>\n<p>La elecci\u00f3n del optimizador afecta cr\u00edticamente a la convergencia de PINN. Los estudios emp\u00edricos y los resultados de referencia recomiendan constantemente un enfoque de dos fases:<\/p>\n<h3>Fase 1: Entrenamiento de Adam<\/h3>\n<pre><code>Epochs: 20,000\u201380,000\nLearning rate: 1e-3 to 1e-4\nPurpose: Global exploration, rough convergence\n<\/code><\/pre>\n<p>El impulso de Adam ayuda a la red a escapar de las malas regiones iniciales del panorama de p\u00e9rdidas. Sin embargo, solo Adam converge a menudo lentamente y puede detenerse en una meseta de p\u00e9rdida sub\u00f3ptima.<\/p>\n<h3>Fase 2: Refinamiento L-BFGS<\/h3>\n<pre><code>Epochs: ~30\u201350\nPurpose: Fine-tuning, reaching final accuracy\n<\/code><\/pre>\n<p>L-BFGS (Memoria limitada Broyden-Fletcher-Rawstorff) realiza b\u00fasquedas en l\u00ednea y actualizaciones cuasi-Newton, refinando r\u00e1pidamente la soluci\u00f3n una vez que Adam ha acercado la red al \u00f3ptimo.<\/p>\n<h3>Implementaci\u00f3n<\/h3>\n<pre><code class=\"language-python\">def train_with_adam_lbfgs(net, collocation_points, data_points,\n                          boundary_points, initial_points, alpha,\n                          adam_epochs=50000, lbfgs_epochs=30):\n    \"\"\"Train PINN with Adam \u2192 L-BFGS optimizer hybridization.\"\"\"\n    \n    # Phase 1: Adam\n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(adam_epochs):\n        # Compute losses (same as forward problem)\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Boundary and initial losses\n        # ... (same as before)\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n    \n    print(f\"After Adam: loss = {loss.item():.6f}\")\n    \n    # Phase 2: L-BFGS\n    # Reset parameters to final Adam state\n    optimizer_lbfgs = torch.optim.LBFGS(net.parameters(), lr=0.1, max_iter=5)\n    \n    def closure():\n        optimizer_lbfgs.zero_grad()\n        # Recompute losses\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        # ... boundary and initial losses\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        loss.backward()\n        return loss\n    \n    for _ in range(lbfgs_epochs):\n        loss = optimizer_lbfgs.step(closure)\n        print(f\"L-BFGS step: loss = {loss.item():.6f}\")\n    \n    return net\n<\/code><\/pre>\n<p><strong>Por qu\u00e9 esto funciona<\/strong>: L-BFG solo a menudo difiere de la inicializaci\u00f3n aleatoria porque su b\u00fasqueda de l\u00ednea falla cuando el gradiente inicial apunta en la direcci\u00f3n equivocada. Adam proporciona la exploraci\u00f3n global necesaria para llegar a una buena cuenca de atracci\u00f3n, despu\u00e9s de lo cual L-BFGS converge r\u00e1pidamente con gran precisi\u00f3n. Esta secuencia no se menciona en la mayor\u00eda de los tutoriales, pero es fundamental para la convergencia de PINN confiable.<\/p>\n<hr>\n<h2>Contexto de referencia: \u00bfQu\u00e9 muestran los estudios recientes?<\/h2>\n<p>Comprender d\u00f3nde se encuentran los pins en relaci\u00f3n con los solucionadores tradicionales requiere examinar los estudios de referencia recientes. Este contexto es crucial para los lectores que quieren entender c\u00f3mo se comparan los enfoques neuronales con los m\u00e9todos establecidos, un tema central para nuestra cobertura de <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\" target=\"_blank\" rel=\"noopener\">Qu\u00e9 significa realmente la simulaci\u00f3n cient\u00edfica<\/a> en la investigaci\u00f3n moderna. Tres esfuerzos principales proporcionan evidencia cuantitativa concreta:<\/p>\n<h3>Pdebench: Benchmark de operadores neuronales<\/h3>\n<p>Pdebench (Takamoto et al., Neurips 2022) compara PINNs, operadores neuronales de Fourier (FNOS) y arquitecturas U-NET en m\u00faltiples categor\u00edas de PDE. Hallazgo clave: los FNOS requieren datos de entrenamiento pregenerados y aprenden a mapear entre colectores de soluci\u00f3n completos, mientras que los pins resuelven problemas por instancia sin ning\u00fan entrenamiento previo. Esta distinci\u00f3n hace que los pines sean fundamentalmente diferentes de los operadores neuronales: pueden abordar problemas inversos y adaptarse a las condiciones de contorno invisibles, pero entrenan desde cero para cada nueva instancia.<\/p>\n<p>Las visualizaciones de PDEBENCH demuestran la diversidad de problemas que los pines pueden abordar: sistemas de reacci\u00f3n de difusi\u00f3n, ecuaciones de aguas poco profundas, flujos de Navier-Stokes, que ilustran tanto la flexibilidad como la amplitud de la aplicaci\u00f3n.<\/p>\n<h3>Pin\u00e1culo: Evaluaci\u00f3n sistem\u00e1tica del m\u00e9todo<\/h3>\n<p>El punto de referencia pin\u00e1culo (Hao et al., 2023) proporciona la evaluaci\u00f3n m\u00e1s completa de las variantes de PINN en 22 casos de prueba. El hallazgo cr\u00edtico:<\/p>\n<blockquote>\n<p><strong>Los pins de vainilla resuelven solo 9 de 22 tareas (\u226440 %)<\/strong> con un umbral de precisi\u00f3n razonable.<\/p>\n<\/blockquote>\n<p>Recomendaciones espec\u00edficas del m\u00e9todo de Pinnacle:<\/p>\n<ul>\n<li><strong>PINN-LRA<\/strong> (an\u00e1lisis de reponderaci\u00f3n de p\u00e9rdidas): lo mejor para geometr\u00edas complejas<\/li>\n<li><strong>PINN-NTK<\/strong> (kernel tangente neural): Eficaz para problemas multiescala<\/li>\n<li><strong>FBPINP<\/strong> (PINN equilibrado fundamental): La descomposici\u00f3n del dominio sobresale en problemas multiescala<\/li>\n<li><strong>HP-VPINP \/ GPINP<\/strong>: las formulaciones variacionales sobresalen en problemas inversos<\/li>\n<\/ul>\n<p>Estos resultados sugieren que los pines sin procesar a menudo luchan con las PDE desafiantes, pero las variantes de m\u00e9todos objetivo abordan modos de falla espec\u00edficos.<\/p>\n<h3>DeepFDM 2025: Soludores H\u00edbridos Diferenciables-num\u00e9ricos<\/h3>\n<p>El marco DeepFDM de Chatain et al. (julio de 2025) introdujo una nueva l\u00ednea de base comparativa que incorpora la discretizaci\u00f3n de Forward-Euler directamente en la arquitectura de CNN. Los hallazgos desaf\u00edan la narrativa \u00ablos enfoques neuronales son superiores\u00bb:<\/p>\n<ul>\n<li><strong>Los solucionadores num\u00e9ricos superan a los operadores neuronales por ~1 orden de magnitud en precisi\u00f3n<\/strong><\/li>\n<li><strong>DeepFDM utiliza 10\u201320 \u00d7 menos \u00e9pocas<\/strong> que FNOS<\/li>\n<li><strong>5\u201350\u00d7 Menos par\u00e1metros<\/strong> que los enfoques de operadores neuronales<\/li>\n<\/ul>\n<p>Esto sugiere que los enfoques num\u00e9ricos diferenciables h\u00edbridos representan un t\u00e9rmino medio pr\u00e1ctico entre los solucionadores basados en la f\u00edsica pura y los m\u00e9todos neuronales completamente basados en datos.<\/p>\n<hr>\n<h2>Comparaci\u00f3n: DeepXde vs. Pure PyTorch<\/h2>\n<p>Diferentes marcos de implementaci\u00f3n ofrecen distintas compensaciones. Aqu\u00ed hay una comparaci\u00f3n pr\u00e1ctica:<\/p>\n<table>\n<thead>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>deepxde<\/th>\n<th>PYTORCH PURA<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Definici\u00f3n PDE<\/strong><\/td>\n<td>Clases integradas (ODE, PDE, etc.)<\/td>\n<td>Computaci\u00f3n residual manual<\/td>\n<\/tr>\n<tr>\n<td><strong>C\u00e1lculo derivativo<\/strong><\/td>\n<td>abstra\u00eddo internamente<\/td>\n<td>Expl\u00edcito <code>torch.autograd.grad<\/code> o <code>torch.func<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Acceso a p\u00e9rdida individual<\/strong><\/td>\n<td>\u274c Sin acceso directo a p\u00e9rdidas por componente<\/td>\n<td>\u2705 Control total sobre cada t\u00e9rmino de p\u00e9rdida<\/td>\n<\/tr>\n<tr>\n<td><strong>L\u00edmites complejos<\/strong><\/td>\n<td>\u274c No implementado<\/td>\n<td>\u2705 Geometr\u00eda totalmente personalizable<\/td>\n<\/tr>\n<tr>\n<td><strong>Opci\u00f3n de tama\u00f1o de lote<\/strong><\/td>\n<td>\u274c Implementado parcialmente<\/td>\n<td>\u2705 Control de lote completo<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilidad de PyTorch<\/strong><\/td>\n<td>\u26a0\ufe0f Problemas con las \u00faltimas versiones<\/td>\n<td>\u2705 Siempre actual<\/td>\n<\/tr>\n<tr>\n<td><strong>Curva de aprendizaje<\/strong><\/td>\n<td>Inferior (la abstracci\u00f3n oculta la complejidad)<\/td>\n<td>m\u00e1s alto (transparencia total)<\/td>\n<\/tr>\n<tr>\n<td><strong>Entrenamiento personalizado<\/strong><\/td>\n<td>Control de devoluci\u00f3n de llamada limitado<\/td>\n<td>control completo<\/td>\n<\/tr>\n<tr>\n<td><strong>Problemas inversos<\/strong><\/td>\n<td>Compatible con par\u00e1metros entrenables<\/td>\n<td>Compatible con par\u00e1metros entrenables<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Recomendaci\u00f3n<\/strong>: use DeepXDE cuando necesite un prototipado r\u00e1pido con PDES est\u00e1ndar y acepte sus limitaciones conocidas. Para obtener una visi\u00f3n m\u00e1s amplia de las herramientas de simulaci\u00f3n y los flujos de trabajo de modelado, explore nuestro <a href=\"https:\/\/matforge.org\/category\/simulation-modeling-projects\/\" target=\"_blank\" rel=\"noopener\">simulaci\u00f3n y modelado Proyectos<\/a>. Use PyTorch puro cuando necesite transparencia total, ponderaci\u00f3n de p\u00e9rdida personalizada y compatibilidad con las \u00faltimas funciones de PyTorch, particularmente para sistemas de investigaci\u00f3n o de producci\u00f3n donde el control de p\u00e9rdida es importante. Use PyTorch puro cuando necesite transparencia total, ponderaci\u00f3n de p\u00e9rdida personalizada y compatibilidad con las \u00faltimas funciones de PyTorch, particularmente para sistemas de investigaci\u00f3n o de producci\u00f3n donde el control de p\u00e9rdida es importante.<\/p>\n<hr>\n<h2>Soluci\u00f3n de problemas de modos de falla comunes<\/h2>\n<p>Incluso con la implementaci\u00f3n correcta, los pins pueden fallar en converger. El punto de referencia de Pinnacle identifica varios patrones de falla y sus remedios.<\/p>\n<h3>1. Patolog\u00edas de gradiente<\/h3>\n<p><strong>S\u00edntoma<\/strong>: las salidas de red se saturan (los degradados se acercan a cero) o explotan durante el entrenamiento.<\/p>\n<p><strong>Causa<\/strong>: el panorama de p\u00e9rdidas tiene regiones con gradientes extremadamente pronunciados o planos, especialmente cuando las escalas de p\u00e9rdida de f\u00edsica y p\u00e9rdida de l\u00edmites no coinciden.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Aplicar la reponderaci\u00f3n de p\u00e9rdidas mediante LRA (An\u00e1lisis de reponderaci\u00f3n de p\u00e9rdidas) o m\u00e9todos basados en NTK<\/li>\n<li>Normalice cada t\u00e9rmino de p\u00e9rdida a magnitudes similares antes de la suma<\/li>\n<li>Usar recorte de degradado: <code>torch.nn.utils.clip_grad_norm_(net.parameters(), max_norm=1.0)<\/code><\/li>\n<\/ul>\n<h3>2. Sesgo espectral<\/h3>\n<p><strong>Symptom<\/strong>: la red aprende componentes de baja frecuencia de la soluci\u00f3n pero falla en frecuencias m\u00e1s altas.<\/p>\n<p><strong>causa<\/strong>: las redes neuronales con activaciones de tanh\/sigmoide sesgas naturalmente hacia las frecuencias m\u00e1s bajas durante el entrenamiento, un fen\u00f3meno bien documentado en la literatura de redes neuronales.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Utilice las incrustaciones de funciones de Fourier (codificaci\u00f3n posicional) para acelerar la convergencia en frecuencias m\u00e1s altas<\/li>\n<li>Aumente el ancho de la red (100 a 200 neuronas por capa en lugar de 50 a 100)<\/li>\n<li>Use activaciones sinusoidales en lugar de tanh para una mejor representaci\u00f3n de alta frecuencia<\/li>\n<\/ul>\n<h3>3. Desequilibrio de p\u00e9rdida<\/h3>\n<p><strong>S\u00edntoma<\/strong>: Un t\u00e9rmino de p\u00e9rdida domina durante el entrenamiento, lo que provoca una mala convergencia de otros componentes.<\/p>\n<p><strong>Causa<\/strong>: los residuos de f\u00edsica, las violaciones de l\u00edmites y las p\u00e9rdidas de datos operan en diferentes escalas.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Escala de pesos de p\u00e9rdida din\u00e1micamente durante el entrenamiento basado en magnitudes de p\u00e9rdida de corriente<\/li>\n<li>Comience con pesos m\u00e1s altos para las condiciones de contorno, cambie gradualmente hacia la p\u00e9rdida de f\u00edsica<\/li>\n<li>Supervise cada componente de p\u00e9rdida por separado y ajuste los pesos de forma interactiva<\/li>\n<\/ul>\n<h3>4. Sensibilidad del punto de colocaci\u00f3n<\/h3>\n<p><strong>S\u00edntoma<\/strong>: la p\u00e9rdida oscila o converge lentamente a pesar de los grandes recuentos de puntos.<\/p>\n<p><strong>causa<\/strong>: muy pocos puntos producen una restricci\u00f3n insuficiente; Demasiados puntos crean un panorama de optimizaci\u00f3n dif\u00edcil.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Comience con 8192 puntos de colocaci\u00f3n como l\u00ednea base (punto de saturaci\u00f3n de pin\u00e1culo)<\/li>\n<li>Utilice el refinamiento adaptativo (RAR) para las PDES dif\u00edciles<\/li>\n<li>Entrenamiento por lotes: puntos de muestra din\u00e1micamente durante el entrenamiento en lugar de precomputar todos los puntos<\/li>\n<\/ul>\n<h3>5. Problema inverso No identificabilidad<\/h3>\n<p><strong>S\u00edntoma<\/strong>: los par\u00e1metros estimados se desplazan o convergen a valores incorrectos.<\/p>\n<p><strong>causa<\/strong>: varias combinaciones de par\u00e1metros producen superficies de soluci\u00f3n similares (problemas de identificaci\u00f3n).<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Aumentar la cobertura de puntos de datos en todo el dominio<\/li>\n<li>Agregar regularizaci\u00f3n en estimaciones de par\u00e1metros<\/li>\n<li>Usar conocimientos previos para limitar los rangos de par\u00e1metros<\/li>\n<\/ul>\n<hr>\n<h2>Cu\u00e1ndo usar pins (y cu\u00e1ndo no)<\/h2>\n<p>Los resultados de referencia dejan en claro: los pins no son un reemplazo universal para los solucionadores tradicionales. Entender cuando son apropiados es esencial.<\/p>\n<h3>Los pins sobresalen en:<\/h3>\n<ul>\n<li><strong>Problemas inversos<\/strong> (estimaci\u00f3n de par\u00e1metros a partir de datos escasos)<\/li>\n<li><strong>Reg\u00edmenes de datos escasos<\/strong> donde los datos de observaci\u00f3n son limitados pero valiosos<\/li>\n<li><strong>Inferencia en tiempo real<\/strong> despu\u00e9s de la capacitaci\u00f3n (la red proporciona soluciones continuas y diferenciables)<\/li>\n<li><strong>Problemas de alta dimensi\u00f3n<\/strong> donde la generaci\u00f3n de malla se vuelve poco pr\u00e1ctica<\/li>\n<li><strong>Problemas inversos de acoplamiento<\/strong> (resolver y estimar simult\u00e1neamente)<\/li>\n<\/ul>\n<h3>Los solucionadores tradicionales siguen siendo superiores para:<\/h3>\n<ul>\n<li><strong>Problemas de avance est\u00e1ndar<\/strong> con par\u00e1metros conocidos (FEM\/FDM son m\u00e1s r\u00e1pidos y precisos)<\/li>\n<li><strong>PDES lineales<\/strong> donde existen algoritmos bien establecidos<\/li>\n<li><strong>Requisitos de alta precisi\u00f3n<\/strong> donde se necesita precisi\u00f3n de m\u00e1quina<\/li>\n<li><strong>Simulaciones industriales a gran escala<\/strong> donde domina la eficiencia de c\u00f3mputo<\/li>\n<\/ul>\n<p>La evaluaci\u00f3n honesta, respaldada por PDEbench, Pinnacle y DeepFDM Benchmarks, es que los PIN se complementan en lugar de reemplazar los m\u00e9todos num\u00e9ricos tradicionales. Soludores tradicionales como los cubiertos en nuestro <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">Documentaci\u00f3n de Fipy<\/a> Sigue siendo superior para el avance est\u00e1ndar Problemas. Los pins sobresalen cuando la escasez de datos o la incertidumbre de los par\u00e1metros hacen que los enfoques puramente num\u00e9ricos sean poco pr\u00e1cticos, pero agregan complejidad y costo computacional para los problemas donde los solucionadores establecidos funcionan bien.<\/p>\n<hr>\n<h2>Lista de verificaci\u00f3n pr\u00e1ctica<\/h2>\n<p>Antes de iniciar una implementaci\u00f3n de PINN, verifique:<\/p>\n<ol>\n<li>\u2705 <strong>Tipo de problema<\/strong>: \u00bfAdelante (Resolver PDE) o Inverso (Par\u00e1metros de Estimaci\u00f3n)?<\/li>\n<li>\u2705 <strong>Recuento de colocaci\u00f3n<\/strong>: Comience con 8192 puntos; Ajustar seg\u00fan las necesidades de precisi\u00f3n<\/li>\n<li>\u2705 <strong>Arquitectura de red<\/strong>: 4\u20136 capas ocultas, 50 a 100 neuronas por capa, activaci\u00f3n de Tanh<\/li>\n<li>\u2705 <strong>Estrategia de optimizaci\u00f3n<\/strong>: Adam (20k\u201380k \u00c9pocas) \u2192 L-BFGS (~30 \u00c9pocas)<\/li>\n<li>\u2705 <strong>Pesora de p\u00e9rdida<\/strong>: normalizar o escalar componentes para evitar el dominio<\/li>\n<li>\u2705 <strong>C\u00f3mputo derivativo<\/strong>: use <code>torch.func.jacrev<\/code> + <code>vmap<\/code> para salidas de valores vectoriales por lotes<\/li>\n<li>\u2705 <strong>Condiciones l\u00edmite<\/strong>: Codifique como restricciones duras si es posible (reduce la carga de entrenamiento)<\/li>\n<li>\u2705 <strong>Validaci\u00f3n<\/strong>: Comparar con soluciones anal\u00edticas conocidas o resultados de solucionador tradicional<\/li>\n<\/ol>\n<hr>\n<h2>Pr\u00f3ximos pasos<\/h2>\n<p>Los pins representan un enfoque genuinamente novedoso para la resoluci\u00f3n de PDE que cierra la brecha entre el aprendizaje autom\u00e1tico basado en datos y los m\u00e9todos num\u00e9ricos basados en la f\u00edsica. La implementaci\u00f3n de PyTorch que se muestra aqu\u00ed proporciona una base para abordar los problemas hacia adelante e inversos, pero la metodolog\u00eda contin\u00faa evolucionando.<\/p>\n<p><strong>Para una exploraci\u00f3n m\u00e1s profunda<\/strong>, considere:<\/p>\n<ul>\n<li>Estrategias de reponderaci\u00f3n de p\u00e9rdidas (basadas en LRA, NTK) para geometr\u00edas complejas<\/li>\n<li>Enfoques de descomposici\u00f3n de dominio (FBPINP) para problemas multiescala<\/li>\n<li>Modelos sustitutos de fidelidad m\u00faltiple que combinan simulaciones r\u00e1pidas de baja fidelidad con datos de f\u00edsica de alta fidelidad<\/li>\n<li>Aplicaciones de PINN a sistemas ODE en contextos biol\u00f3gicos y econ\u00f3micos<\/li>\n<\/ul>\n<p>Si est\u00e1 evaluando los pins para un problema espec\u00edfico, comience con la implementaci\u00f3n de la ecuaci\u00f3n de calor hacia adelante anterior, valide contra soluciones anal\u00edticas y luego extienda a su PDE objetivo. La literatura de referencia proporciona una gu\u00eda clara sobre cu\u00e1ndo este enfoque agrega valor en comparaci\u00f3n con cu\u00e1ndo los solucionadores tradicionales siguen siendo la mejor opci\u00f3n.<\/p>\n<h2>referencias<\/h2>\n<ul>\n<li>Raissi, M., Perdikaris, P., &amp; Karniadakis, G. E. (2019). Redes neuronales informadas en la f\u00edsica. <em>Revista de f\u00edsica computacional<\/em>, 378, 686\u2013707. https:\/\/www.sciencedirect.com\/science\/article\/abs\/pii\/s0021999118307125<\/li>\n<li>Takamoto, K., Paustenko, T., Mazurenko, S., &amp; No\u00e9, F. (2022). Pdebench: una completa suite de benchmarking para operadores neuronales. <em>Neurips 2022<\/em>. https:\/\/github.com\/pdebench\/pdebench<\/li>\n<li>Hao, Z., Zheng, M., &amp; Sznaier, M. (2023). Pinnacle: un punto de referencia completo para redes neuronales informadas en la f\u00edsica. <em>ArXiv:2306.08827<\/em>. https:\/\/arxiv.org\/html\/2306.08827v1<\/li>\n<li>Chatain, S., et al. (2025). DeepFDM: incrustaci\u00f3n de solucionadores num\u00e9ricos en arquitecturas neuronales. <em>ArXiv:2507.21269<\/em>. https:\/\/arxiv.org\/abs\/2507.21269<\/li>\n<li>Emert-Streib, F., et al. (2026). DeepXde para sistemas ODE: un tutorial pr\u00e1ctico. <em>Fronteras en Inteligencia Artificial<\/em>. https:\/\/www.frontiersin.org\/journals\/artificial-intelligence\/articles\/10.3389\/frai.2026.1717117\/full<\/li>\n<li>Lee, S. (2024). Tutoriales de redes neuronales informadas con PyTorch. https:\/\/lazyjobseeker.github.io\/en\/posts\/physics-informed-neural-network-tutorials\/<\/li>\n<li>Miller, D. (2024). Redes neuronales informadas en f\u00edsica utilizando PyTorch. https:\/\/modulebug.com\/2024\/12\/27\/physics-informed-neural-networks-pinns-using-pytorch\/<\/li>\n<\/ul>\n<hr>\n<p><em>Este art\u00edculo une la teor\u00eda y la implementaci\u00f3n de los investigadores que ingresan al espacio PINN. Para obtener orientaci\u00f3n pr\u00e1ctica sobre los m\u00e9todos num\u00e9ricos tradicionales, consulte nuestro <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n y ejemplos fipy<\/a> y <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introducci\u00f3n al modelado de materiales<\/a>.<\/em><\/p>\n<hr>\n<p><strong>\u00bfQu\u00e9 opinas?<\/strong> Los pins agregan sobrecargas computacionales en comparaci\u00f3n con los solucionadores tradicionales, pero abren posibilidades \u00fanicas de problemas inversos y de inferencia de datos escasos. Si est\u00e1 trabajando con datos de observaci\u00f3n limitados, considere las compensaciones cuidadosamente. Comparta su experiencia con las implementaciones de PINN en los comentarios.<\/p>\n<hr>\n<p><strong>\u00bfListo para experimentar?<\/strong> Comience con el c\u00f3digo de ecuaci\u00f3n de calor anterior, valide contra soluciones anal\u00edticas y luego extienda a su problema espec\u00edfico. La implementaci\u00f3n completa est\u00e1 disponible con fines educativos: adaptarlo, probarlo e iterar.<\/p>\n<hr>\n<p><a href=\"https:\/\/github.com\/pdebench\/PDEBench\" target=\"_blank\" rel=\"nofollow noopener\">Visite el repositorio de pdebench<\/a> para c\u00f3digo de referencia y conjuntos de datos.<\/p>\n<p><a href=\"https:\/\/github.com\/i207M\/PINNacle\" target=\"_blank\" rel=\"nofollow noopener\">Explore la evaluaci\u00f3n exhaustiva de Pinnacle<\/a> para las recomendaciones espec\u00edficas del m\u00e9todo.<\/p>\n","protected":false,"raw":"<p>Las redes neuronales informadas por la f\u00edsica (PINN) resuelven ecuaciones diferenciales parciales al incorporar ecuaciones de gobierno directamente en funciones de p\u00e9rdida de red neuronal, lo que permite una soluci\u00f3n simult\u00e1nea y una estimaci\u00f3n de par\u00e1metros sin generaci\u00f3n de malla. Combinan la diferenciaci\u00f3n autom\u00e1tica con la optimizaci\u00f3n basada en gradiente para aproximar las soluciones PDE y, cuando se combinan con las estrategias de entrenamiento adecuadas, pueden recuperar par\u00e1metros f\u00edsicos a partir de datos de observaci\u00f3n escasos.<\/p>\n<hr>\n<h2>Comida clave<\/h2>\n<ol>\n<li>Los pins incrustan los residuos de PDE como t\u00e9rminos de p\u00e9rdida de f\u00edsica, por lo que la red aprende a satisfacer simult\u00e1neamente las condiciones de contorno y las ecuaciones diferenciales.<\/li>\n<li><strong>La hibridaci\u00f3n del optimizador importa<\/strong>: Adam para el entrenamiento inicial (\u00e9pocas de 20K\u201380K) seguido de L-BFGS para el ajuste fino (~30 \u00e9pocas) es la secuencia recomendada emp\u00edricamente.<\/li>\n<li>Los pins sobresalen en problemas inversos (estimaci\u00f3n de par\u00e1metros) y reg\u00edmenes de datos dispersos, pero los puntos de referencia recientes muestran que siguen siendo inferiores a los solucionadores num\u00e9ricos tradicionales para problemas directos.<\/li>\n<li>El recuento de puntos de colocaci\u00f3n afecta cr\u00edticamente la convergencia: ~8192 puntos a menudo es suficiente saturaci\u00f3n; M\u00e1s all\u00e1 de eso, las ganancias son marginales a un costo de c\u00e1lculo significativo.<\/li>\n<li>Se requiere <code>torch.func.jacrev<\/code> + <code>torch.func.vmap<\/code> para el c\u00e1lculo jacobiano en los pins de salida m\u00faltiple: fallas puras <code>torch.autograd.grad<\/code> para los modelos con valores vectoriales por lotes.<\/li>\n<li>Las t\u00e9cnicas de equilibrio de p\u00e9rdida (reponderaci\u00f3n basada en LRA, NTK) y la descomposici\u00f3n de dominio (FBPINP) abordan la tasa de falla de la tarea de ~60 % de los pines de vainilla reveladas por el punto de referencia de Pinnacle.<\/li>\n<\/ol>\n<hr>\n<h2>\u00bfQu\u00e9 son las redes neuronales informadas en la f\u00edsica?<\/h2>\n<p>Los pinns fueron introducidos por Raissi, Perdikaris y Karniadakis en 2019 como un enfoque sin malla para resolver PDE utilizando redes neuronales profundas. Esto representa un cambio significativo de los m\u00e9todos tradicionales basados en la malla como los enfoques de elementos finitos y diferencias finitas cubiertos en nuestra <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introducci\u00f3n al modelado de materiales<\/a>. La idea central es elegante pero pr\u00e1cticamente sutil: en lugar de discretizar el dominio en una malla (como en los m\u00e9todos de diferencias finitas o de elementos finitos), se define la soluci\u00f3n como una red neuronal continua y penaliza las violaciones de la f\u00edsica gobernante durante el entrenamiento.<\/p>\n<p>Considere una PDE gen\u00e9rica:<\/p>\n<pre><code>\ud835\udca9(u(x,t), x, t) = 0,   (x,t) \u2208 \u03a9\n<\/code><\/pre>\n<p>donde <code>\ud835\udca9<\/code> es un operador diferencial, <code>u(x,t)<\/code> es la soluci\u00f3n desconocida y <code>\u03a9<\/code> es el dominio espacio-temporal. Un PINN parametriza <code>u<\/code> como una red neuronal <code>u(x,t; \u03b8)<\/code> con pesos <code>\u03b8<\/code>. La funci\u00f3n de p\u00e9rdida combina tres componentes:<\/p>\n<pre><code>Loss(\u03b8) = LossPhysics + LossBoundary + LossData\n<\/code><\/pre>\n<ul>\n<li><strong>Lossphysics<\/strong>: El residuo de PDE <code>\ud835\udca9(u(x,t; \u03b8))<\/code> evaluado en los puntos de colocaci\u00f3n muestreados en todo el dominio.<\/li>\n<li><strong>LossBoundary<\/strong>: Violaci\u00f3n de los l\u00edmites y las condiciones iniciales.<\/li>\n<li><strong>LossData<\/strong>: discrepancia (opcional) entre los valores predichos y los datos de observaci\u00f3n escasos.<\/li>\n<\/ul>\n<p>La red est\u00e1 capacitada para minimizar <code>Loss(\u03b8)<\/code> usando descenso de gradiente, y la red resultante proporciona una aproximaci\u00f3n continua y diferenciable de la soluci\u00f3n en todo el dominio.<\/p>\n<hr>\n<h2>Generaci\u00f3n de puntos de colocaci\u00f3n<\/h2>\n<p>La elecci\u00f3n y distribuci\u00f3n de los puntos de colocaci\u00f3n es posiblemente el hiperpar\u00e1metro m\u00e1s importante en el entrenamiento de Pinn. Los puntos de colocaci\u00f3n son las ubicaciones donde se eval\u00faa el residuo de PDE para calcular la p\u00e9rdida de la f\u00edsica.<\/p>\n<h3>Estrategia<\/h3>\n<p>El enfoque est\u00e1ndar muestra puntos de manera uniforme en todo el dominio. Para un dominio espacial 1D <code>[x_min, x_max]<\/code> y un dominio de tiempo <code>[t_min, t_max]<\/code>, genera <code>N_spatial<\/code> puntos espaciales y <code>N_temporal<\/code> puntos temporales, luego forma una cuadr\u00edcula de <code>N_total = N_spatial \u00d7 N_temporal<\/code> puntos de colocaci\u00f3n.<\/p>\n<pre><code class=\"language-python\">import torch\n\ndef sample_collocation_points(N_spatial, N_temporal, x_range, t_range):\n    \"\"\"Sample uniform collocation points for a 1D spatial-temporal domain.\n    \n    Args:\n        N_spatial: Number of spatial points\n        N_temporal: Number of temporal points  \n        x_range: Tuple (x_min, x_max)\n        t_range: Tuple (t_min, t_max)\n    \n    Returns:\n        Points tensor of shape (N_total, 2)\n    \"\"\"\n    x = torch.linspace(x_range[0], x_range[1], N_spatial)\n    t = torch.linspace(t_range[0], t_range[1], N_temporal)\n    \n    # Create meshgrid\n    X, T = torch.meshgrid(x, t, indexing='ij')\n    \n    # Flatten and stack\n    points = torch.stack([X.flatten(), T.flatten()], dim=1)\n    \n    return points\n\n# Example: 200 spatial points \u00d7 200 temporal points = 40,000 collocation points\ncollocation_points = sample_collocation_points(200, 200, [0, 1], [0, 0.5])\n<\/code><\/pre>\n<h3>Sensibilidad al conteo de puntos<\/h3>\n<p>Los experimentos de referencia de Pinnacle demuestran que el tama\u00f1o de lote (recuento de puntos de colocaci\u00f3n) afecta dr\u00e1sticamente la convergencia. El estudio de escalado progresivo encontr\u00f3:<\/p>\n<ul>\n<li><strong>512 puntos<\/strong>: converge pero conserva un error relativamente alto<\/li>\n<li><strong>8192 puntos<\/strong>: a menudo saturaci\u00f3n suficiente para una precisi\u00f3n moderada<\/li>\n<li><strong>32768 puntos<\/strong>: mejora de error marginal a un costo de c\u00e1lculo significativo<\/li>\n<\/ul>\n<p>Para la mayor\u00eda de los fines pr\u00e1cticos, 8192 puntos de colocaci\u00f3n proporcionan una precisi\u00f3n adecuada sin sobrecarga computacional excesiva. La idea clave es que m\u00e1s puntos no siempre significan una mejor convergencia: el panorama de p\u00e9rdidas puede volverse m\u00e1s complejo con el sobremuestreo y los rendimientos decrecientes se establecen r\u00e1pidamente.<\/p>\n<h3>Muestreo adaptativo (avanzado)<\/h3>\n<p>Para PDE desafiantes con gradientes o discontinuidades localizadas, el refinamiento adaptativo basado en residuos (RAR) puede volver a muestrear din\u00e1micamente los puntos de colocaci\u00f3n para enfocarse en regiones con residuos de PDE altos. Este enfoque aborda uno de los modos de falla clave del muestreo uniforme en las tareas de geometr\u00eda compleja de Pinnacle.<\/p>\n<hr>\n<h2>Problema hacia adelante: Resolviendo la ecuaci\u00f3n de calor<\/h2>\n<p>El problema de reenv\u00edo pregunta: Dada una PDE y las condiciones iniciales\/l\u00edmites, busque la soluci\u00f3n. Resolveremos la ecuaci\u00f3n de calor 1D:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1 \u2202\u00b2u\/\u2202x\u00b2,   x \u2208 [0, 1], t \u2208 [0, T]\n<\/code><\/pre>\n<p>con condici\u00f3n inicial <code>u(x, 0) = f(x)<\/code> y condiciones de contorno <code>u(0, t) = u(L, t) = 0<\/code>.<\/p>\n<h3>arquitectura de red<\/h3>\n<pre><code class=\"language-python\">import torch\nimport torch.nn as nn\n\nclass PINN(nn.Module):\n    \"\"\"Neural network that maps (x, t) \u2192 u(x, t) for a PINN.\"\"\"\n    \n    def __init__(self, input_dim=2, output_dim=1, hidden_dims=[64, 64, 64, 64]):\n        super().__init__()\n        self.layers = nn.ModuleList()\n        \n        # Input layer\n        self.layers.append(nn.Linear(input_dim, hidden_dims[0]))\n        \n        # Hidden layers\n        for i in range(len(hidden_dims) - 1):\n            self.layers.append(nn.Linear(hidden_dims[i], hidden_dims[i+1]))\n        \n        # Output layer\n        self.layers.append(nn.Linear(hidden_dims[-1], output_dim))\n        \n        # Initialize weights (tanh activation)\n        self.activation = nn.Tanh()\n        \n        # Weight initialization: Xavier uniform for linear layers\n        for layer in self.layers:\n            if isinstance(layer, nn.Linear):\n                nn.init.xavier_uniform_(layer.weight)\n                nn.init.zeros_(layer.bias)\n    \n    def forward(self, x):\n        \"\"\"Forward pass: (x, t) \u2192 u(x, t).\"\"\"\n        h = self.layers[0](x)\n        h = self.activation(h)\n        for layer in self.layers[1:-1]:\n            h = layer(h)\n            h = self.activation(h)\n        return self.layers[-1](h)\n<\/code><\/pre>\n<h3>Inform\u00e1tica derivadas con Autograd<\/h3>\n<p>La innovaci\u00f3n cr\u00edtica de los pins es el c\u00e1lculo de derivados de la salida de la red con respecto a sus entradas utilizando la diferenciaci\u00f3n autom\u00e1tica. Para la ecuaci\u00f3n de calor, necesitamos:<\/p>\n<pre><code class=\"language-python\">def compute_pde_residual(net, x_col, t_col, alpha):\n    \"\"\"Compute the PDE residual for the heat equation.\n    \n    The physics loss is the squared L2 norm of the PDE residual evaluated\n    at the collocation points.\n    \"\"\"\n    x_col.requires_grad_(True)\n    t_col.requires_grad_(True)\n    \n    # Stack points into (N, 2)\n    pts = torch.stack([x_col, t_col], dim=1)\n    pts.requires_grad_(True)\n    \n    # Forward pass\n    u = net(pts)\n    \n    # Compute derivatives via autograd\n    u_t = torch.autograd.grad(u.sum(), pts, create_graph=True)[0][:, 1:2]  # \u2202u\/\u2202t\n    u_x = torch.autograd.grad(u.sum(), pts, create_graph=True)[0][:, 0:1]  # \u2202u\/\u2202x\n    \n    # Need second derivative: \u2202\u00b2u\/\u2202x\u00b2\n    u_xx = torch.autograd.grad(u_x.sum(), pts, create_graph=True)[0][:, 0:1]\n    \n    # PDE residual: \u2202u\/\u2202t - \u03b1 \u2202\u00b2u\/\u2202x\u00b2 = 0\n    residual = u_t - alpha * u_xx\n    \n    return residual\n<\/code><\/pre>\n<p><strong>Nota importante<\/strong>: el enfoque <code>torch.autograd.grad<\/code> anterior funciona para redes de salida \u00fanica, pero <strong> falla para modelos de valores de vector por lotes<\/strong>. Como se demostr\u00f3 en los tutoriales recientes de PyTorch, se requiere <code>torch.func.jacrev<\/code> combinado con <code>torch.func.vmap<\/code> para un c\u00e1lculo jacobiano adecuado cuando la red produce salidas con valores vectoriales sobre entradas por lotes. Consulte la secci\u00f3n de implementaci\u00f3n avanzada a continuaci\u00f3n.<\/p>\n<h3>bucle de entrenamiento<\/h3>\n<pre><code class=\"language-python\">def train_pin_net(net, collocation_points, boundary_points, \n                initial_points, alpha, N_epochs=50000):\n    \"\"\"Train a PINN for the heat equation forward problem.\"\"\"\n    \n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(N_epochs):\n        # Collect collocation points (physics loss)\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Boundary conditions (x=0 and x=1)\n        x_bc = torch.tensor([[0.0], [1.0]]).repeat(1, len(t_bc))\n        t_bc = boundary_points\n        u_bc = net(torch.cat([x_bc, t_bc], dim=1))\n        # Dirichlet BC: u = 0 at boundaries\n        bc_loss = torch.mean(u_bc ** 2)\n        \n        # Initial condition (t=0)\n        x_ic = initial_points[:, 0]\n        t_ic = torch.zeros_like(initial_points[:, 0])\n        u_ic = net(torch.cat([x_ic, t_ic], dim=1))\n        # Initial condition: u(x,0) = f(x)\n        f_exact = torch.sin(torch.pi * x_ic)\n        ic_loss = torch.mean((u_ic - f_exact) ** 2)\n        \n        # Total loss\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        if epoch % 1000 == 0:\n            print(f\"Epoch {epoch}: loss={loss.item():.6f}, \"\n                  f\"physics={physics_loss.item():.6f}, \"\n                  f\"bc={bc_loss.item():.6f}, \"\n                  f\"ic={ic_loss.item():.6f}\")\n<\/code><\/pre>\n<hr>\n<h2>Problema inverso: estimaci\u00f3n de par\u00e1metros<\/h2>\n<p>El problema inverso pregunta: Dados los escasos datos de observaci\u00f3n, identifique par\u00e1metros desconocidos en las ecuaciones de gobierno. Aqu\u00ed es donde los pines realmente brillan: los solucionadores tradicionales requieren que especifique todos los par\u00e1metros por adelantado, mientras que los pines pueden <strong>aprender<\/strong> a partir de los datos simult\u00e1neamente.<\/p>\n<h3>Configuraci\u00f3n del problema<\/h3>\n<p>Considere la misma ecuaci\u00f3n de calor pero con un <strong>coeficiente de difusi\u00f3n desconocido<\/strong> <code>\u03b1<\/code>:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1(\u03b8) \u2202\u00b2u\/\u2202x\u00b2\n<\/code><\/pre>\n<p>donde <code>\u03b1(\u03b8)<\/code> se parametriza como escalar entrenable dentro de la red.<\/p>\n<h3>Red modificada para problemas inversos<\/h3>\n<pre><code class=\"language-python\">class PINN_Inverse(nn.Module):\n    \"\"\"PINN for inverse problems: learns PDE parameters from data.\"\"\"\n    \n    def __init__(self, input_dim=2, hidden_dims=[64, 64, 64, 64]):\n        super().__init__()\n        self.net = PINN(input_dim, 1, hidden_dims)\n        \n        # Trainable parameter: diffusion coefficient \u03b1\n        self.alpha = nn.Parameter(torch.tensor(1.0))\n    \n    def forward(self, x):\n        return self.net(x)\n    \n    def compute_inverse_residual(self, pts, data_points, data_values):\n        \"\"\"Compute combined physics + data loss with trainable \u03b1.\"\"\"\n        \n        # PDE residual (same as forward problem)\n        x_col, t_col = pts[:, 0], pts[:, 1]\n        residual = self._compute_residual(x_col, t_col, self.alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Data loss at sparse observation points\n        data_x = data_points[:, 0]\n        data_t = data_points[:, 1]\n        u_pred = self.net(torch.cat([data_x, data_t], dim=1))\n        data_loss = torch.mean((u_pred - data_values) ** 2)\n        \n        return physics_loss, data_loss, self.alpha.item()\n<\/code><\/pre>\n<h3>Entrenamiento con estimaci\u00f3n de par\u00e1metros<\/h3>\n<pre><code class=\"language-python\">def train_inverse_pin(net, collocation_points, data_points, data_values,\n                      N_epochs=50000):\n    \"\"\"Train PINN for inverse problem (parameter estimation).\"\"\"\n    \n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(N_epochs):\n        # Compute losses\n        physics_loss, data_loss, alpha_est = net.compute_inverse_residual(\n            collocation_points, data_points, data_values\n        )\n        \n        # Weight data loss higher during parameter estimation\n        loss = physics_loss + 10 * data_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        # Track parameter estimate\n        if epoch % 5000 == 0:\n            print(f\"Epoch {epoch}: \u03b1 \u2248 {alpha_est:.4f}\")\n    \n    # Return estimated parameter\n    return net.alpha.item()\n<\/code><\/pre>\n<p>El problema inverso demuestra la ventaja \u00fanica de los pins: en lugar de resolver una PDE con par\u00e1metros conocidos, la red descubre simult\u00e1neamente la soluci\u00f3n e identifica las constantes f\u00edsicas que gobiernan. Esto es particularmente valioso en entornos experimentales donde los par\u00e1metros son dif\u00edciles o costosos de medir directamente.<\/p>\n<hr>\n<h2>Implementaci\u00f3n avanzada: Torch.func para salidas con valores vectoriales<\/h2>\n<p>El enfoque est\u00e1ndar <code>torch.autograd.grad<\/code> que se muestra arriba funciona para redes simples de salida \u00fanica. Sin embargo, cuando se introducen las entradas por lotes para obtener eficiencia, la red produce salidas con valores vectoriales, y <code>torch.autograd.grad<\/code> solo falla.<\/p>\n<p>El enfoque correcto utiliza <code>torch.func.jacrev<\/code> combinado con <code>torch.func.vmap<\/code>:<\/p>\n<pre><code class=\"language-python\">import torch.func as func\n\ndef _single_point_residual(net, pt, alpha):\n    \"\"\"Compute PDE residual for a single (x, t) point.\n    \n    Args:\n        net: PINN network\n        pt: Tensor of shape (2,) \u2014 [x, t]\n        alpha: Diffusion coefficient\n    \n    Returns:\n        PDE residual as scalar\n    \"\"\"\n    pt = pt.unsqueeze(0)  # (1, 2) for network input\n    u = net(pt)\n    \n    # Compute derivatives using torch.func.jacrev\n    u_x = torch.autograd.grad(u.sum(), pt, create_graph=True)[0]\n    \n    # For second derivative, we need gradient of gradient\n    u_xx = torch.autograd.grad(u_x.sum(), pt, create_graph=True)[0]\n    \n    # PDE residual\n    return u_x[:, 1] - alpha * u_xx[:, 0]  # \u2202u\/\u2202t - \u03b1 \u2202\u00b2u\/\u2202x\u00b2\n\n# Vectorize over batch\njac_fn = func.jacrev(_single_point_residual)\n\ndef compute_batch_residual(net, batch_points, alpha):\n    \"\"\"Compute residuals for a batch of points using jacrev + vmap.\n    \n    Args:\n        batch_points: Tensor of shape (N, 2)\n        alpha: Diffusion coefficient\n    \n    Returns:\n        Residuals of shape (N,)\n    \"\"\"\n    return func.vmap(jac_fn, in_dims=0, out_dims=0)(\n        net, batch_points, alpha\n    )\n<\/code><\/pre>\n<p>Este enfoque no se menciona en la mayor\u00eda de los tutoriales de PINN, pero es cr\u00edtico para el c\u00e1lculo de gradiente adecuado cuando se entrena con lotes grandes. Sin \u00e9l, puede encontrar fallas silenciosas o gradientes incorrectos.<\/p>\n<hr>\n<h2>Estrategia del Optimizador: ADAM \u2192 L-BFGS Hibridaci\u00f3n<\/h2>\n<p>La elecci\u00f3n del optimizador afecta cr\u00edticamente a la convergencia de PINN. Los estudios emp\u00edricos y los resultados de referencia recomiendan constantemente un enfoque de dos fases:<\/p>\n<h3>Fase 1: Entrenamiento de Adam<\/h3>\n<pre><code>Epochs: 20,000\u201380,000\nLearning rate: 1e-3 to 1e-4\nPurpose: Global exploration, rough convergence\n<\/code><\/pre>\n<p>El impulso de Adam ayuda a la red a escapar de las malas regiones iniciales del panorama de p\u00e9rdidas. Sin embargo, solo Adam converge a menudo lentamente y puede detenerse en una meseta de p\u00e9rdida sub\u00f3ptima.<\/p>\n<h3>Fase 2: Refinamiento L-BFGS<\/h3>\n<pre><code>Epochs: ~30\u201350\nPurpose: Fine-tuning, reaching final accuracy\n<\/code><\/pre>\n<p>L-BFGS (Memoria limitada Broyden-Fletcher-Rawstorff) realiza b\u00fasquedas en l\u00ednea y actualizaciones cuasi-Newton, refinando r\u00e1pidamente la soluci\u00f3n una vez que Adam ha acercado la red al \u00f3ptimo.<\/p>\n<h3>Implementaci\u00f3n<\/h3>\n<pre><code class=\"language-python\">def train_with_adam_lbfgs(net, collocation_points, data_points,\n                          boundary_points, initial_points, alpha,\n                          adam_epochs=50000, lbfgs_epochs=30):\n    \"\"\"Train PINN with Adam \u2192 L-BFGS optimizer hybridization.\"\"\"\n    \n    # Phase 1: Adam\n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n    \n    for epoch in range(adam_epochs):\n        # Compute losses (same as forward problem)\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        \n        # Boundary and initial losses\n        # ... (same as before)\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n    \n    print(f\"After Adam: loss = {loss.item():.6f}\")\n    \n    # Phase 2: L-BFGS\n    # Reset parameters to final Adam state\n    optimizer_lbfgs = torch.optim.LBFGS(net.parameters(), lr=0.1, max_iter=5)\n    \n    def closure():\n        optimizer_lbfgs.zero_grad()\n        # Recompute losses\n        x_col, t_col = collocation_points\n        residual = compute_pde_residual(net, x_col, t_col, alpha)\n        physics_loss = torch.mean(residual ** 2)\n        # ... boundary and initial losses\n        loss = physics_loss + 100 * bc_loss + 100 * ic_loss\n        loss.backward()\n        return loss\n    \n    for _ in range(lbfgs_epochs):\n        loss = optimizer_lbfgs.step(closure)\n        print(f\"L-BFGS step: loss = {loss.item():.6f}\")\n    \n    return net\n<\/code><\/pre>\n<p><strong>Por qu\u00e9 esto funciona<\/strong>: L-BFG solo a menudo difiere de la inicializaci\u00f3n aleatoria porque su b\u00fasqueda de l\u00ednea falla cuando el gradiente inicial apunta en la direcci\u00f3n equivocada. Adam proporciona la exploraci\u00f3n global necesaria para llegar a una buena cuenca de atracci\u00f3n, despu\u00e9s de lo cual L-BFGS converge r\u00e1pidamente con gran precisi\u00f3n. Esta secuencia no se menciona en la mayor\u00eda de los tutoriales, pero es fundamental para la convergencia de PINN confiable.<\/p>\n<hr>\n<h2>Contexto de referencia: \u00bfQu\u00e9 muestran los estudios recientes?<\/h2>\n<p>Comprender d\u00f3nde se encuentran los pins en relaci\u00f3n con los solucionadores tradicionales requiere examinar los estudios de referencia recientes. Este contexto es crucial para los lectores que quieren entender c\u00f3mo se comparan los enfoques neuronales con los m\u00e9todos establecidos, un tema central para nuestra cobertura de <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\" target=\"_blank\" rel=\"noopener\">Qu\u00e9 significa realmente la simulaci\u00f3n cient\u00edfica<\/a> en la investigaci\u00f3n moderna. Tres esfuerzos principales proporcionan evidencia cuantitativa concreta:<\/p>\n<h3>Pdebench: Benchmark de operadores neuronales<\/h3>\n<p>Pdebench (Takamoto et al., Neurips 2022) compara PINNs, operadores neuronales de Fourier (FNOS) y arquitecturas U-NET en m\u00faltiples categor\u00edas de PDE. Hallazgo clave: los FNOS requieren datos de entrenamiento pregenerados y aprenden a mapear entre colectores de soluci\u00f3n completos, mientras que los pins resuelven problemas por instancia sin ning\u00fan entrenamiento previo. Esta distinci\u00f3n hace que los pines sean fundamentalmente diferentes de los operadores neuronales: pueden abordar problemas inversos y adaptarse a las condiciones de contorno invisibles, pero entrenan desde cero para cada nueva instancia.<\/p>\n<p>Las visualizaciones de PDEBENCH demuestran la diversidad de problemas que los pines pueden abordar: sistemas de reacci\u00f3n de difusi\u00f3n, ecuaciones de aguas poco profundas, flujos de Navier-Stokes, que ilustran tanto la flexibilidad como la amplitud de la aplicaci\u00f3n.<\/p>\n<h3>Pin\u00e1culo: Evaluaci\u00f3n sistem\u00e1tica del m\u00e9todo<\/h3>\n<p>El punto de referencia pin\u00e1culo (Hao et al., 2023) proporciona la evaluaci\u00f3n m\u00e1s completa de las variantes de PINN en 22 casos de prueba. El hallazgo cr\u00edtico:<\/p>\n<blockquote><p><strong>Los pins de vainilla resuelven solo 9 de 22 tareas (\u226440 %)<\/strong> con un umbral de precisi\u00f3n razonable.<\/p><\/blockquote>\n<p>Recomendaciones espec\u00edficas del m\u00e9todo de Pinnacle:<\/p>\n<ul>\n<li><strong>PINN-LRA<\/strong> (an\u00e1lisis de reponderaci\u00f3n de p\u00e9rdidas): lo mejor para geometr\u00edas complejas<\/li>\n<li><strong>PINN-NTK<\/strong> (kernel tangente neural): Eficaz para problemas multiescala<\/li>\n<li><strong>FBPINP<\/strong> (PINN equilibrado fundamental): La descomposici\u00f3n del dominio sobresale en problemas multiescala<\/li>\n<li><strong>HP-VPINP \/ GPINP<\/strong>: las formulaciones variacionales sobresalen en problemas inversos<\/li>\n<\/ul>\n<p>Estos resultados sugieren que los pines sin procesar a menudo luchan con las PDE desafiantes, pero las variantes de m\u00e9todos objetivo abordan modos de falla espec\u00edficos.<\/p>\n<h3>DeepFDM 2025: Soludores H\u00edbridos Diferenciables-num\u00e9ricos<\/h3>\n<p>El marco DeepFDM de Chatain et al. (julio de 2025) introdujo una nueva l\u00ednea de base comparativa que incorpora la discretizaci\u00f3n de Forward-Euler directamente en la arquitectura de CNN. Los hallazgos desaf\u00edan la narrativa \"los enfoques neuronales son superiores\":<\/p>\n<ul>\n<li><strong>Los solucionadores num\u00e9ricos superan a los operadores neuronales por ~1 orden de magnitud en precisi\u00f3n<\/strong><\/li>\n<li><strong>DeepFDM utiliza 10\u201320 \u00d7 menos \u00e9pocas<\/strong> que FNOS<\/li>\n<li><strong>5\u201350\u00d7 Menos par\u00e1metros<\/strong> que los enfoques de operadores neuronales<\/li>\n<\/ul>\n<p>Esto sugiere que los enfoques num\u00e9ricos diferenciables h\u00edbridos representan un t\u00e9rmino medio pr\u00e1ctico entre los solucionadores basados en la f\u00edsica pura y los m\u00e9todos neuronales completamente basados en datos.<\/p>\n<hr>\n<h2>Comparaci\u00f3n: DeepXde vs. Pure PyTorch<\/h2>\n<p>Diferentes marcos de implementaci\u00f3n ofrecen distintas compensaciones. Aqu\u00ed hay una comparaci\u00f3n pr\u00e1ctica:<\/p>\n<table>\n<thead>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>deepxde<\/th>\n<th>PYTORCH PURA<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Definici\u00f3n PDE<\/strong><\/td>\n<td>Clases integradas (ODE, PDE, etc.)<\/td>\n<td>Computaci\u00f3n residual manual<\/td>\n<\/tr>\n<tr>\n<td><strong>C\u00e1lculo derivativo<\/strong><\/td>\n<td>abstra\u00eddo internamente<\/td>\n<td>Expl\u00edcito <code>torch.autograd.grad<\/code> o <code>torch.func<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Acceso a p\u00e9rdida individual<\/strong><\/td>\n<td>\u274c Sin acceso directo a p\u00e9rdidas por componente<\/td>\n<td>\u2705 Control total sobre cada t\u00e9rmino de p\u00e9rdida<\/td>\n<\/tr>\n<tr>\n<td><strong>L\u00edmites complejos<\/strong><\/td>\n<td>\u274c No implementado<\/td>\n<td>\u2705 Geometr\u00eda totalmente personalizable<\/td>\n<\/tr>\n<tr>\n<td><strong>Opci\u00f3n de tama\u00f1o de lote<\/strong><\/td>\n<td>\u274c Implementado parcialmente<\/td>\n<td>\u2705 Control de lote completo<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilidad de PyTorch<\/strong><\/td>\n<td>\u26a0\ufe0f Problemas con las \u00faltimas versiones<\/td>\n<td>\u2705 Siempre actual<\/td>\n<\/tr>\n<tr>\n<td><strong>Curva de aprendizaje<\/strong><\/td>\n<td>Inferior (la abstracci\u00f3n oculta la complejidad)<\/td>\n<td>m\u00e1s alto (transparencia total)<\/td>\n<\/tr>\n<tr>\n<td><strong>Entrenamiento personalizado<\/strong><\/td>\n<td>Control de devoluci\u00f3n de llamada limitado<\/td>\n<td>control completo<\/td>\n<\/tr>\n<tr>\n<td><strong>Problemas inversos<\/strong><\/td>\n<td>Compatible con par\u00e1metros entrenables<\/td>\n<td>Compatible con par\u00e1metros entrenables<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Recomendaci\u00f3n<\/strong>: use DeepXDE cuando necesite un prototipado r\u00e1pido con PDES est\u00e1ndar y acepte sus limitaciones conocidas. Para obtener una visi\u00f3n m\u00e1s amplia de las herramientas de simulaci\u00f3n y los flujos de trabajo de modelado, explore nuestro <a href=\"https:\/\/matforge.org\/category\/simulation-modeling-projects\/\" target=\"_blank\" rel=\"noopener\">simulaci\u00f3n y modelado Proyectos<\/a>. Use PyTorch puro cuando necesite transparencia total, ponderaci\u00f3n de p\u00e9rdida personalizada y compatibilidad con las \u00faltimas funciones de PyTorch, particularmente para sistemas de investigaci\u00f3n o de producci\u00f3n donde el control de p\u00e9rdida es importante. Use PyTorch puro cuando necesite transparencia total, ponderaci\u00f3n de p\u00e9rdida personalizada y compatibilidad con las \u00faltimas funciones de PyTorch, particularmente para sistemas de investigaci\u00f3n o de producci\u00f3n donde el control de p\u00e9rdida es importante.<\/p>\n<hr>\n<h2>Soluci\u00f3n de problemas de modos de falla comunes<\/h2>\n<p>Incluso con la implementaci\u00f3n correcta, los pins pueden fallar en converger. El punto de referencia de Pinnacle identifica varios patrones de falla y sus remedios.<\/p>\n<h3>1. Patolog\u00edas de gradiente<\/h3>\n<p><strong>S\u00edntoma<\/strong>: las salidas de red se saturan (los degradados se acercan a cero) o explotan durante el entrenamiento.<\/p>\n<p><strong>Causa<\/strong>: el panorama de p\u00e9rdidas tiene regiones con gradientes extremadamente pronunciados o planos, especialmente cuando las escalas de p\u00e9rdida de f\u00edsica y p\u00e9rdida de l\u00edmites no coinciden.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Aplicar la reponderaci\u00f3n de p\u00e9rdidas mediante LRA (An\u00e1lisis de reponderaci\u00f3n de p\u00e9rdidas) o m\u00e9todos basados en NTK<\/li>\n<li>Normalice cada t\u00e9rmino de p\u00e9rdida a magnitudes similares antes de la suma<\/li>\n<li>Usar recorte de degradado: <code>torch.nn.utils.clip_grad_norm_(net.parameters(), max_norm=1.0)<\/code><\/li>\n<\/ul>\n<h3>2. Sesgo espectral<\/h3>\n<p><strong>Symptom<\/strong>: la red aprende componentes de baja frecuencia de la soluci\u00f3n pero falla en frecuencias m\u00e1s altas.<\/p>\n<p><strong>causa<\/strong>: las redes neuronales con activaciones de tanh\/sigmoide sesgas naturalmente hacia las frecuencias m\u00e1s bajas durante el entrenamiento, un fen\u00f3meno bien documentado en la literatura de redes neuronales.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Utilice las incrustaciones de funciones de Fourier (codificaci\u00f3n posicional) para acelerar la convergencia en frecuencias m\u00e1s altas<\/li>\n<li>Aumente el ancho de la red (100 a 200 neuronas por capa en lugar de 50 a 100)<\/li>\n<li>Use activaciones sinusoidales en lugar de tanh para una mejor representaci\u00f3n de alta frecuencia<\/li>\n<\/ul>\n<h3>3. Desequilibrio de p\u00e9rdida<\/h3>\n<p><strong>S\u00edntoma<\/strong>: Un t\u00e9rmino de p\u00e9rdida domina durante el entrenamiento, lo que provoca una mala convergencia de otros componentes.<\/p>\n<p><strong>Causa<\/strong>: los residuos de f\u00edsica, las violaciones de l\u00edmites y las p\u00e9rdidas de datos operan en diferentes escalas.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Escala de pesos de p\u00e9rdida din\u00e1micamente durante el entrenamiento basado en magnitudes de p\u00e9rdida de corriente<\/li>\n<li>Comience con pesos m\u00e1s altos para las condiciones de contorno, cambie gradualmente hacia la p\u00e9rdida de f\u00edsica<\/li>\n<li>Supervise cada componente de p\u00e9rdida por separado y ajuste los pesos de forma interactiva<\/li>\n<\/ul>\n<h3>4. Sensibilidad del punto de colocaci\u00f3n<\/h3>\n<p><strong>S\u00edntoma<\/strong>: la p\u00e9rdida oscila o converge lentamente a pesar de los grandes recuentos de puntos.<\/p>\n<p><strong>causa<\/strong>: muy pocos puntos producen una restricci\u00f3n insuficiente; Demasiados puntos crean un panorama de optimizaci\u00f3n dif\u00edcil.<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Comience con 8192 puntos de colocaci\u00f3n como l\u00ednea base (punto de saturaci\u00f3n de pin\u00e1culo)<\/li>\n<li>Utilice el refinamiento adaptativo (RAR) para las PDES dif\u00edciles<\/li>\n<li>Entrenamiento por lotes: puntos de muestra din\u00e1micamente durante el entrenamiento en lugar de precomputar todos los puntos<\/li>\n<\/ul>\n<h3>5. Problema inverso No identificabilidad<\/h3>\n<p><strong>S\u00edntoma<\/strong>: los par\u00e1metros estimados se desplazan o convergen a valores incorrectos.<\/p>\n<p><strong>causa<\/strong>: varias combinaciones de par\u00e1metros producen superficies de soluci\u00f3n similares (problemas de identificaci\u00f3n).<\/p>\n<p><strong>Remedio<\/strong>:<\/p>\n<ul>\n<li>Aumentar la cobertura de puntos de datos en todo el dominio<\/li>\n<li>Agregar regularizaci\u00f3n en estimaciones de par\u00e1metros<\/li>\n<li>Usar conocimientos previos para limitar los rangos de par\u00e1metros<\/li>\n<\/ul>\n<hr>\n<h2>Cu\u00e1ndo usar pins (y cu\u00e1ndo no)<\/h2>\n<p>Los resultados de referencia dejan en claro: los pins no son un reemplazo universal para los solucionadores tradicionales. Entender cuando son apropiados es esencial.<\/p>\n<h3>Los pins sobresalen en:<\/h3>\n<ul>\n<li><strong>Problemas inversos<\/strong> (estimaci\u00f3n de par\u00e1metros a partir de datos escasos)<\/li>\n<li><strong>Reg\u00edmenes de datos escasos<\/strong> donde los datos de observaci\u00f3n son limitados pero valiosos<\/li>\n<li><strong>Inferencia en tiempo real<\/strong> despu\u00e9s de la capacitaci\u00f3n (la red proporciona soluciones continuas y diferenciables)<\/li>\n<li><strong>Problemas de alta dimensi\u00f3n<\/strong> donde la generaci\u00f3n de malla se vuelve poco pr\u00e1ctica<\/li>\n<li><strong>Problemas inversos de acoplamiento<\/strong> (resolver y estimar simult\u00e1neamente)<\/li>\n<\/ul>\n<h3>Los solucionadores tradicionales siguen siendo superiores para:<\/h3>\n<ul>\n<li><strong>Problemas de avance est\u00e1ndar<\/strong> con par\u00e1metros conocidos (FEM\/FDM son m\u00e1s r\u00e1pidos y precisos)<\/li>\n<li><strong>PDES lineales<\/strong> donde existen algoritmos bien establecidos<\/li>\n<li><strong>Requisitos de alta precisi\u00f3n<\/strong> donde se necesita precisi\u00f3n de m\u00e1quina<\/li>\n<li><strong>Simulaciones industriales a gran escala<\/strong> donde domina la eficiencia de c\u00f3mputo<\/li>\n<\/ul>\n<p>La evaluaci\u00f3n honesta, respaldada por PDEbench, Pinnacle y DeepFDM Benchmarks, es que los PIN se complementan en lugar de reemplazar los m\u00e9todos num\u00e9ricos tradicionales. Soludores tradicionales como los cubiertos en nuestro <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">Documentaci\u00f3n de Fipy<\/a> Sigue siendo superior para el avance est\u00e1ndar Problemas. Los pins sobresalen cuando la escasez de datos o la incertidumbre de los par\u00e1metros hacen que los enfoques puramente num\u00e9ricos sean poco pr\u00e1cticos, pero agregan complejidad y costo computacional para los problemas donde los solucionadores establecidos funcionan bien.<\/p>\n<hr>\n<h2>Lista de verificaci\u00f3n pr\u00e1ctica<\/h2>\n<p>Antes de iniciar una implementaci\u00f3n de PINN, verifique:<\/p>\n<ol>\n<li>\u2705 <strong>Tipo de problema<\/strong>: \u00bfAdelante (Resolver PDE) o Inverso (Par\u00e1metros de Estimaci\u00f3n)?<\/li>\n<li>\u2705 <strong>Recuento de colocaci\u00f3n<\/strong>: Comience con 8192 puntos; Ajustar seg\u00fan las necesidades de precisi\u00f3n<\/li>\n<li>\u2705 <strong>Arquitectura de red<\/strong>: 4\u20136 capas ocultas, 50 a 100 neuronas por capa, activaci\u00f3n de Tanh<\/li>\n<li>\u2705 <strong>Estrategia de optimizaci\u00f3n<\/strong>: Adam (20k\u201380k \u00c9pocas) \u2192 L-BFGS (~30 \u00c9pocas)<\/li>\n<li>\u2705 <strong>Pesora de p\u00e9rdida<\/strong>: normalizar o escalar componentes para evitar el dominio<\/li>\n<li>\u2705 <strong>C\u00f3mputo derivativo<\/strong>: use <code>torch.func.jacrev<\/code> + <code>vmap<\/code> para salidas de valores vectoriales por lotes<\/li>\n<li>\u2705 <strong>Condiciones l\u00edmite<\/strong>: Codifique como restricciones duras si es posible (reduce la carga de entrenamiento)<\/li>\n<li>\u2705 <strong>Validaci\u00f3n<\/strong>: Comparar con soluciones anal\u00edticas conocidas o resultados de solucionador tradicional<\/li>\n<\/ol>\n<hr>\n<h2>Pr\u00f3ximos pasos<\/h2>\n<p>Los pins representan un enfoque genuinamente novedoso para la resoluci\u00f3n de PDE que cierra la brecha entre el aprendizaje autom\u00e1tico basado en datos y los m\u00e9todos num\u00e9ricos basados en la f\u00edsica. La implementaci\u00f3n de PyTorch que se muestra aqu\u00ed proporciona una base para abordar los problemas hacia adelante e inversos, pero la metodolog\u00eda contin\u00faa evolucionando.<\/p>\n<p><strong>Para una exploraci\u00f3n m\u00e1s profunda<\/strong>, considere:<\/p>\n<ul>\n<li>Estrategias de reponderaci\u00f3n de p\u00e9rdidas (basadas en LRA, NTK) para geometr\u00edas complejas<\/li>\n<li>Enfoques de descomposici\u00f3n de dominio (FBPINP) para problemas multiescala<\/li>\n<li>Modelos sustitutos de fidelidad m\u00faltiple que combinan simulaciones r\u00e1pidas de baja fidelidad con datos de f\u00edsica de alta fidelidad<\/li>\n<li>Aplicaciones de PINN a sistemas ODE en contextos biol\u00f3gicos y econ\u00f3micos<\/li>\n<\/ul>\n<p>Si est\u00e1 evaluando los pins para un problema espec\u00edfico, comience con la implementaci\u00f3n de la ecuaci\u00f3n de calor hacia adelante anterior, valide contra soluciones anal\u00edticas y luego extienda a su PDE objetivo. La literatura de referencia proporciona una gu\u00eda clara sobre cu\u00e1ndo este enfoque agrega valor en comparaci\u00f3n con cu\u00e1ndo los solucionadores tradicionales siguen siendo la mejor opci\u00f3n.<\/p>\n<h2>referencias<\/h2>\n<ul>\n<li>Raissi, M., Perdikaris, P., &amp; Karniadakis, G. E. (2019). Redes neuronales informadas en la f\u00edsica. <em>Revista de f\u00edsica computacional<\/em>, 378, 686\u2013707. https:\/\/www.sciencedirect.com\/science\/article\/abs\/pii\/s0021999118307125<\/li>\n<li>Takamoto, K., Paustenko, T., Mazurenko, S., &amp; No\u00e9, F. (2022). Pdebench: una completa suite de benchmarking para operadores neuronales. <em>Neurips 2022<\/em>. https:\/\/github.com\/pdebench\/pdebench<\/li>\n<li>Hao, Z., Zheng, M., &amp; Sznaier, M. (2023). Pinnacle: un punto de referencia completo para redes neuronales informadas en la f\u00edsica. <em>ArXiv:2306.08827<\/em>. https:\/\/arxiv.org\/html\/2306.08827v1<\/li>\n<li>Chatain, S., et al. (2025). DeepFDM: incrustaci\u00f3n de solucionadores num\u00e9ricos en arquitecturas neuronales. <em>ArXiv:2507.21269<\/em>. https:\/\/arxiv.org\/abs\/2507.21269<\/li>\n<li>Emert-Streib, F., et al. (2026). DeepXde para sistemas ODE: un tutorial pr\u00e1ctico. <em>Fronteras en Inteligencia Artificial<\/em>. https:\/\/www.frontiersin.org\/journals\/artificial-intelligence\/articles\/10.3389\/frai.2026.1717117\/full<\/li>\n<li>Lee, S. (2024). Tutoriales de redes neuronales informadas con PyTorch. https:\/\/lazyjobseeker.github.io\/en\/posts\/physics-informed-neural-network-tutorials\/<\/li>\n<li>Miller, D. (2024). Redes neuronales informadas en f\u00edsica utilizando PyTorch. https:\/\/modulebug.com\/2024\/12\/27\/physics-informed-neural-networks-pinns-using-pytorch\/<\/li>\n<\/ul>\n<hr>\n<p><em>Este art\u00edculo une la teor\u00eda y la implementaci\u00f3n de los investigadores que ingresan al espacio PINN. Para obtener orientaci\u00f3n pr\u00e1ctica sobre los m\u00e9todos num\u00e9ricos tradicionales, consulte nuestro <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n y ejemplos fipy<\/a> y <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introducci\u00f3n al modelado de materiales<\/a>.<\/em><\/p>\n<hr>\n<p><strong>\u00bfQu\u00e9 opinas?<\/strong> Los pins agregan sobrecargas computacionales en comparaci\u00f3n con los solucionadores tradicionales, pero abren posibilidades \u00fanicas de problemas inversos y de inferencia de datos escasos. Si est\u00e1 trabajando con datos de observaci\u00f3n limitados, considere las compensaciones cuidadosamente. Comparta su experiencia con las implementaciones de PINN en los comentarios.<\/p>\n<hr>\n<p><strong>\u00bfListo para experimentar?<\/strong> Comience con el c\u00f3digo de ecuaci\u00f3n de calor anterior, valide contra soluciones anal\u00edticas y luego extienda a su problema espec\u00edfico. La implementaci\u00f3n completa est\u00e1 disponible con fines educativos: adaptarlo, probarlo e iterar.<\/p>\n<hr>\n<p><a href=\"https:\/\/github.com\/pdebench\/PDEBench\" target=\"_blank\" rel=\"nofollow noopener\">Visite el repositorio de pdebench<\/a> para c\u00f3digo de referencia y conjuntos de datos.<\/p>\n<p><a href=\"https:\/\/github.com\/i207M\/PINNacle\" target=\"_blank\" rel=\"nofollow noopener\">Explore la evaluaci\u00f3n exhaustiva de Pinnacle<\/a> para las recomendaciones espec\u00edficas del m\u00e9todo.<\/p>\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\"> 14<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Aprenda c\u00f3mo implementar redes neuronales informadas en f\u00edsica en PyTorch para resolver problemas de PDE directos e inversos con c\u00f3digo real.<\/p>\n","protected":false,"raw":"Aprenda c\u00f3mo implementar redes neuronales informadas en f\u00edsica en PyTorch para resolver problemas de PDE directos e inversos con c\u00f3digo real."},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=1049","iawp_total_views":2,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1108","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.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  14 minutesAprenda c\u00f3mo implementar redes neuronales informadas en f\u00edsica en PyTorch para resolver problemas de PDE directos e inversos con c\u00f3digo real.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-19T09:48:35+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python\",\"datePublished\":\"2026-08-19T09:48:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/\"},\"wordCount\":3510,\"commentCount\":0,\"articleSection\":[\"Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/\",\"name\":\"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-19T09:48:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/physics-informed-neural-networks-pytorch-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de 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\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"caption\":\"steven\"},\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/steven\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/","og_locale":"es_ES","og_type":"article","og_title":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org","og_description":"Reading Time:  14 minutesAprenda c\u00f3mo implementar redes neuronales informadas en f\u00edsica en PyTorch para resolver problemas de PDE directos e inversos con c\u00f3digo real.","og_url":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/","og_site_name":"matforge.org","article_published_time":"2026-08-19T09:48:35+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"steven","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python","datePublished":"2026-08-19T09:48:35+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/"},"wordCount":3510,"commentCount":0,"articleSection":["Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/","url":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/","name":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de implementaci\u00f3n de Python - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-19T09:48:35+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/physics-informed-neural-networks-pytorch-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Redes neuronales informadas en la f\u00edsica: una gu\u00eda pr\u00e1ctica de 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\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","caption":"steven"},"url":"https:\/\/matforge.org\/author\/steven\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1108","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\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1108"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1108\/revisions"}],"predecessor-version":[{"id":1148,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1108\/revisions\/1148"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}