{"id":1214,"date":"2026-08-21T14:28:47","date_gmt":"2026-08-21T14:28:47","guid":{"rendered":"https:\/\/matforge.org\/?p=1214","raw":"https:\/\/matforge.org\/?p=1214"},"modified":"2026-08-21T14:28:47","modified_gmt":"2026-08-21T14:28:47","slug":"physics-informed-neural-networks-pytorch-guide","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/","title":{"rendered":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python","raw":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre 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\"> 15<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Les r\u00e9seaux de neurones bas\u00e9s sur la physique (PINN) r\u00e9solvent des \u00e9quations aux d\u00e9riv\u00e9es partielles en int\u00e9grant des \u00e9quations directement dans les fonctions de perte de r\u00e9seau neuronal, permettant une solution simultan\u00e9e et une estimation des param\u00e8tres sans g\u00e9n\u00e9ration de maillage. Ils combinent la diff\u00e9renciation automatique avec l&rsquo;optimisation bas\u00e9e sur le gradient pour approximer les solutions PDE &#8211; et lorsqu&rsquo;elles sont combin\u00e9es avec les bonnes strat\u00e9gies d&rsquo;entra\u00eenement, peuvent r\u00e9cup\u00e9rer des param\u00e8tres physiques \u00e0 partir de donn\u00e9es d&rsquo;observation clairsem\u00e9es.<\/p>\n<hr>\n<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ol>\n<li>Les pinns int\u00e8grent les r\u00e9sidus de PDE en termes de perte de physique, de sorte que le r\u00e9seau apprend \u00e0 satisfaire \u00e0 la fois les conditions aux limites et les \u00e9quations diff\u00e9rentielles simultan\u00e9ment.<\/li>\n<li><strong>Optimizer hybridization matters<\/strong>: Adam for initial training (20k\u201380k epochs) followed by L-BFGS for fine-tuning (~30 epochs) is the empirically recommended sequence.<\/li>\n<li>Les PINN excellent dans les probl\u00e8mes inverses (estimation des param\u00e8tres) et les r\u00e9gimes de donn\u00e9es clairsem\u00e9es, mais les r\u00e9f\u00e9rences r\u00e9centes montrent qu&rsquo;ils restent inf\u00e9rieurs aux solveurs num\u00e9riques traditionnels pour les probl\u00e8mes directs.<\/li>\n<li>Le nombre de points de collocation affecte de mani\u00e8re critique la convergence&nbsp;: ~&nbsp;8&nbsp;192&nbsp;points sont souvent une saturation suffisante&nbsp;; Au-del\u00e0 de cela, les gains sont marginaux \u00e0 un co\u00fbt de calcul important.<\/li>\n<li><code>torch.func.jacrev<\/code> + <code>torch.func.vmap<\/code> est requis pour le calcul jacobien dans les PINN multi-sorties \u2014 pur <code>torch.autograd.grad<\/code> \u00e9choue pour les mod\u00e8les par lots \u00e0 valeur vectorielle.<\/li>\n<li>Les techniques d&rsquo;\u00e9quilibrage des pertes (LRA, repond\u00e9ration bas\u00e9e sur NTK) et la d\u00e9composition de domaine (FBPINP) traitent du taux d&rsquo;\u00e9chec de la t\u00e2che d&rsquo;environ 60&nbsp;% des pins \u00e0 la vanille r\u00e9v\u00e9l\u00e9s par le Pinnacle Benchmark.<\/li>\n<\/ol>\n<hr>\n<h2>Que sont les r\u00e9seaux de neurones bas\u00e9s sur la physique ?<\/h2>\n<p>Les PINN ont \u00e9t\u00e9 introduits par Raissi, Perdikaris et Karniadakis en 2019 comme une approche sans maillage pour r\u00e9soudre les PDE \u00e0 l&rsquo;aide de r\u00e9seaux de neurones profonds. Cela repr\u00e9sente un changement important par rapport aux m\u00e9thodes traditionnelles bas\u00e9es sur le maillage telles que les approches par \u00e9l\u00e9ments finis et \u00e0 diff\u00e9rences finies couvertes dans notre <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introduction \u00e0 la mod\u00e9lisation des mat\u00e9riaux<\/a>. L&rsquo;id\u00e9e de base est \u00e9l\u00e9gante mais pratiquement subtile : au lieu de discr\u00e9tiser le domaine en un maillage (comme dans les m\u00e9thodes d&rsquo;\u00e9l\u00e9ments finis ou de diff\u00e9rences finies), vous d\u00e9finissez la solution comme un r\u00e9seau neuronal continu et p\u00e9nalisez les violations de la physique qui gouvernent pendant la formation.<\/p>\n<p>Envisagez une PDE g\u00e9n\u00e9rique&nbsp;:<\/p>\n<pre><code>\ud835\udca9(u(x,t), x, t) = 0,   (x,t) \u2208 \u03a9\n<\/code><\/pre>\n<p>o\u00f9 <code>\ud835\udca9<\/code> est un op\u00e9rateur diff\u00e9rentiel, <code>u(x,t)<\/code> est la solution inconnue et <code>\u03a9<\/code> est le domaine spatial-temporel. Un PINN param\u00e9trelle <code>u<\/code> comme un r\u00e9seau de neurones <code>u(x,t; \u03b8)<\/code> avec des poids <code>\u03b8<\/code>. La fonction de perte combine trois composants :<\/p>\n<pre><code>Loss(\u03b8) = LossPhysics + LossBoundary + LossData\n<\/code><\/pre>\n<ul>\n<li><strong>Lossphysics<\/strong>&nbsp;: le r\u00e9sidu PDE <code>\ud835\udca9(u(x,t; \u03b8))<\/code> \u00e9valu\u00e9 aux points de collocation \u00e9chantillonn\u00e9s dans le domaine.<\/li>\n<li><strong>Lossboundary<\/strong>&nbsp;: violation des conditions limites et initiales.<\/li>\n<li><strong>Data LossData<\/strong>&nbsp;: (facultatif) Discordance entre les valeurs pr\u00e9dites et les donn\u00e9es d&rsquo;observation clairsem\u00e9es.<\/li>\n<\/ul>\n<p>Le r\u00e9seau est form\u00e9 pour minimiser <code>Loss(\u03b8)<\/code> en utilisant la descente de gradient, et le r\u00e9seau r\u00e9sultant fournit une approximation continue et diff\u00e9renciable de la solution sur l&rsquo;ensemble du domaine.<\/p>\n<hr>\n<h2>G\u00e9n\u00e9ration de points de collocation<\/h2>\n<p>Le choix et la distribution des points de collocation sont sans doute l&rsquo;hyperparam\u00e8tre le plus important dans l&rsquo;entra\u00eenement de Pinn. Les points de collocation sont les emplacements o\u00f9 le r\u00e9sidu PDE est \u00e9valu\u00e9 pour calculer la perte physique.<\/p>\n<h3>Strat\u00e9gie<\/h3>\n<p>L&rsquo;approche standard des \u00e9chantillons pointe uniform\u00e9ment \u00e0 travers le domaine. Pour un domaine spatial 1D <code>[x_min, x_max]<\/code> et un domaine temporel <code>[t_min, t_max]<\/code>, vous g\u00e9n\u00e9rez <code>N_spatial<\/code> points spatiaux et <code>N_temporal<\/code> points temporels, puis formez une grille de points de collocation <code>N_total = N_spatial \u00d7 N_temporal<\/code>.<\/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>Sensibilit\u00e9 au nombre de points<\/h3>\n<p>Les exp\u00e9riences de Pinnacle Benchmark d\u00e9montrent que la taille des lots (nombre de points de collocation) affecte consid\u00e9rablement la convergence. L&rsquo;\u00e9tude de mise \u00e0 l&rsquo;\u00e9chelle progressive a r\u00e9v\u00e9l\u00e9:<\/p>\n<ul>\n<li><strong>512&nbsp;points<\/strong>&nbsp;: converge mais conserve une erreur relativement \u00e9lev\u00e9e<\/li>\n<li><strong>8&nbsp;192&nbsp;points<\/strong>&nbsp;: saturation souvent suffisante pour une pr\u00e9cision mod\u00e9r\u00e9e<\/li>\n<li><strong>3&nbsp;2&nbsp;768&nbsp;points<\/strong>&nbsp;: am\u00e9lioration marginale des erreurs \u00e0 un co\u00fbt de calcul important<\/li>\n<\/ul>\n<p>Pour la plupart des fins pratiques, 8192 points de collocation offrent une pr\u00e9cision ad\u00e9quate sans surcharge de calcul excessive. L&rsquo;id\u00e9e cl\u00e9 est que plus de points ne signifient pas toujours une meilleure convergence &#8211; le paysage des pertes peut devenir plus complexe avec le sur\u00e9chantillonnage et la diminution des rendements rapidement.<\/p>\n<h3>\u00c9chantillonnage adaptatif (avanc\u00e9)<\/h3>\n<p>Pour d\u00e9fier les PDE avec des gradients ou des discontinuit\u00e9s localis\u00e9s, le raffinement adaptatif bas\u00e9 sur les r\u00e9sidus (RAR) peut r\u00e9\u00e9chantillonner dynamiquement les points de collocation pour se concentrer sur les r\u00e9gions avec des r\u00e9sidus de PDE \u00e9lev\u00e9s. Cette approche aborde l&rsquo;un des principaux modes de d\u00e9faillance de l&rsquo;\u00e9chantillonnage uniforme dans les t\u00e2ches de g\u00e9om\u00e9trie complexe de Pinnacle.<\/p>\n<hr>\n<h2>Probl\u00e8me avanc\u00e9&nbsp;: r\u00e9solution de l&rsquo;\u00e9quation de la chaleur<\/h2>\n<p>Le probl\u00e8me d&rsquo;avance demande&nbsp;: \u00e9tant donn\u00e9 une PDE et des conditions initiales\/limites, trouvez la solution. Nous allons r\u00e9soudre l&rsquo;\u00e9quation de chaleur 1D&nbsp;:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1 \u2202\u00b2u\/\u2202x\u00b2,   x \u2208 [0, 1], t \u2208 [0, T]\n<\/code><\/pre>\n<p>avec condition initiale <code>u(x, 0) = f(x)<\/code> et conditions aux limites <code>u(0, t) = u(L, t) = 0<\/code>.<\/p>\n<h3>Architecture r\u00e9seau<\/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>Calcul des d\u00e9riv\u00e9s avec autograd<\/h3>\n<p>L&rsquo;innovation critique de PINN consiste \u00e0 calculer les d\u00e9riv\u00e9s de la sortie du r\u00e9seau par rapport \u00e0 ses entr\u00e9es en utilisant la diff\u00e9renciation automatique. Pour l&rsquo;\u00e9quation de la chaleur, nous avons besoin :<\/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>Note importante<\/strong>&nbsp;: l&rsquo;approche <code>torch.autograd.grad<\/code> ci-dessus fonctionne pour les r\u00e9seaux \u00e0 sortie unique, mais <strong>\u00e9choue pour les mod\u00e8les \u00e0 valeur vectorielle batched<\/strong>. Comme d\u00e9montr\u00e9 dans les tutoriels r\u00e9cents de PyTorch, <code>torch.func.jacrev<\/code> combin\u00e9 avec <code>torch.func.vmap<\/code> est requis pour un calcul jacobien appropri\u00e9 lorsque le r\u00e9seau produit des sorties \u00e0 valeur vectorielle sur des entr\u00e9es par lots. Voir la section Impl\u00e9mentation avanc\u00e9e ci-dessous.<\/p>\n<h3>Boucle d&rsquo;entra\u00eenement<\/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>Probl\u00e8me inverse : estimation des param\u00e8tres<\/h2>\n<p>Le probl\u00e8me inverse demande&nbsp;: \u00e9tant donn\u00e9 des donn\u00e9es d&rsquo;observation clairsem\u00e9es, identifiez des param\u00e8tres inconnus dans les \u00e9quations gouvernantes. C&rsquo;est l\u00e0 que les PINN brillent vraiment &#8211; les solveurs traditionnels exigent que vous sp\u00e9cifiez tous les param\u00e8tres \u00e0 l&rsquo;avance, tandis que les PINN peuvent <strong>apprends-les<\/strong> \u00e0 partir des donn\u00e9es simultan\u00e9ment.<\/p>\n<h3>Configuration du probl\u00e8me<\/h3>\n<p>Consid\u00e9rez la m\u00eame \u00e9quation de chaleur mais avec un coefficient de diffusion <strong>inconnu<\/strong> <code>\u03b1<\/code>&nbsp;:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1(\u03b8) \u2202\u00b2u\/\u2202x\u00b2\n<\/code><\/pre>\n<p>o\u00f9 <code>\u03b1(\u03b8)<\/code> est param\u00e9tr\u00e9 en tant que scalaire formable au sein du r\u00e9seau.<\/p>\n<h3>R\u00e9seau modifi\u00e9 pour les probl\u00e8mes inverses<\/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>Formation avec estimation des param\u00e8tres<\/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>Le probl\u00e8me inverse montre l&rsquo;avantage unique de Pinn : au lieu de r\u00e9soudre un PDE avec des param\u00e8tres connus, le r\u00e9seau d\u00e9couvre simultan\u00e9ment la solution et identifie les constantes physiques qui gouvernent. Ceci est particuli\u00e8rement utile dans les contextes exp\u00e9rimentaux o\u00f9 les param\u00e8tres sont difficiles ou co\u00fbteux \u00e0 mesurer directement.<\/p>\n<hr>\n<h2>Impl\u00e9mentation avanc\u00e9e : torch.func pour les sorties \u00e0 valeur vectorielle<\/h2>\n<p>L&rsquo;approche standard <code>torch.autograd.grad<\/code> pr\u00e9sent\u00e9e ci-dessus fonctionne pour les r\u00e9seaux simples \u00e0 sortie unique. Cependant, lorsque vous batchez des entr\u00e9es pour l&rsquo;efficacit\u00e9, le r\u00e9seau produit des sorties \u00e0 valeur vectorielle et <code>torch.autograd.grad<\/code> seul \u00e9choue.<\/p>\n<p>L&rsquo;approche correcte utilise <code>torch.func.jacrev<\/code> combin\u00e9e avec <code>torch.func.vmap<\/code>&nbsp;:<\/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>Cette approche n&rsquo;est pas mentionn\u00e9e dans la plupart des didacticiels PIN, mais est essentielle pour un bon calcul de gradient lors de la formation avec de gros lots. Sans cela, vous pouvez rencontrer des \u00e9checs silencieux ou des gradients incorrects.<\/p>\n<hr>\n<h2>Strat\u00e9gie d&rsquo;optimiseur : ADAM \u2192 Hybridation L-BFGS<\/h2>\n<p>Le choix de l&rsquo;optimiseur affecte de mani\u00e8re critique la convergence de PINN. Les \u00e9tudes empiriques et les r\u00e9sultats de r\u00e9f\u00e9rence recommandent syst\u00e9matiquement une approche en deux phases :<\/p>\n<h3>Phase 1 : Formation 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>L&rsquo;\u00e9lan d&rsquo;Adam aide le r\u00e9seau \u00e0 \u00e9chapper \u00e0 des r\u00e9gions initiales pauvres du paysage des pertes. Cependant, Adam seul converge souvent lentement et peut caler \u00e0 un plateau de perte sous-optimal.<\/p>\n<h3>Phase 2 : raffinement L-BFGS<\/h3>\n<pre><code>Epochs: ~30\u201350\nPurpose: Fine-tuning, reaching final accuracy\n<\/code><\/pre>\n<p>L-BFGS (Limited-Memory Broyden\u2013Fletcher\u2013Rawstorff) effectue la recherche en ligne et les mises \u00e0 jour quasi-Newton, affinant rapidement la solution une fois qu&rsquo;Adam a rapproch\u00e9 le r\u00e9seau de l&rsquo;optimum.<\/p>\n<h3>Ex\u00e9cution<\/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>Pourquoi cela fonctionne<\/strong>&nbsp;: L-BFGS \u00e0 lui seul diverge souvent de l&rsquo;initialisation al\u00e9atoire car sa recherche de ligne \u00e9choue lorsque le gradient initial pointe dans la mauvaise direction. Adam fournit l&rsquo;exploration mondiale n\u00e9cessaire pour atteindre un bon bassin d&rsquo;attraction, apr\u00e8s quoi L-BFGS converge rapidement vers une grande pr\u00e9cision. Cette s\u00e9quence n&rsquo;est pas mentionn\u00e9e dans la plupart des didacticiels mais est essentielle pour une convergence fiable.<\/p>\n<hr>\n<h2>Contexte de r\u00e9f\u00e9rence&nbsp;: que montrent des \u00e9tudes r\u00e9centes&nbsp;?<\/h2>\n<p>Comprendre o\u00f9 se situe les PINN par rapport aux solveurs traditionnels n\u00e9cessite d&rsquo;examiner les \u00e9tudes de r\u00e9f\u00e9rence r\u00e9centes. Ce contexte est crucial pour les lecteurs qui souhaitent comprendre comment les approches neuronales se comparent aux m\u00e9thodes \u00e9tablies &#8211; un th\u00e8me central de notre couverture de <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\" target=\"_blank\" rel=\"noopener\">Ce que la simulation scientifique signifie r\u00e9ellement<\/a> dans la recherche moderne. Trois grands efforts fournissent des preuves quantitatives concr\u00e8tes :<\/p>\n<h3>PDEBench : indice de r\u00e9f\u00e9rence des op\u00e9rateurs neuronaux<\/h3>\n<p>PDEbench (Takamoto et al., Neurips 2022) compare les PINN, les op\u00e9rateurs de neurones de Fourier (FNOS) et les architectures U-Net dans plusieurs cat\u00e9gories de PDE. Principale constatation : Les FNO n\u00e9cessitent des donn\u00e9es d&rsquo;entra\u00eenement pr\u00e9-g\u00e9n\u00e9r\u00e9es et apprennent \u00e0 cartographier des vari\u00e9t\u00e9s de solutions enti\u00e8res, tandis que les PINN r\u00e9solvent des probl\u00e8mes par instance sans aucune pr\u00e9-formation. Cette distinction rend les PINN fondamentalement diff\u00e9rents des op\u00e9rateurs neuronaux&nbsp;: ils peuvent r\u00e9soudre les probl\u00e8mes inverses et s&rsquo;adapter aux conditions aux limites invisibles, mais ils s&rsquo;entra\u00eenent \u00e0 partir de z\u00e9ro pour chaque nouvelle instance.<\/p>\n<p>Les visualisations de PDEbench d\u00e9montrent la diversit\u00e9 des probl\u00e8mes que les pinns peuvent r\u00e9soudre &#8211; syst\u00e8mes de r\u00e9action-r\u00e9action, \u00e9quations d&rsquo;eau peu profonde, flux de Navier-Stokes &#8211; illustrant \u00e0 la fois la flexibilit\u00e9 et l&rsquo;\u00e9tendue de l&rsquo;application.<\/p>\n<h3>Pinnacle&nbsp;: \u00c9valuation syst\u00e9matique de la m\u00e9thode<\/h3>\n<p>Le Pinnacle Benchmark (Hao et al., 2023) fournit l&rsquo;\u00e9valuation la plus compl\u00e8te des variantes de PiNN dans 22&nbsp;cas de test. La d\u00e9couverte critique :<\/p>\n<blockquote>\n<p><strong>Pinns \u00e0 la vanille ne r\u00e9solvent que 9 des 22&nbsp;t\u00e2ches (\u2264&nbsp;40&nbsp;%)<\/strong> \u00e0 un seuil de pr\u00e9cision raisonnable.<\/p>\n<\/blockquote>\n<p>Recommandations sp\u00e9cifiques \u00e0 la m\u00e9thode de Pinnacle&nbsp;:<\/p>\n<ul>\n<li><strong>PINN-LRA<\/strong> (Analyse de la repond\u00e9ration des pertes)&nbsp;: id\u00e9al pour les g\u00e9om\u00e9tries complexes<\/li>\n<li><strong>PINN-NTK<\/strong> (Neural Tangent Kernel) : efficace pour les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li><strong>FBPINP<\/strong> (pinn \u00e9quilibr\u00e9 fondamental)&nbsp;: la d\u00e9composition du domaine excelle dans les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li><strong>HP-VPINP \/ GPINP<\/strong>&nbsp;: les formulations variationnelles excellent dans les probl\u00e8mes inverses<\/li>\n<\/ul>\n<p>Ces r\u00e9sultats sugg\u00e8rent que les PINN bruts ont souvent des difficult\u00e9s \u00e0 s&rsquo;attaquer \u00e0 des PDE difficiles, mais les variantes de m\u00e9thodes cibl\u00e9es traitent des modes de d\u00e9faillance sp\u00e9cifiques.<\/p>\n<h3>DeepFDM 2025 : Solveurs num\u00e9riques diff\u00e9rentiables-num\u00e9riques<\/h3>\n<p>Le cadre DeepFDM de Chatain et al. (juillet 2025) a introduit une nouvelle base comparative qui int\u00e8gre la discr\u00e9tisation avanc\u00e9e-Euler directement dans l&rsquo;architecture CNN. Les r\u00e9sultats d\u00e9fient le r\u00e9cit \u00ab\u00a0les approches neuronales sont sup\u00e9rieures\u00a0\u00bb&nbsp;:<\/p>\n<ul>\n<li><strong>Les solveurs num\u00e9riques surpassent les op\u00e9rateurs neuronaux d&rsquo;environ 1&nbsp;ordre de grandeur en pr\u00e9cision<\/strong><\/li>\n<li><strong>DeepFDM utilise 10 \u00e0 20 \u00d7 moins d&rsquo;\u00e9poques<\/strong> que les FNO<\/li>\n<li><strong>5 \u00e0 50&nbsp;\u00d7&nbsp;param\u00e8tres<\/strong> que les approches des op\u00e9rateurs neuronaux<\/li>\n<\/ul>\n<p>Cela sugg\u00e8re que les approches num\u00e9riques num\u00e9riques hybrides repr\u00e9sentent un terrain d&rsquo;entente pratique entre les solveurs bas\u00e9s sur la physique pure et les m\u00e9thodes neuronales enti\u00e8rement bas\u00e9es sur les donn\u00e9es.<\/p>\n<hr>\n<h2>Comparaison : DeepXDE vs Pure Pytorch<\/h2>\n<p>Diff\u00e9rents cadres de mise en \u0153uvre offrent des compromis distincts. Voici une comparaison pratique :<\/p>\n<table>\n<thead>\n<tr>\n<th>Fonctionnalit\u00e9<\/th>\n<th>DeepXDE<\/th>\n<th>Torche pure<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>D\u00e9finition PDE<\/strong><\/td>\n<td>Classes int\u00e9gr\u00e9es (ODE, PDE, etc.)<\/td>\n<td>Calcul r\u00e9siduel manuel<\/td>\n<\/tr>\n<tr>\n<td><strong>Calcul d\u00e9riv\u00e9<\/strong><\/td>\n<td>abstrait en interne<\/td>\n<td>explicite <code>torch.autograd.grad<\/code> ou <code>torch.func<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Acc\u00e8s aux pertes individuelles<\/strong><\/td>\n<td>\u274c Pas d&rsquo;acc\u00e8s direct aux pertes par composant<\/td>\n<td>\u2705 Contr\u00f4le total de chaque terme de perte<\/td>\n<\/tr>\n<tr>\n<td><strong>Fronti\u00e8res complexes<\/strong><\/td>\n<td>\u274c Non impl\u00e9ment\u00e9<\/td>\n<td>\u2705 G\u00e9om\u00e9trie enti\u00e8rement personnalisable<\/td>\n<\/tr>\n<tr>\n<td><strong>Option de taille de lot<\/strong><\/td>\n<td>\u274c Partiellement mis en \u0153uvre<\/td>\n<td>\u2705 Contr\u00f4le par lots complet<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilit\u00e9 Pytorch<\/strong><\/td>\n<td>\u26a0\ufe0f Probl\u00e8mes avec les derni\u00e8res versions<\/td>\n<td>\u2705 Toujours \u00e0 jour<\/td>\n<\/tr>\n<tr>\n<td><strong>Courbe d&rsquo;apprentissage<\/strong><\/td>\n<td>Plus bas (l&rsquo;abstraction masque la complexit\u00e9)<\/td>\n<td>Plus haut (Transparence totale)<\/td>\n<\/tr>\n<tr>\n<td><strong>Formation personnalis\u00e9e<\/strong><\/td>\n<td>Contr\u00f4le de rappel limit\u00e9<\/td>\n<td>Contr\u00f4le total<\/td>\n<\/tr>\n<tr>\n<td><strong>Probl\u00e8mes inverses<\/strong><\/td>\n<td>Prise en charge via des param\u00e8tres d&rsquo;apprentissage<\/td>\n<td>Prise en charge via des param\u00e8tres d&rsquo;apprentissage<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Recommandation<\/strong>&nbsp;: utilisez DeepXDE lorsque vous avez besoin d&rsquo;un prototypage rapide avec des PDE standard et acceptez ses limitations connues. Pour un aper\u00e7u plus large des outils de simulation et des flux de travail de mod\u00e9lisation, explorez nos <a href=\"https:\/\/matforge.org\/category\/simulation-modeling-projects\/\" target=\"_blank\" rel=\"noopener\">Simulation et mod\u00e9lisation Projets<\/a>. Utilisez Pure PyTorch lorsque vous avez besoin d&rsquo;une transparence totale, d&rsquo;une pond\u00e9ration personnalis\u00e9e des pertes et d&rsquo;une compatibilit\u00e9 avec les derni\u00e8res fonctionnalit\u00e9s de PyTorch, en particulier pour les syst\u00e8mes de recherche ou de production o\u00f9 le contr\u00f4le des pertes est important. Utilisez Pure PyTorch lorsque vous avez besoin d&rsquo;une transparence totale, d&rsquo;une pond\u00e9ration personnalis\u00e9e des pertes et d&rsquo;une compatibilit\u00e9 avec les derni\u00e8res fonctionnalit\u00e9s de PyTorch, en particulier pour les syst\u00e8mes de recherche ou de production o\u00f9 le contr\u00f4le des pertes est important.<\/p>\n<hr>\n<h2>D\u00e9pannage des modes de panne courants<\/h2>\n<p>M\u00eame avec une impl\u00e9mentation correcte, les PINN peuvent ne pas converger. Le Pinnacle Benchmark identifie plusieurs mod\u00e8les d&rsquo;\u00e9chec et leurs recours.<\/p>\n<h3>1. Pathologies de gradient<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: les sorties r\u00e9seau saturent (les gradients approchent de z\u00e9ro) ou explosent pendant l&rsquo;entra\u00eenement.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: le paysage des pertes a des r\u00e9gions avec des gradients extr\u00eamement raides ou plats, en particulier lorsque les \u00e9chelles de perte physique et de perte de limites sont incompatibles.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Appliquer la repond\u00e9ration des pertes \u00e0 l&rsquo;aide de la LRA (analyse de la repond\u00e9ration des pertes) ou des m\u00e9thodes bas\u00e9es sur NTK<\/li>\n<li>Normaliser chaque terme de perte \u00e0 des magnitudes similaires avant la sommation<\/li>\n<li>Utiliser l&rsquo;extrait de d\u00e9grad\u00e9&nbsp;: <code>torch.nn.utils.clip_grad_norm_(net.parameters(), max_norm=1.0)<\/code><\/li>\n<\/ul>\n<h3>2. Biais spectral<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: le r\u00e9seau apprend les composants \u00e0 basse fr\u00e9quence de la solution, mais \u00e9choue \u00e0 des fr\u00e9quences plus \u00e9lev\u00e9es.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: R\u00e9seaux de neurones avec activations TANH\/sigmo\u00efdes biaisent naturellement vers des fr\u00e9quences plus basses pendant l&rsquo;entra\u00eenement &#8211; un ph\u00e9nom\u00e8ne bien document\u00e9 dans la litt\u00e9rature sur les r\u00e9seaux de neurones.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Utilisez des int\u00e9grations de fonctionnalit\u00e9s de Fourier (encodage de position) pour acc\u00e9l\u00e9rer la convergence \u00e0 des fr\u00e9quences plus \u00e9lev\u00e9es<\/li>\n<li>Augmenter la largeur du r\u00e9seau (100 \u00e0 200 neurones par couche au lieu de 50 \u00e0 100)<\/li>\n<li>Utilisez des activations sinus au lieu de TANH pour une meilleure repr\u00e9sentation \u00e0 haute fr\u00e9quence<\/li>\n<\/ul>\n<h3>3. D\u00e9s\u00e9quilibre des pertes<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: un terme de perte domine pendant l&rsquo;entra\u00eenement, provoquant une mauvaise convergence d&rsquo;autres composants.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: les r\u00e9sidus physiques, les violations de limites et les pertes de donn\u00e9es op\u00e8rent \u00e0 diff\u00e9rentes \u00e9chelles.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Poids de la perte d&rsquo;\u00e9chelle dynamiquement pendant l&rsquo;entra\u00eenement en fonction des amplitudes de perte de courant<\/li>\n<li>Commencez avec des poids plus \u00e9lev\u00e9s pour les conditions aux limites, passez progressivement \u00e0 la perte de physique<\/li>\n<li>Surveillez chaque composante de perte s\u00e9par\u00e9ment et ajustez les poids de mani\u00e8re interactive<\/li>\n<\/ul>\n<h3>4. Sensibilit\u00e9 au point de collocation<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: la perte oscille ou converge lentement malgr\u00e9 un nombre important de points.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: trop peu de points produisent une contrainte insuffisante&nbsp;; Trop de points cr\u00e9ent un paysage d&rsquo;optimisation difficile.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Commencez avec 8192 points de collocation comme ligne de base (point de saturation de Pinnacle)<\/li>\n<li>Utilisez le raffinement adaptatif (RAR) pour les EDP difficiles<\/li>\n<li>Entra\u00eenement par lots&nbsp;: exemple de points d&rsquo;\u00e9chantillonnage dynamiques pendant l&rsquo;entra\u00eenement plut\u00f4t que de pr\u00e9-calculer tous les points<\/li>\n<\/ul>\n<h3>5. Non-identifiabilit\u00e9 du probl\u00e8me inverse<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: les param\u00e8tres estim\u00e9s d\u00e9rivent ou convergent vers des valeurs erron\u00e9es.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: plusieurs combinaisons de param\u00e8tres produisent des surfaces de solution similaires (probl\u00e8mes d&rsquo;identification).<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Augmenter la couverture des points de donn\u00e9es dans le domaine<\/li>\n<li>Ajouter une r\u00e9gularisation sur les estimations de param\u00e8tres<\/li>\n<li>Utiliser les connaissances ant\u00e9rieures pour contraindre les plages de param\u00e8tres<\/li>\n<\/ul>\n<hr>\n<h2>Quand utiliser les PINN (et quand ne pas le faire)<\/h2>\n<p>Les r\u00e9sultats de r\u00e9f\u00e9rence le montrent clairement&nbsp;: les PINN ne remplacent pas universellement les solveurs traditionnels. Il est essentiel de comprendre quand ils sont appropri\u00e9s.<\/p>\n<h3>PINS EXCELLIT :<\/h3>\n<ul>\n<li><strong>Probl\u00e8mes inverses<\/strong> (estimation des param\u00e8tres \u00e0 partir de donn\u00e9es clairsem\u00e9es)<\/li>\n<li><strong>R\u00e9gimes de donn\u00e9es rares<\/strong> o\u00f9 les donn\u00e9es d&rsquo;observation sont limit\u00e9es mais pr\u00e9cieuses<\/li>\n<li><strong>Inf\u00e9rence en temps r\u00e9el<\/strong> apr\u00e8s la formation (le r\u00e9seau fournit des solutions continues et diff\u00e9renciables)<\/li>\n<li><strong>Probl\u00e8mes de grande dimension<\/strong> o\u00f9 la g\u00e9n\u00e9ration de maillage devient impraticable<\/li>\n<li><strong>Probl\u00e8mes inverses entre les deux et l&rsquo;avant<\/strong> (r\u00e9solution et estimation simultan\u00e9es)<\/li>\n<\/ul>\n<h3>Les solveurs traditionnels restent sup\u00e9rieurs pour :<\/h3>\n<ul>\n<li><strong>Probl\u00e8mes de transmission standard<\/strong> avec des param\u00e8tres connus (FEM\/FDM sont plus rapides et plus pr\u00e9cis)<\/li>\n<li><strong>PDES lin\u00e9aires<\/strong> o\u00f9 des algorithmes bien \u00e9tablis existent<\/li>\n<li><strong>Exigences \u00e9lev\u00e9es en mati\u00e8re de pr\u00e9cision<\/strong> lorsque la pr\u00e9cision de la machine est n\u00e9cessaire<\/li>\n<li><strong>Simulations industrielles \u00e0 grande \u00e9chelle<\/strong> o\u00f9 l&rsquo;efficacit\u00e9 des calculs domine<\/li>\n<\/ul>\n<p>L&rsquo;\u00e9valuation honn\u00eate, soutenue par les rep\u00e8res PDEbench, Pinnacle et DeepFDM, est que les PINN se compl\u00e8tent plut\u00f4t que de remplacer les m\u00e9thodes num\u00e9riques traditionnelles. Les solveurs traditionnels comme ceux couverts dans notre <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentation FIPY<\/a> restent sup\u00e9rieurs pour le transfert standard. probl\u00e8mes. Les pinns excellent lorsque la p\u00e9nurie de donn\u00e9es ou l&rsquo;incertitude des param\u00e8tres rendent les approches purement num\u00e9riques peu pratiques, mais elles ajoutent de la complexit\u00e9 et du co\u00fbt de calcul pour les probl\u00e8mes o\u00f9 les solveurs \u00e9tablis fonctionnent bien.<\/p>\n<hr>\n<h2>Liste de contr\u00f4le pratique<\/h2>\n<p>Avant de lancer une impl\u00e9mentation de PINN, v\u00e9rifiez :<\/p>\n<ol>\n<li>\u2705 <strong>Type de probl\u00e8me<\/strong>&nbsp;: avant (r\u00e9solution PDE) ou inverse (param\u00e8tres estim\u00e9s)&nbsp;?<\/li>\n<li>\u2705 <strong>Nombre de collocations<\/strong>&nbsp;: commencez avec 8&nbsp;192&nbsp;points&nbsp;; Ajuster en fonction des besoins de pr\u00e9cision<\/li>\n<li>\u2705 <strong>Architecture r\u00e9seau<\/strong> : 4 \u00e0 6 couches cach\u00e9es, 50 \u00e0 100 neurones par couche, activation TANH<\/li>\n<li>\u2705 <strong>Optimizer strategy<\/strong>: Adam (20k\u201380k epochs) \u2192 L-BFGS (~30 epochs)<\/li>\n<li>\u2705 <strong>Pond\u00e9ration des pertes<\/strong>&nbsp;: normaliser ou mettre \u00e0 l&rsquo;\u00e9chelle les composants pour \u00e9viter la domination<\/li>\n<li>\u2705 <strong>Calcul d\u00e9riv\u00e9<\/strong>&nbsp;: utiliser <code>torch.func.jacrev<\/code> + <code>vmap<\/code> pour les sorties de valeurs vectorielles par lots<\/li>\n<li>\u2705 <strong>Conditions aux limites<\/strong>&nbsp;: codez comme des contraintes difficiles si possible (r\u00e9duit le fardeau de la formation)<\/li>\n<li>\u2705 <strong>Validation<\/strong>&nbsp;: comparez avec les solutions analytiques connues ou les r\u00e9sultats traditionnels des solveurs<\/li>\n<\/ol>\n<hr>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Les PINN repr\u00e9sentent une approche v\u00e9ritablement nouvelle de la r\u00e9solution de PDE qui comble l&rsquo;\u00e9cart entre l&rsquo;apprentissage automatique bas\u00e9 sur les donn\u00e9es et les m\u00e9thodes num\u00e9riques bas\u00e9es sur la physique. La mise en \u0153uvre de PyTorch pr\u00e9sent\u00e9e ici fournit une base pour s&rsquo;attaquer aux probl\u00e8mes inverses et avanc\u00e9s, mais la m\u00e9thodologie continue d&rsquo;\u00e9voluer.<\/p>\n<p><strong>Pour une exploration plus approfondie<\/strong>, pensez \u00e0&nbsp;:<\/p>\n<ul>\n<li>Strat\u00e9gies de repond\u00e9ration des pertes (LRA, NTK) pour les g\u00e9om\u00e9tries complexes<\/li>\n<li>Approches de d\u00e9composition de domaine (FBPINP) pour les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li>Mod\u00e8les de substitution multifid\u00e9lit\u00e9 combinant des simulations rapides \u00e0 faible fid\u00e9lit\u00e9 avec des donn\u00e9es physiques haute fid\u00e9lit\u00e9<\/li>\n<li>Applications PINN aux syst\u00e8mes ODE dans des contextes biologiques et \u00e9conomiques<\/li>\n<\/ul>\n<p>Si vous \u00e9valuez les PINN pour un probl\u00e8me sp\u00e9cifique, commencez par l&rsquo;impl\u00e9mentation de l&rsquo;\u00e9quation de chaleur avant ci-dessus, validez par rapport aux solutions analytiques, puis \u00e9tendez-vous \u00e0 votre PDE cible. La litt\u00e9rature de r\u00e9f\u00e9rence fournit des indications claires sur le moment o\u00f9 cette approche ajoute de la valeur par rapport au moment o\u00f9 les solveurs traditionnels restent le meilleur choix.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Raissi, M., Perdikaris, P., &amp; Karniadakis, G.E. (2019). R\u00e9seaux de neurones bas\u00e9s sur la physique. <em>Journal de physique computationnelle<\/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 : une suite de benchmarking compl\u00e8te pour les op\u00e9rateurs de neurones. <em>Neurips 2022<\/em>. https:\/\/github.com\/pdebench\/pdebench<\/li>\n<li>Hao, Z., Zheng, M., &amp; Sznaier, M. (2023). Pinnacle&nbsp;: une r\u00e9f\u00e9rence compl\u00e8te pour les r\u00e9seaux de neurones bas\u00e9s sur la physique. <em>arxiv:2306.08827<\/em>. https:\/\/arxiv.org\/html\/2306.08827v1<\/li>\n<li>Chatain, S., et al. (2025). DeepFDM&nbsp;: Int\u00e9grer des solveurs num\u00e9riques dans des architectures neuronales. <em>arxiv:2507.21269<\/em>. https:\/\/arxiv.org\/abs\/2507.21269<\/li>\n<li>Emmert-Streib, F., et al. (2026). DeepXDE pour les syst\u00e8mes ODE&nbsp;: un didacticiel pratique. <em>Fronti\u00e8res en intelligence artificielle<\/em>. https:\/\/www.frontiersin.org\/journals\/artificial-intelligence\/articles\/10.3389\/frai.2026.1717117\/full<\/li>\n<li>Lee, S. (2024). Tutoriels de r\u00e9seaux de neurones bas\u00e9s sur la physique avec PyTorch. https:\/\/lazyjobseeker.github.io\/en\/posts\/physics-informe-neural-network-tutorials\/<\/li>\n<li>Miller, D. (2024). R\u00e9seaux de neurones bas\u00e9s sur la physique \u00e0 l&rsquo;aide de PyTorch. https:\/\/modulelebug.com\/2024\/12\/27\/physics-informe-neural-networks-pinns-using-pytorch\/<\/li>\n<\/ul>\n<hr>\n<p><em>Cet article associe la th\u00e9orie et la mise en \u0153uvre des chercheurs entrant dans l&rsquo;espace Pinn. Pour obtenir des conseils pratiques sur les m\u00e9thodes num\u00e9riques traditionnelles, consultez notre <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentation et exemples de FIPY<\/a> et <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introduction \u00e0 la mod\u00e9lisation des mat\u00e9riaux<\/a>.<\/em><\/p>\n<hr>\n<p><strong>Qu&rsquo;en pensez-vous&nbsp;?<\/strong> Les points ajout\u00e9s ajoutent une surcharge de calcul par rapport aux solveurs traditionnels, mais ils ouvrent des possibilit\u00e9s uniques pour les probl\u00e8mes inverses et l&rsquo;inf\u00e9rence de donn\u00e9es clairsem\u00e9e. Si vous travaillez avec des donn\u00e9es d&rsquo;observation limit\u00e9es, r\u00e9fl\u00e9chissez bien aux compromis. Partagez votre exp\u00e9rience avec les impl\u00e9mentations Pinn dans les commentaires.<\/p>\n<hr>\n<p><strong>pr\u00eat \u00e0 exp\u00e9rimenter&nbsp;?<\/strong> Commencez par le code de l&rsquo;\u00e9quation de chaleur ci-dessus, validez par rapport aux solutions analytiques, puis \u00e9tendez-vous \u00e0 votre probl\u00e8me sp\u00e9cifique. La mise en \u0153uvre compl\u00e8te est disponible \u00e0 des fins \u00e9ducatives &#8211; adaptez-la, testez-la et it\u00e9rez.<\/p>\n<hr>\n<p><a href=\"https:\/\/github.com\/pdebench\/PDEBench\" target=\"_blank\" rel=\"nofollow noopener\">Visitez le r\u00e9f\u00e9rentiel PDEBench<\/a> pour les codes de r\u00e9f\u00e9rence et les jeux de donn\u00e9es.<\/p>\n<p><a href=\"https:\/\/github.com\/i207M\/PINNacle\" target=\"_blank\" rel=\"nofollow noopener\">Explorez l&rsquo;\u00e9valuation compl\u00e8te de Pinnacle<\/a> pour les recommandations sp\u00e9cifiques \u00e0 la m\u00e9thode.<\/p>\n","protected":false,"raw":"<p>Les r\u00e9seaux de neurones bas\u00e9s sur la physique (PINN) r\u00e9solvent des \u00e9quations aux d\u00e9riv\u00e9es partielles en int\u00e9grant des \u00e9quations directement dans les fonctions de perte de r\u00e9seau neuronal, permettant une solution simultan\u00e9e et une estimation des param\u00e8tres sans g\u00e9n\u00e9ration de maillage. Ils combinent la diff\u00e9renciation automatique avec l'optimisation bas\u00e9e sur le gradient pour approximer les solutions PDE - et lorsqu'elles sont combin\u00e9es avec les bonnes strat\u00e9gies d'entra\u00eenement, peuvent r\u00e9cup\u00e9rer des param\u00e8tres physiques \u00e0 partir de donn\u00e9es d'observation clairsem\u00e9es.<\/p>\n<hr>\n<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ol>\n<li>Les pinns int\u00e8grent les r\u00e9sidus de PDE en termes de perte de physique, de sorte que le r\u00e9seau apprend \u00e0 satisfaire \u00e0 la fois les conditions aux limites et les \u00e9quations diff\u00e9rentielles simultan\u00e9ment.<\/li>\n<li><strong>Optimizer hybridization matters<\/strong>: Adam for initial training (20k\u201380k epochs) followed by L-BFGS for fine-tuning (~30 epochs) is the empirically recommended sequence.<\/li>\n<li>Les PINN excellent dans les probl\u00e8mes inverses (estimation des param\u00e8tres) et les r\u00e9gimes de donn\u00e9es clairsem\u00e9es, mais les r\u00e9f\u00e9rences r\u00e9centes montrent qu'ils restent inf\u00e9rieurs aux solveurs num\u00e9riques traditionnels pour les probl\u00e8mes directs.<\/li>\n<li>Le nombre de points de collocation affecte de mani\u00e8re critique la convergence&nbsp;: ~&nbsp;8&nbsp;192&nbsp;points sont souvent une saturation suffisante&nbsp;; Au-del\u00e0 de cela, les gains sont marginaux \u00e0 un co\u00fbt de calcul important.<\/li>\n<li><code>torch.func.jacrev<\/code> + <code>torch.func.vmap<\/code> est requis pour le calcul jacobien dans les PINN multi-sorties \u2014 pur <code>torch.autograd.grad<\/code> \u00e9choue pour les mod\u00e8les par lots \u00e0 valeur vectorielle.<\/li>\n<li>Les techniques d'\u00e9quilibrage des pertes (LRA, repond\u00e9ration bas\u00e9e sur NTK) et la d\u00e9composition de domaine (FBPINP) traitent du taux d'\u00e9chec de la t\u00e2che d'environ 60&nbsp;% des pins \u00e0 la vanille r\u00e9v\u00e9l\u00e9s par le Pinnacle Benchmark.<\/li>\n<\/ol>\n<hr>\n<h2>Que sont les r\u00e9seaux de neurones bas\u00e9s sur la physique ?<\/h2>\n<p>Les PINN ont \u00e9t\u00e9 introduits par Raissi, Perdikaris et Karniadakis en 2019 comme une approche sans maillage pour r\u00e9soudre les PDE \u00e0 l'aide de r\u00e9seaux de neurones profonds. Cela repr\u00e9sente un changement important par rapport aux m\u00e9thodes traditionnelles bas\u00e9es sur le maillage telles que les approches par \u00e9l\u00e9ments finis et \u00e0 diff\u00e9rences finies couvertes dans notre <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introduction \u00e0 la mod\u00e9lisation des mat\u00e9riaux<\/a>. L'id\u00e9e de base est \u00e9l\u00e9gante mais pratiquement subtile : au lieu de discr\u00e9tiser le domaine en un maillage (comme dans les m\u00e9thodes d'\u00e9l\u00e9ments finis ou de diff\u00e9rences finies), vous d\u00e9finissez la solution comme un r\u00e9seau neuronal continu et p\u00e9nalisez les violations de la physique qui gouvernent pendant la formation.<\/p>\n<p>Envisagez une PDE g\u00e9n\u00e9rique&nbsp;:<\/p>\n<pre><code>\ud835\udca9(u(x,t), x, t) = 0,   (x,t) \u2208 \u03a9\n<\/code><\/pre>\n<p>o\u00f9 <code>\ud835\udca9<\/code> est un op\u00e9rateur diff\u00e9rentiel, <code>u(x,t)<\/code> est la solution inconnue et <code>\u03a9<\/code> est le domaine spatial-temporel. Un PINN param\u00e9trelle <code>u<\/code> comme un r\u00e9seau de neurones <code>u(x,t; \u03b8)<\/code> avec des poids <code>\u03b8<\/code>. La fonction de perte combine trois composants :<\/p>\n<pre><code>Loss(\u03b8) = LossPhysics + LossBoundary + LossData\n<\/code><\/pre>\n<ul>\n<li><strong>Lossphysics<\/strong>&nbsp;: le r\u00e9sidu PDE <code>\ud835\udca9(u(x,t; \u03b8))<\/code> \u00e9valu\u00e9 aux points de collocation \u00e9chantillonn\u00e9s dans le domaine.<\/li>\n<li><strong>Lossboundary<\/strong>&nbsp;: violation des conditions limites et initiales.<\/li>\n<li><strong>Data LossData<\/strong>&nbsp;: (facultatif) Discordance entre les valeurs pr\u00e9dites et les donn\u00e9es d'observation clairsem\u00e9es.<\/li>\n<\/ul>\n<p>Le r\u00e9seau est form\u00e9 pour minimiser <code>Loss(\u03b8)<\/code> en utilisant la descente de gradient, et le r\u00e9seau r\u00e9sultant fournit une approximation continue et diff\u00e9renciable de la solution sur l'ensemble du domaine.<\/p>\n<hr>\n<h2>G\u00e9n\u00e9ration de points de collocation<\/h2>\n<p>Le choix et la distribution des points de collocation sont sans doute l'hyperparam\u00e8tre le plus important dans l'entra\u00eenement de Pinn. Les points de collocation sont les emplacements o\u00f9 le r\u00e9sidu PDE est \u00e9valu\u00e9 pour calculer la perte physique.<\/p>\n<h3>Strat\u00e9gie<\/h3>\n<p>L'approche standard des \u00e9chantillons pointe uniform\u00e9ment \u00e0 travers le domaine. Pour un domaine spatial 1D <code>[x_min, x_max]<\/code> et un domaine temporel <code>[t_min, t_max]<\/code>, vous g\u00e9n\u00e9rez <code>N_spatial<\/code> points spatiaux et <code>N_temporal<\/code> points temporels, puis formez une grille de points de collocation <code>N_total = N_spatial \u00d7 N_temporal<\/code>.<\/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>Sensibilit\u00e9 au nombre de points<\/h3>\n<p>Les exp\u00e9riences de Pinnacle Benchmark d\u00e9montrent que la taille des lots (nombre de points de collocation) affecte consid\u00e9rablement la convergence. L'\u00e9tude de mise \u00e0 l'\u00e9chelle progressive a r\u00e9v\u00e9l\u00e9:<\/p>\n<ul>\n<li><strong>512&nbsp;points<\/strong>&nbsp;: converge mais conserve une erreur relativement \u00e9lev\u00e9e<\/li>\n<li><strong>8&nbsp;192&nbsp;points<\/strong>&nbsp;: saturation souvent suffisante pour une pr\u00e9cision mod\u00e9r\u00e9e<\/li>\n<li><strong>3&nbsp;2&nbsp;768&nbsp;points<\/strong>&nbsp;: am\u00e9lioration marginale des erreurs \u00e0 un co\u00fbt de calcul important<\/li>\n<\/ul>\n<p>Pour la plupart des fins pratiques, 8192 points de collocation offrent une pr\u00e9cision ad\u00e9quate sans surcharge de calcul excessive. L'id\u00e9e cl\u00e9 est que plus de points ne signifient pas toujours une meilleure convergence - le paysage des pertes peut devenir plus complexe avec le sur\u00e9chantillonnage et la diminution des rendements rapidement.<\/p>\n<h3>\u00c9chantillonnage adaptatif (avanc\u00e9)<\/h3>\n<p>Pour d\u00e9fier les PDE avec des gradients ou des discontinuit\u00e9s localis\u00e9s, le raffinement adaptatif bas\u00e9 sur les r\u00e9sidus (RAR) peut r\u00e9\u00e9chantillonner dynamiquement les points de collocation pour se concentrer sur les r\u00e9gions avec des r\u00e9sidus de PDE \u00e9lev\u00e9s. Cette approche aborde l'un des principaux modes de d\u00e9faillance de l'\u00e9chantillonnage uniforme dans les t\u00e2ches de g\u00e9om\u00e9trie complexe de Pinnacle.<\/p>\n<hr>\n<h2>Probl\u00e8me avanc\u00e9&nbsp;: r\u00e9solution de l'\u00e9quation de la chaleur<\/h2>\n<p>Le probl\u00e8me d'avance demande&nbsp;: \u00e9tant donn\u00e9 une PDE et des conditions initiales\/limites, trouvez la solution. Nous allons r\u00e9soudre l'\u00e9quation de chaleur 1D&nbsp;:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1 \u2202\u00b2u\/\u2202x\u00b2,   x \u2208 [0, 1], t \u2208 [0, T]\n<\/code><\/pre>\n<p>avec condition initiale <code>u(x, 0) = f(x)<\/code> et conditions aux limites <code>u(0, t) = u(L, t) = 0<\/code>.<\/p>\n<h3>Architecture r\u00e9seau<\/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>Calcul des d\u00e9riv\u00e9s avec autograd<\/h3>\n<p>L'innovation critique de PINN consiste \u00e0 calculer les d\u00e9riv\u00e9s de la sortie du r\u00e9seau par rapport \u00e0 ses entr\u00e9es en utilisant la diff\u00e9renciation automatique. Pour l'\u00e9quation de la chaleur, nous avons besoin :<\/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>Note importante<\/strong>&nbsp;: l'approche <code>torch.autograd.grad<\/code> ci-dessus fonctionne pour les r\u00e9seaux \u00e0 sortie unique, mais <strong>\u00e9choue pour les mod\u00e8les \u00e0 valeur vectorielle batched<\/strong>. Comme d\u00e9montr\u00e9 dans les tutoriels r\u00e9cents de PyTorch, <code>torch.func.jacrev<\/code> combin\u00e9 avec <code>torch.func.vmap<\/code> est requis pour un calcul jacobien appropri\u00e9 lorsque le r\u00e9seau produit des sorties \u00e0 valeur vectorielle sur des entr\u00e9es par lots. Voir la section Impl\u00e9mentation avanc\u00e9e ci-dessous.<\/p>\n<h3>Boucle d'entra\u00eenement<\/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>Probl\u00e8me inverse : estimation des param\u00e8tres<\/h2>\n<p>Le probl\u00e8me inverse demande&nbsp;: \u00e9tant donn\u00e9 des donn\u00e9es d'observation clairsem\u00e9es, identifiez des param\u00e8tres inconnus dans les \u00e9quations gouvernantes. C'est l\u00e0 que les PINN brillent vraiment - les solveurs traditionnels exigent que vous sp\u00e9cifiez tous les param\u00e8tres \u00e0 l'avance, tandis que les PINN peuvent <strong>apprends-les<\/strong> \u00e0 partir des donn\u00e9es simultan\u00e9ment.<\/p>\n<h3>Configuration du probl\u00e8me<\/h3>\n<p>Consid\u00e9rez la m\u00eame \u00e9quation de chaleur mais avec un coefficient de diffusion <strong>inconnu<\/strong> <code>\u03b1<\/code>&nbsp;:<\/p>\n<pre><code>\u2202u\/\u2202t = \u03b1(\u03b8) \u2202\u00b2u\/\u2202x\u00b2\n<\/code><\/pre>\n<p>o\u00f9 <code>\u03b1(\u03b8)<\/code> est param\u00e9tr\u00e9 en tant que scalaire formable au sein du r\u00e9seau.<\/p>\n<h3>R\u00e9seau modifi\u00e9 pour les probl\u00e8mes inverses<\/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>Formation avec estimation des param\u00e8tres<\/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>Le probl\u00e8me inverse montre l'avantage unique de Pinn : au lieu de r\u00e9soudre un PDE avec des param\u00e8tres connus, le r\u00e9seau d\u00e9couvre simultan\u00e9ment la solution et identifie les constantes physiques qui gouvernent. Ceci est particuli\u00e8rement utile dans les contextes exp\u00e9rimentaux o\u00f9 les param\u00e8tres sont difficiles ou co\u00fbteux \u00e0 mesurer directement.<\/p>\n<hr>\n<h2>Impl\u00e9mentation avanc\u00e9e : torch.func pour les sorties \u00e0 valeur vectorielle<\/h2>\n<p>L'approche standard <code>torch.autograd.grad<\/code> pr\u00e9sent\u00e9e ci-dessus fonctionne pour les r\u00e9seaux simples \u00e0 sortie unique. Cependant, lorsque vous batchez des entr\u00e9es pour l'efficacit\u00e9, le r\u00e9seau produit des sorties \u00e0 valeur vectorielle et <code>torch.autograd.grad<\/code> seul \u00e9choue.<\/p>\n<p>L'approche correcte utilise <code>torch.func.jacrev<\/code> combin\u00e9e avec <code>torch.func.vmap<\/code>&nbsp;:<\/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>Cette approche n'est pas mentionn\u00e9e dans la plupart des didacticiels PIN, mais est essentielle pour un bon calcul de gradient lors de la formation avec de gros lots. Sans cela, vous pouvez rencontrer des \u00e9checs silencieux ou des gradients incorrects.<\/p>\n<hr>\n<h2>Strat\u00e9gie d'optimiseur : ADAM \u2192 Hybridation L-BFGS<\/h2>\n<p>Le choix de l'optimiseur affecte de mani\u00e8re critique la convergence de PINN. Les \u00e9tudes empiriques et les r\u00e9sultats de r\u00e9f\u00e9rence recommandent syst\u00e9matiquement une approche en deux phases :<\/p>\n<h3>Phase 1 : Formation 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>L'\u00e9lan d'Adam aide le r\u00e9seau \u00e0 \u00e9chapper \u00e0 des r\u00e9gions initiales pauvres du paysage des pertes. Cependant, Adam seul converge souvent lentement et peut caler \u00e0 un plateau de perte sous-optimal.<\/p>\n<h3>Phase 2 : raffinement L-BFGS<\/h3>\n<pre><code>Epochs: ~30\u201350\nPurpose: Fine-tuning, reaching final accuracy\n<\/code><\/pre>\n<p>L-BFGS (Limited-Memory Broyden\u2013Fletcher\u2013Rawstorff) effectue la recherche en ligne et les mises \u00e0 jour quasi-Newton, affinant rapidement la solution une fois qu'Adam a rapproch\u00e9 le r\u00e9seau de l'optimum.<\/p>\n<h3>Ex\u00e9cution<\/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>Pourquoi cela fonctionne<\/strong>&nbsp;: L-BFGS \u00e0 lui seul diverge souvent de l'initialisation al\u00e9atoire car sa recherche de ligne \u00e9choue lorsque le gradient initial pointe dans la mauvaise direction. Adam fournit l'exploration mondiale n\u00e9cessaire pour atteindre un bon bassin d'attraction, apr\u00e8s quoi L-BFGS converge rapidement vers une grande pr\u00e9cision. Cette s\u00e9quence n'est pas mentionn\u00e9e dans la plupart des didacticiels mais est essentielle pour une convergence fiable.<\/p>\n<hr>\n<h2>Contexte de r\u00e9f\u00e9rence&nbsp;: que montrent des \u00e9tudes r\u00e9centes&nbsp;?<\/h2>\n<p>Comprendre o\u00f9 se situe les PINN par rapport aux solveurs traditionnels n\u00e9cessite d'examiner les \u00e9tudes de r\u00e9f\u00e9rence r\u00e9centes. Ce contexte est crucial pour les lecteurs qui souhaitent comprendre comment les approches neuronales se comparent aux m\u00e9thodes \u00e9tablies - un th\u00e8me central de notre couverture de <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\" target=\"_blank\" rel=\"noopener\">Ce que la simulation scientifique signifie r\u00e9ellement<\/a> dans la recherche moderne. Trois grands efforts fournissent des preuves quantitatives concr\u00e8tes :<\/p>\n<h3>PDEBench : indice de r\u00e9f\u00e9rence des op\u00e9rateurs neuronaux<\/h3>\n<p>PDEbench (Takamoto et al., Neurips 2022) compare les PINN, les op\u00e9rateurs de neurones de Fourier (FNOS) et les architectures U-Net dans plusieurs cat\u00e9gories de PDE. Principale constatation : Les FNO n\u00e9cessitent des donn\u00e9es d'entra\u00eenement pr\u00e9-g\u00e9n\u00e9r\u00e9es et apprennent \u00e0 cartographier des vari\u00e9t\u00e9s de solutions enti\u00e8res, tandis que les PINN r\u00e9solvent des probl\u00e8mes par instance sans aucune pr\u00e9-formation. Cette distinction rend les PINN fondamentalement diff\u00e9rents des op\u00e9rateurs neuronaux&nbsp;: ils peuvent r\u00e9soudre les probl\u00e8mes inverses et s'adapter aux conditions aux limites invisibles, mais ils s'entra\u00eenent \u00e0 partir de z\u00e9ro pour chaque nouvelle instance.<\/p>\n<p>Les visualisations de PDEbench d\u00e9montrent la diversit\u00e9 des probl\u00e8mes que les pinns peuvent r\u00e9soudre - syst\u00e8mes de r\u00e9action-r\u00e9action, \u00e9quations d'eau peu profonde, flux de Navier-Stokes - illustrant \u00e0 la fois la flexibilit\u00e9 et l'\u00e9tendue de l'application.<\/p>\n<h3>Pinnacle&nbsp;: \u00c9valuation syst\u00e9matique de la m\u00e9thode<\/h3>\n<p>Le Pinnacle Benchmark (Hao et al., 2023) fournit l'\u00e9valuation la plus compl\u00e8te des variantes de PiNN dans 22&nbsp;cas de test. La d\u00e9couverte critique :<\/p>\n<blockquote><p><strong>Pinns \u00e0 la vanille ne r\u00e9solvent que 9 des 22&nbsp;t\u00e2ches (\u2264&nbsp;40&nbsp;%)<\/strong> \u00e0 un seuil de pr\u00e9cision raisonnable.<\/p><\/blockquote>\n<p>Recommandations sp\u00e9cifiques \u00e0 la m\u00e9thode de Pinnacle&nbsp;:<\/p>\n<ul>\n<li><strong>PINN-LRA<\/strong> (Analyse de la repond\u00e9ration des pertes)&nbsp;: id\u00e9al pour les g\u00e9om\u00e9tries complexes<\/li>\n<li><strong>PINN-NTK<\/strong> (Neural Tangent Kernel) : efficace pour les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li><strong>FBPINP<\/strong> (pinn \u00e9quilibr\u00e9 fondamental)&nbsp;: la d\u00e9composition du domaine excelle dans les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li><strong>HP-VPINP \/ GPINP<\/strong>&nbsp;: les formulations variationnelles excellent dans les probl\u00e8mes inverses<\/li>\n<\/ul>\n<p>Ces r\u00e9sultats sugg\u00e8rent que les PINN bruts ont souvent des difficult\u00e9s \u00e0 s'attaquer \u00e0 des PDE difficiles, mais les variantes de m\u00e9thodes cibl\u00e9es traitent des modes de d\u00e9faillance sp\u00e9cifiques.<\/p>\n<h3>DeepFDM 2025 : Solveurs num\u00e9riques diff\u00e9rentiables-num\u00e9riques<\/h3>\n<p>Le cadre DeepFDM de Chatain et al. (juillet 2025) a introduit une nouvelle base comparative qui int\u00e8gre la discr\u00e9tisation avanc\u00e9e-Euler directement dans l'architecture CNN. Les r\u00e9sultats d\u00e9fient le r\u00e9cit \"les approches neuronales sont sup\u00e9rieures\"&nbsp;:<\/p>\n<ul>\n<li><strong>Les solveurs num\u00e9riques surpassent les op\u00e9rateurs neuronaux d'environ 1&nbsp;ordre de grandeur en pr\u00e9cision<\/strong><\/li>\n<li><strong>DeepFDM utilise 10 \u00e0 20 \u00d7 moins d'\u00e9poques<\/strong> que les FNO<\/li>\n<li><strong>5 \u00e0 50&nbsp;\u00d7&nbsp;param\u00e8tres<\/strong> que les approches des op\u00e9rateurs neuronaux<\/li>\n<\/ul>\n<p>Cela sugg\u00e8re que les approches num\u00e9riques num\u00e9riques hybrides repr\u00e9sentent un terrain d'entente pratique entre les solveurs bas\u00e9s sur la physique pure et les m\u00e9thodes neuronales enti\u00e8rement bas\u00e9es sur les donn\u00e9es.<\/p>\n<hr>\n<h2>Comparaison : DeepXDE vs Pure Pytorch<\/h2>\n<p>Diff\u00e9rents cadres de mise en \u0153uvre offrent des compromis distincts. Voici une comparaison pratique :<\/p>\n<table>\n<thead>\n<tr>\n<th>Fonctionnalit\u00e9<\/th>\n<th>DeepXDE<\/th>\n<th>Torche pure<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>D\u00e9finition PDE<\/strong><\/td>\n<td>Classes int\u00e9gr\u00e9es (ODE, PDE, etc.)<\/td>\n<td>Calcul r\u00e9siduel manuel<\/td>\n<\/tr>\n<tr>\n<td><strong>Calcul d\u00e9riv\u00e9<\/strong><\/td>\n<td>abstrait en interne<\/td>\n<td>explicite <code>torch.autograd.grad<\/code> ou <code>torch.func<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Acc\u00e8s aux pertes individuelles<\/strong><\/td>\n<td>\u274c Pas d'acc\u00e8s direct aux pertes par composant<\/td>\n<td>\u2705 Contr\u00f4le total de chaque terme de perte<\/td>\n<\/tr>\n<tr>\n<td><strong>Fronti\u00e8res complexes<\/strong><\/td>\n<td>\u274c Non impl\u00e9ment\u00e9<\/td>\n<td>\u2705 G\u00e9om\u00e9trie enti\u00e8rement personnalisable<\/td>\n<\/tr>\n<tr>\n<td><strong>Option de taille de lot<\/strong><\/td>\n<td>\u274c Partiellement mis en \u0153uvre<\/td>\n<td>\u2705 Contr\u00f4le par lots complet<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilit\u00e9 Pytorch<\/strong><\/td>\n<td>\u26a0\ufe0f Probl\u00e8mes avec les derni\u00e8res versions<\/td>\n<td>\u2705 Toujours \u00e0 jour<\/td>\n<\/tr>\n<tr>\n<td><strong>Courbe d'apprentissage<\/strong><\/td>\n<td>Plus bas (l'abstraction masque la complexit\u00e9)<\/td>\n<td>Plus haut (Transparence totale)<\/td>\n<\/tr>\n<tr>\n<td><strong>Formation personnalis\u00e9e<\/strong><\/td>\n<td>Contr\u00f4le de rappel limit\u00e9<\/td>\n<td>Contr\u00f4le total<\/td>\n<\/tr>\n<tr>\n<td><strong>Probl\u00e8mes inverses<\/strong><\/td>\n<td>Prise en charge via des param\u00e8tres d'apprentissage<\/td>\n<td>Prise en charge via des param\u00e8tres d'apprentissage<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Recommandation<\/strong>&nbsp;: utilisez DeepXDE lorsque vous avez besoin d'un prototypage rapide avec des PDE standard et acceptez ses limitations connues. Pour un aper\u00e7u plus large des outils de simulation et des flux de travail de mod\u00e9lisation, explorez nos <a href=\"https:\/\/matforge.org\/category\/simulation-modeling-projects\/\" target=\"_blank\" rel=\"noopener\">Simulation et mod\u00e9lisation Projets<\/a>. Utilisez Pure PyTorch lorsque vous avez besoin d'une transparence totale, d'une pond\u00e9ration personnalis\u00e9e des pertes et d'une compatibilit\u00e9 avec les derni\u00e8res fonctionnalit\u00e9s de PyTorch, en particulier pour les syst\u00e8mes de recherche ou de production o\u00f9 le contr\u00f4le des pertes est important. Utilisez Pure PyTorch lorsque vous avez besoin d'une transparence totale, d'une pond\u00e9ration personnalis\u00e9e des pertes et d'une compatibilit\u00e9 avec les derni\u00e8res fonctionnalit\u00e9s de PyTorch, en particulier pour les syst\u00e8mes de recherche ou de production o\u00f9 le contr\u00f4le des pertes est important.<\/p>\n<hr>\n<h2>D\u00e9pannage des modes de panne courants<\/h2>\n<p>M\u00eame avec une impl\u00e9mentation correcte, les PINN peuvent ne pas converger. Le Pinnacle Benchmark identifie plusieurs mod\u00e8les d'\u00e9chec et leurs recours.<\/p>\n<h3>1. Pathologies de gradient<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: les sorties r\u00e9seau saturent (les gradients approchent de z\u00e9ro) ou explosent pendant l'entra\u00eenement.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: le paysage des pertes a des r\u00e9gions avec des gradients extr\u00eamement raides ou plats, en particulier lorsque les \u00e9chelles de perte physique et de perte de limites sont incompatibles.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Appliquer la repond\u00e9ration des pertes \u00e0 l'aide de la LRA (analyse de la repond\u00e9ration des pertes) ou des m\u00e9thodes bas\u00e9es sur NTK<\/li>\n<li>Normaliser chaque terme de perte \u00e0 des magnitudes similaires avant la sommation<\/li>\n<li>Utiliser l'extrait de d\u00e9grad\u00e9&nbsp;: <code>torch.nn.utils.clip_grad_norm_(net.parameters(), max_norm=1.0)<\/code><\/li>\n<\/ul>\n<h3>2. Biais spectral<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: le r\u00e9seau apprend les composants \u00e0 basse fr\u00e9quence de la solution, mais \u00e9choue \u00e0 des fr\u00e9quences plus \u00e9lev\u00e9es.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: R\u00e9seaux de neurones avec activations TANH\/sigmo\u00efdes biaisent naturellement vers des fr\u00e9quences plus basses pendant l'entra\u00eenement - un ph\u00e9nom\u00e8ne bien document\u00e9 dans la litt\u00e9rature sur les r\u00e9seaux de neurones.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Utilisez des int\u00e9grations de fonctionnalit\u00e9s de Fourier (encodage de position) pour acc\u00e9l\u00e9rer la convergence \u00e0 des fr\u00e9quences plus \u00e9lev\u00e9es<\/li>\n<li>Augmenter la largeur du r\u00e9seau (100 \u00e0 200 neurones par couche au lieu de 50 \u00e0 100)<\/li>\n<li>Utilisez des activations sinus au lieu de TANH pour une meilleure repr\u00e9sentation \u00e0 haute fr\u00e9quence<\/li>\n<\/ul>\n<h3>3. D\u00e9s\u00e9quilibre des pertes<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: un terme de perte domine pendant l'entra\u00eenement, provoquant une mauvaise convergence d'autres composants.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: les r\u00e9sidus physiques, les violations de limites et les pertes de donn\u00e9es op\u00e8rent \u00e0 diff\u00e9rentes \u00e9chelles.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Poids de la perte d'\u00e9chelle dynamiquement pendant l'entra\u00eenement en fonction des amplitudes de perte de courant<\/li>\n<li>Commencez avec des poids plus \u00e9lev\u00e9s pour les conditions aux limites, passez progressivement \u00e0 la perte de physique<\/li>\n<li>Surveillez chaque composante de perte s\u00e9par\u00e9ment et ajustez les poids de mani\u00e8re interactive<\/li>\n<\/ul>\n<h3>4. Sensibilit\u00e9 au point de collocation<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: la perte oscille ou converge lentement malgr\u00e9 un nombre important de points.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: trop peu de points produisent une contrainte insuffisante&nbsp;; Trop de points cr\u00e9ent un paysage d'optimisation difficile.<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Commencez avec 8192 points de collocation comme ligne de base (point de saturation de Pinnacle)<\/li>\n<li>Utilisez le raffinement adaptatif (RAR) pour les EDP difficiles<\/li>\n<li>Entra\u00eenement par lots&nbsp;: exemple de points d'\u00e9chantillonnage dynamiques pendant l'entra\u00eenement plut\u00f4t que de pr\u00e9-calculer tous les points<\/li>\n<\/ul>\n<h3>5. Non-identifiabilit\u00e9 du probl\u00e8me inverse<\/h3>\n<p><strong>Sympt\u00f4me<\/strong>&nbsp;: les param\u00e8tres estim\u00e9s d\u00e9rivent ou convergent vers des valeurs erron\u00e9es.<\/p>\n<p><strong>Cause<\/strong>&nbsp;: plusieurs combinaisons de param\u00e8tres produisent des surfaces de solution similaires (probl\u00e8mes d'identification).<\/p>\n<p><strong>Rem\u00e8de<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Augmenter la couverture des points de donn\u00e9es dans le domaine<\/li>\n<li>Ajouter une r\u00e9gularisation sur les estimations de param\u00e8tres<\/li>\n<li>Utiliser les connaissances ant\u00e9rieures pour contraindre les plages de param\u00e8tres<\/li>\n<\/ul>\n<hr>\n<h2>Quand utiliser les PINN (et quand ne pas le faire)<\/h2>\n<p>Les r\u00e9sultats de r\u00e9f\u00e9rence le montrent clairement&nbsp;: les PINN ne remplacent pas universellement les solveurs traditionnels. Il est essentiel de comprendre quand ils sont appropri\u00e9s.<\/p>\n<h3>PINS EXCELLIT :<\/h3>\n<ul>\n<li><strong>Probl\u00e8mes inverses<\/strong> (estimation des param\u00e8tres \u00e0 partir de donn\u00e9es clairsem\u00e9es)<\/li>\n<li><strong>R\u00e9gimes de donn\u00e9es rares<\/strong> o\u00f9 les donn\u00e9es d'observation sont limit\u00e9es mais pr\u00e9cieuses<\/li>\n<li><strong>Inf\u00e9rence en temps r\u00e9el<\/strong> apr\u00e8s la formation (le r\u00e9seau fournit des solutions continues et diff\u00e9renciables)<\/li>\n<li><strong>Probl\u00e8mes de grande dimension<\/strong> o\u00f9 la g\u00e9n\u00e9ration de maillage devient impraticable<\/li>\n<li><strong>Probl\u00e8mes inverses entre les deux et l'avant<\/strong> (r\u00e9solution et estimation simultan\u00e9es)<\/li>\n<\/ul>\n<h3>Les solveurs traditionnels restent sup\u00e9rieurs pour :<\/h3>\n<ul>\n<li><strong>Probl\u00e8mes de transmission standard<\/strong> avec des param\u00e8tres connus (FEM\/FDM sont plus rapides et plus pr\u00e9cis)<\/li>\n<li><strong>PDES lin\u00e9aires<\/strong> o\u00f9 des algorithmes bien \u00e9tablis existent<\/li>\n<li><strong>Exigences \u00e9lev\u00e9es en mati\u00e8re de pr\u00e9cision<\/strong> lorsque la pr\u00e9cision de la machine est n\u00e9cessaire<\/li>\n<li><strong>Simulations industrielles \u00e0 grande \u00e9chelle<\/strong> o\u00f9 l'efficacit\u00e9 des calculs domine<\/li>\n<\/ul>\n<p>L'\u00e9valuation honn\u00eate, soutenue par les rep\u00e8res PDEbench, Pinnacle et DeepFDM, est que les PINN se compl\u00e8tent plut\u00f4t que de remplacer les m\u00e9thodes num\u00e9riques traditionnelles. Les solveurs traditionnels comme ceux couverts dans notre <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentation FIPY<\/a> restent sup\u00e9rieurs pour le transfert standard. probl\u00e8mes. Les pinns excellent lorsque la p\u00e9nurie de donn\u00e9es ou l'incertitude des param\u00e8tres rendent les approches purement num\u00e9riques peu pratiques, mais elles ajoutent de la complexit\u00e9 et du co\u00fbt de calcul pour les probl\u00e8mes o\u00f9 les solveurs \u00e9tablis fonctionnent bien.<\/p>\n<hr>\n<h2>Liste de contr\u00f4le pratique<\/h2>\n<p>Avant de lancer une impl\u00e9mentation de PINN, v\u00e9rifiez :<\/p>\n<ol>\n<li>\u2705 <strong>Type de probl\u00e8me<\/strong>&nbsp;: avant (r\u00e9solution PDE) ou inverse (param\u00e8tres estim\u00e9s)&nbsp;?<\/li>\n<li>\u2705 <strong>Nombre de collocations<\/strong>&nbsp;: commencez avec 8&nbsp;192&nbsp;points&nbsp;; Ajuster en fonction des besoins de pr\u00e9cision<\/li>\n<li>\u2705 <strong>Architecture r\u00e9seau<\/strong> : 4 \u00e0 6 couches cach\u00e9es, 50 \u00e0 100 neurones par couche, activation TANH<\/li>\n<li>\u2705 <strong>Optimizer strategy<\/strong>: Adam (20k\u201380k epochs) \u2192 L-BFGS (~30 epochs)<\/li>\n<li>\u2705 <strong>Pond\u00e9ration des pertes<\/strong>&nbsp;: normaliser ou mettre \u00e0 l'\u00e9chelle les composants pour \u00e9viter la domination<\/li>\n<li>\u2705 <strong>Calcul d\u00e9riv\u00e9<\/strong>&nbsp;: utiliser <code>torch.func.jacrev<\/code> + <code>vmap<\/code> pour les sorties de valeurs vectorielles par lots<\/li>\n<li>\u2705 <strong>Conditions aux limites<\/strong>&nbsp;: codez comme des contraintes difficiles si possible (r\u00e9duit le fardeau de la formation)<\/li>\n<li>\u2705 <strong>Validation<\/strong>&nbsp;: comparez avec les solutions analytiques connues ou les r\u00e9sultats traditionnels des solveurs<\/li>\n<\/ol>\n<hr>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Les PINN repr\u00e9sentent une approche v\u00e9ritablement nouvelle de la r\u00e9solution de PDE qui comble l'\u00e9cart entre l'apprentissage automatique bas\u00e9 sur les donn\u00e9es et les m\u00e9thodes num\u00e9riques bas\u00e9es sur la physique. La mise en \u0153uvre de PyTorch pr\u00e9sent\u00e9e ici fournit une base pour s'attaquer aux probl\u00e8mes inverses et avanc\u00e9s, mais la m\u00e9thodologie continue d'\u00e9voluer.<\/p>\n<p><strong>Pour une exploration plus approfondie<\/strong>, pensez \u00e0&nbsp;:<\/p>\n<ul>\n<li>Strat\u00e9gies de repond\u00e9ration des pertes (LRA, NTK) pour les g\u00e9om\u00e9tries complexes<\/li>\n<li>Approches de d\u00e9composition de domaine (FBPINP) pour les probl\u00e8mes multi-\u00e9chelles<\/li>\n<li>Mod\u00e8les de substitution multifid\u00e9lit\u00e9 combinant des simulations rapides \u00e0 faible fid\u00e9lit\u00e9 avec des donn\u00e9es physiques haute fid\u00e9lit\u00e9<\/li>\n<li>Applications PINN aux syst\u00e8mes ODE dans des contextes biologiques et \u00e9conomiques<\/li>\n<\/ul>\n<p>Si vous \u00e9valuez les PINN pour un probl\u00e8me sp\u00e9cifique, commencez par l'impl\u00e9mentation de l'\u00e9quation de chaleur avant ci-dessus, validez par rapport aux solutions analytiques, puis \u00e9tendez-vous \u00e0 votre PDE cible. La litt\u00e9rature de r\u00e9f\u00e9rence fournit des indications claires sur le moment o\u00f9 cette approche ajoute de la valeur par rapport au moment o\u00f9 les solveurs traditionnels restent le meilleur choix.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Raissi, M., Perdikaris, P., &amp; Karniadakis, G.E. (2019). R\u00e9seaux de neurones bas\u00e9s sur la physique. <em>Journal de physique computationnelle<\/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 : une suite de benchmarking compl\u00e8te pour les op\u00e9rateurs de neurones. <em>Neurips 2022<\/em>. https:\/\/github.com\/pdebench\/pdebench<\/li>\n<li>Hao, Z., Zheng, M., &amp; Sznaier, M. (2023). Pinnacle&nbsp;: une r\u00e9f\u00e9rence compl\u00e8te pour les r\u00e9seaux de neurones bas\u00e9s sur la physique. <em>arxiv:2306.08827<\/em>. https:\/\/arxiv.org\/html\/2306.08827v1<\/li>\n<li>Chatain, S., et al. (2025). DeepFDM&nbsp;: Int\u00e9grer des solveurs num\u00e9riques dans des architectures neuronales. <em>arxiv:2507.21269<\/em>. https:\/\/arxiv.org\/abs\/2507.21269<\/li>\n<li>Emmert-Streib, F., et al. (2026). DeepXDE pour les syst\u00e8mes ODE&nbsp;: un didacticiel pratique. <em>Fronti\u00e8res en intelligence artificielle<\/em>. https:\/\/www.frontiersin.org\/journals\/artificial-intelligence\/articles\/10.3389\/frai.2026.1717117\/full<\/li>\n<li>Lee, S. (2024). Tutoriels de r\u00e9seaux de neurones bas\u00e9s sur la physique avec PyTorch. https:\/\/lazyjobseeker.github.io\/en\/posts\/physics-informe-neural-network-tutorials\/<\/li>\n<li>Miller, D. (2024). R\u00e9seaux de neurones bas\u00e9s sur la physique \u00e0 l'aide de PyTorch. https:\/\/modulelebug.com\/2024\/12\/27\/physics-informe-neural-networks-pinns-using-pytorch\/<\/li>\n<\/ul>\n<hr>\n<p><em>Cet article associe la th\u00e9orie et la mise en \u0153uvre des chercheurs entrant dans l'espace Pinn. Pour obtenir des conseils pratiques sur les m\u00e9thodes num\u00e9riques traditionnelles, consultez notre <a href=\"https:\/\/matforge.org\/category\/fipy-documentation-examples-development\/\" target=\"_blank\" rel=\"noopener\">documentation et exemples de FIPY<\/a> et <a href=\"https:\/\/matforge.org\/introduction-to-materials-modeling-for-beginners\/\" target=\"_blank\" rel=\"noopener\">Introduction \u00e0 la mod\u00e9lisation des mat\u00e9riaux<\/a>.<\/em><\/p>\n<hr>\n<p><strong>Qu'en pensez-vous&nbsp;?<\/strong> Les points ajout\u00e9s ajoutent une surcharge de calcul par rapport aux solveurs traditionnels, mais ils ouvrent des possibilit\u00e9s uniques pour les probl\u00e8mes inverses et l'inf\u00e9rence de donn\u00e9es clairsem\u00e9e. Si vous travaillez avec des donn\u00e9es d'observation limit\u00e9es, r\u00e9fl\u00e9chissez bien aux compromis. Partagez votre exp\u00e9rience avec les impl\u00e9mentations Pinn dans les commentaires.<\/p>\n<hr>\n<p><strong>pr\u00eat \u00e0 exp\u00e9rimenter&nbsp;?<\/strong> Commencez par le code de l'\u00e9quation de chaleur ci-dessus, validez par rapport aux solutions analytiques, puis \u00e9tendez-vous \u00e0 votre probl\u00e8me sp\u00e9cifique. La mise en \u0153uvre compl\u00e8te est disponible \u00e0 des fins \u00e9ducatives - adaptez-la, testez-la et it\u00e9rez.<\/p>\n<hr>\n<p><a href=\"https:\/\/github.com\/pdebench\/PDEBench\" target=\"_blank\" rel=\"nofollow noopener\">Visitez le r\u00e9f\u00e9rentiel PDEBench<\/a> pour les codes de r\u00e9f\u00e9rence et les jeux de donn\u00e9es.<\/p>\n<p><a href=\"https:\/\/github.com\/i207M\/PINNacle\" target=\"_blank\" rel=\"nofollow noopener\">Explorez l'\u00e9valuation compl\u00e8te de Pinnacle<\/a> pour les recommandations sp\u00e9cifiques \u00e0 la m\u00e9thode.<\/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\"> 15<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Apprenez \u00e0 impl\u00e9menter des r\u00e9seaux de neurones bas\u00e9s sur la physique dans PyTorch pour r\u00e9soudre des probl\u00e8mes PDE vers l&rsquo;avant et inverse avec du code r\u00e9el.<\/p>\n","protected":false,"raw":"Apprenez \u00e0 impl\u00e9menter des r\u00e9seaux de neurones bas\u00e9s sur la physique dans PyTorch pour r\u00e9soudre des probl\u00e8mes PDE vers l'avant et inverse avec du code r\u00e9el."},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=1049","iawp_total_views":1,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1214","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre 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\/fr\/physics-informed-neural-networks-pytorch-guide\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  15 minutesApprenez \u00e0 impl\u00e9menter des r\u00e9seaux de neurones bas\u00e9s sur la physique dans PyTorch pour r\u00e9soudre des probl\u00e8mes PDE vers l&#039;avant et inverse avec du code r\u00e9el.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:47+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python\",\"datePublished\":\"2026-08-21T14:28:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/\"},\"wordCount\":3845,\"commentCount\":0,\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/\",\"name\":\"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/physics-informed-neural-networks-pytorch-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre 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\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@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":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre 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\/fr\/physics-informed-neural-networks-pytorch-guide\/","og_locale":"fr_FR","og_type":"article","og_title":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python - matforge.org","og_description":"Reading Time:  15 minutesApprenez \u00e0 impl\u00e9menter des r\u00e9seaux de neurones bas\u00e9s sur la physique dans PyTorch pour r\u00e9soudre des probl\u00e8mes PDE vers l'avant et inverse avec du code r\u00e9el.","og_url":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:47+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"steven","Dur\u00e9e de lecture estim\u00e9e":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python","datePublished":"2026-08-21T14:28:47+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/"},"wordCount":3845,"commentCount":0,"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/","url":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/","name":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre de Python - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:47+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/physics-informed-neural-networks-pytorch-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"R\u00e9seaux de neurones bas\u00e9s sur la physique\u00a0: un guide pratique de mise en \u0153uvre 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":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"fr-FR","@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\/1214","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=1214"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1214\/revisions"}],"predecessor-version":[{"id":1376,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1214\/revisions\/1376"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}