PINN求解一维热传导方程论文复现2

参考论文:

赵暾等: 基于内嵌物理机理神经网络的热传导方程的正问题及逆问题求解——《空气动力学学报》

详细代码请至链接下载
PINN求解一维热传导方程代码

基本问题

一维热传导方程正问题的解
∂ T ∂ t = α ∂ 2 T ∂ x 2 \frac{\partial T}{\partial t}=\alpha \frac{\partial^2 T}{\partial x^2} tT=αx22T

边界条件:
x = 0 : ∂ T ∂ x = − 1 x=0: \frac{\partial T}{\partial x}=-1 x=0:xT=1
x = 1 : ∂ T ∂ x = 0 x=1: \frac{\partial T}{\partial x}=0 x=1:xT=0
初始条件:
T ( t = 0 , x ) = 0 T(t=0,x)=0 T(t=0,x)=0

模型建立与训练

在这里插入图片描述

绘制训练损失和结果图

在这里插入图片描述
在这里插入图片描述

论文中的结果

在这里插入图片描述

<think>嗯,用户想要一个关于用物理信息神经网络(PINN求解二维热传导方程的代码示例。我需要先回顾一下二维热传导方程的基本形式。这个方程通常写成 ∂u/∂t = α(∂&sup2;u/∂x&sup2; + ∂&sup2;u/∂y&sup2;),其中α是热扩散系数,u是温度场,x和y是空间坐标,t是时间变量。 接下来,我需要考虑PINN的基本结构。PINN通过神经网络近似解u,并将PDE作为损失函数的一部分来训练网络。因此,代码的大致步骤应该包括:定义神经网络结构,设置训练数据(包括初始条件、边界条件和域内的残差点),定义损失函数(包含PDE残差、初始和边界条件),以及训练过程。 首先,用户可能需要一个简单的示例,所以应该选择一个常用的深度学习框架,比如TensorFlow或者PyTorch。这里可能更倾向于PyTorch,因为它在科研中更常用,而且自动微分更方便。 然后,定义神经网络结构。通常使用全连接网络,激活函数如tanh或sigmoid。输入层有3个节点(x, y, t),输出层是u的值。隐藏层的数量和节点数需要合理设置,比如4层,每层20个节点。 接下来是损失函数的构成。需要计算PDE的残差,也就是∂u/∂t - α(∂&sup2;u/∂x&sup2; + ∂&sup2;u/∂y&sup2;)。这需要用到自动微分来计算梯度。同时,初始条件和边界条件的损失也要考虑进去。比如,初始时刻t=0时,u的值应该满足某个初始条件u0(x,y),边界上的u值也应该符合给定的边界条件。 生成训练数据时,可能需要使用随机采样点。初始条件的数据点是在t=0时整个空间域采样;边界条件则是在各个边(x=0, x=L, y=0, y=W)的不同时间点采样;而残差点的采样是在整个时空域内随机选择。 训练过程中,需要将各个损失项加权求和。可能需要调整权重,比如让边界和初始条件的权重更高,以确保这些条件被满足。优化器通常选择Adam,学习率适当设置,比如0.001,迭代次数比如10000次。 另外,需要注意代码的正确性。比如,在计算二阶导数时,要确保正确使用自动微分,可能需要先计算一阶导数,再求导一次。同时,数据点的坐标需要合理归一化,避免输入范围过大导致训练困难。 可能的陷阱包括:网络结构不够深导致无法逼近解,学习率不合适导致收敛慢,损失项权重不平衡导致某些条件不满足。因此,在代码示例中需要给出一些调参的建议,比如调整网络层数、节点数,或者调整权重系数。 最后,示例代码可能需要一个具体的问题设定,比如设定α的值,定义初始条件和边界条件。例如,假设α=0.1,初始条件u0(x,y)=sin(πx)sin(πy),边界条件u=0。然后通过PINN求解这个特定问题。 用户可能还需要知道如何验证结果,比如与解析解比较,或者可视化温度场的分布。这部分可以在代码中添加,比如使用matplotlib绘制某个时刻的u分布。 总结下来,代码示例应该包括以下几个部分: 1. 导入必要的库(PyTorch, numpy, matplotlib等)。 2. 定义神经网络结构。 3. 生成训练数据(初始、边界、残差点)。 4. 定义损失函数,包括各个部分。 5. 训练循环。 6. 结果验证和可视化。 需要确保代码中的LaTeX公式正确使用$$和$符号,比如在注释或说明中正确呈现方程。同时,保持代码简洁,注释清晰,方便用户理解和修改参数进行实验。</think>以下是一个基于PyTorch实现PINN求解二维非稳态热传导方程的代码示例,包含详细的中文注释和关键公式说明: ```python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # 二维热传导方程:∂u/∂t = α(∂&sup2;u/∂x&sup2; + ∂&sup2;u/∂y&sup2;) # 定义参数 alpha = 0.1 # 热扩散系数 L, W = 1.0, 1.0 # 空间域范围 T = 1.0 # 时间范围 # 定义神经网络结构 class PINN(nn.Module): def __init__(self): super(PINN, self).__init__() self.net = nn.Sequential( nn.Linear(3, 20), # 输入(x,y,t) nn.Tanh(), nn.Linear(20, 20), nn.Tanh(), nn.Linear(20, 20), nn.Tanh(), nn.Linear(20, 1) # 输出u ) def forward(self, x, y, t): inputs = torch.cat([x, y, t], dim=1) return self.net(inputs) # 初始化模型和优化器 model = PINN() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 生成训练数据 def generate_data(num_samples=100): # 初始条件(t=0) x_ic = torch.rand(num_samples, 1) * L y_ic = torch.rand(num_samples, 1) * W t_ic = torch.zeros(num_samples, 1) u_ic = torch.sin(np.pi * x_ic) * torch.sin(np.pi * y_ic) # 示例初始条件 # 边界条件(假设Dirichlet边界u=0) x_bc = torch.cat([torch.zeros(num_samples//4,1), torch.ones(num_samples//4,1), torch.rand(num_samples//4,1)*L, torch.rand(num_samples//4,1)*L], 0) y_bc = torch.cat([torch.rand(num_samples//4,1)*W, torch.rand(num_samples//4,1)*W, torch.zeros(num_samples//4,1), torch.ones(num_samples//4,1)], 0) t_bc = torch.rand(num_samples, 1) * T u_bc = torch.zeros(num_samples, 1) # 残差采样点 x_res = torch.rand(num_samples, 1) * L y_res = torch.rand(num_samples, 1) * W t_res = torch.rand(num_samples, 1) * T return (x_ic, y_ic, t_ic, u_ic), (x_bc, y_bc, t_bc, u_bc), (x_res, y_res, t_res) # 定义损失函数 def compute_loss(model, ic_data, bc_data, res_data): # 初始条件损失 x_ic, y_ic, t_ic, u_ic = ic_data u_pred_ic = model(x_ic, y_ic, t_ic) loss_ic = torch.mean((u_pred_ic - u_ic)**2) # 边界条件损失 x_bc, y_bc, t_bc, u_bc = bc_data u_pred_bc = model(x_bc, y_bc, t_bc) loss_bc = torch.mean((u_pred_bc - u_bc)**2) # PDE残差损失 x_res, y_res, t_res = res_data x_res.requires_grad_(True) y_res.requires_grad_(True) t_res.requires_grad_(True) u = model(x_res, y_res, t_res) # 计算梯度 grad_u = torch.autograd.grad(u, [x_res, y_res, t_res], grad_outputs=torch.ones_like(u), create_graph=True)[0] u_t = grad_u[:, 2:3] # ∂u/∂t # 计算二阶导数 u_x = grad_u[:, 0:1] u_y = grad_u[:, 1:2] u_xx = torch.autograd.grad(u_x, x_res, torch.ones_like(u_x), create_graph=True)[0][:, 0:1] u_yy = torch.autograd.grad(u_y, y_res, torch.ones_like(u_y), create_graph=True)[0][:, 0:1] # PDE残差 residual = u_t - alpha*(u_xx + u_yy) loss_res = torch.mean(residual**2) # 总损失 total_loss = loss_ic + loss_bc + loss_res return total_loss # 训练循环 ic_data, bc_data, res_data = generate_data(1000) for epoch in range(10000): optimizer.zero_grad() loss = compute_loss(model, ic_data, bc_data, res_data) loss.backward() optimizer.step() if epoch % 1000 == 0: print(f"Epoch {epoch}, Loss: {loss.item():.4e}") # 结果可视化(示例) def plot_solution(model, t=0.5): x = np.linspace(0, L, 100) y = np.linspace(0, W, 100) X, Y = np.meshgrid(x, y) T = np.full_like(X, t) with torch.no_grad(): u_pred = model(torch.tensor(X.reshape(-1,1), dtype=torch.float32), torch.tensor(Y.reshape(-1,1), dtype=torch.float32), torch.tensor(T.reshape(-1,1), dtype=torch.float32)) plt.contourf(X, Y, u_pred.numpy().reshape(100,100)) plt.colorbar() plt.title(f"Temperature Distribution at t={t}") plt.show() plot_solution(model, t=0.5) ``` **关键数学公式说明:** 1. **控制方程**(PDE残差项): $$ \frac{\partial u}{\partial t} = \alpha\left( \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} \right) $$ 对应代码中残差计算: ```python residual = u_t - alpha*(u_xx + u_yy) ``` 2. **初始条件**(示例): $$ u(x,y,0) = \sin(\pi x)\sin(\pi y) $$ 对应代码中的`u_ic`计算 **代码特点说明:** 1. 使用全连接神经网络构建PINN,输入为$(x,y,t)$,输出为温度$u$ 2. 通过自动微分计算偏导数(`torch.autograd.grad`) 3. 损失函数包含三部分: - 初始条件损失(均方误差) - 边界条件损失(均方误差) - PDE残差损失(均方误差) 4. 可视化函数展示特定时刻的温度分布 **改进建议:** 1. 增加自适应权重平衡不同损失项 2. 使用更复杂的网络结构(如残差连接) 3. 引入硬约束条件处理边界 4. 采用自适应采样策略 建议先运行此基础版本,再逐步添加高级功能。可通过调整网络深度/宽度、学习率、采样点数量等参数观察收敛效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小孟的CDN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值