pytorch PINN求解具有初边值的椭圆型pde间断问题的代码(含真实解和误差的图像代码)

时间: 2024-02-01 16:16:12 浏览: 32
这是一个基于PyTorch的PINN求解具有初边值的椭圆型PDE间断问题的代码示例,包含真实解和误差的图像代码。在此示例中,我们将使用PINN求解Poisson方程的间断问题,该问题具有以下形式: - $\nabla^2 u = f(x)$ in $\Omega$ - $u = g(x)$ on $\partial \Omega$ 其中,$\Omega$是有界区域,$f(x)$是已知函数,$g(x)$是已知边界值。为了简化问题,我们假设$\Omega$是单位正方形$(0,1)\times(0,1)$。 首先,我们需要导入必要的库:PyTorch、NumPy、Matplotlib和SciPy。 ```python import torch import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata ``` 接下来,我们定义真实解$u(x)$和右侧函数$f(x)$。为了模拟间断问题,我们将真实解定义为: $$u(x) = \begin{cases}0.5\sin(4\pi x_1)\sin(4\pi x_2) & \text{if } x_1<0.5 \\ 0.5\cos(4\pi x_1)\cos(4\pi x_2) & \text{if } x_1\geq0.5\end{cases}$$ 右侧函数$f(x)$可以通过对真实解进行微分得到: $$f(x) = 8\pi^2\sin(4\pi x_1)\sin(4\pi x_2) \text{ if } x_1<0.5$$ $$f(x) = -8\pi^2\cos(4\pi x_1)\cos(4\pi x_2) \text{ if } x_1\geq0.5$$ ```python def true_solution(x): """ Return the true solution of the Poisson equation with an interface discontinuity at x = 0.5 """ if x[:, 0] < 0.5: return 0.5 * torch.sin(4 * np.pi * x[:, 0]) * torch.sin(4 * np.pi * x[:, 1]) else: return 0.5 * torch.cos(4 * np.pi * x[:, 0]) * torch.cos(4 * np.pi * x[:, 1]) def source_term(x): """ Return the source term of the Poisson equation with an interface discontinuity at x = 0.5 """ if x[:, 0] < 0.5: return 8 * np.pi**2 * torch.sin(4 * np.pi * x[:, 0]) * torch.sin(4 * np.pi * x[:, 1]) else: return -8 * np.pi**2 * torch.cos(4 * np.pi * x[:, 0]) * torch.cos(4 * np.pi * x[:, 1]) ``` 接下来,我们定义边界条件$u(x)$。在这个例子中,我们将边界值定义为$u(x) = 0$。 ```python def boundary_condition(x): """ Return the boundary condition of the Poisson equation with an interface discontinuity at x = 0.5 """ return torch.zeros(x.shape[0], 1) ``` 现在,我们可以生成训练数据。在这个例子中,我们将随机生成1000个点作为训练数据,其中500个点在$x_1<0.5$的区域内,500个点在$x_1\geq0.5$的区域内。 ```python def generate_training_data(n=1000): """ Generate training data for the Poisson equation with an interface discontinuity at x = 0.5 """ # Generate random points in the domain x = torch.rand(n, 2) # Divide the points into two regions mask1 = x[:, 0] < 0.5 mask2 = x[:, 0] >= 0.5 # Assign labels to the points based on the regions y1 = true_solution(x[mask1]) y2 = true_solution(x[mask2]) # Generate training data x1 = x[mask1] y1 = y1.reshape(-1, 1) x2 = x[mask2] y2 = y2.reshape(-1, 1) x = torch.cat([x1, x2], dim=0) y = torch.cat([y1, y2], dim=0) return x, y ``` 我们还需要定义PINN模型。在这个例子中,我们将使用一个具有两个隐层的全连接神经网络作为PINN模型。 ```python class PINN(torch.nn.Module): """ A PyTorch implementation of the physics-informed neural network (PINN) for the Poisson equation with an interface discontinuity at x = 0.5 """ def __init__(self, layers): super().__init__() # Define the neural network architecture self.linear1 = torch.nn.Linear(layers[0], layers[1]) self.linear2 = torch.nn.Linear(layers[1], layers[1]) self.linear3 = torch.nn.Linear(layers[1], layers[1]) self.linear4 = torch.nn.Linear(layers[1], layers[1]) self.linear5 = torch.nn.Linear(layers[1], layers[1]) self.linear6 = torch.nn.Linear(layers[1], layers[1]) self.linear7 = torch.nn.Linear(layers[1], layers[1]) self.linear8 = torch.nn.Linear(layers[1], layers[2]) self.linear9 = torch.nn.Linear(layers[2], 1) def forward(self, x): # Define the forward pass of the neural network x = torch.sin(self.linear1(x)) x = torch.sin(self.linear2(x)) x = torch.sin(self.linear3(x)) x = torch.sin(self.linear4(x)) x = torch.sin(self.linear5(x)) x = torch.sin(self.linear6(x)) x = torch.sin(self.linear7(x)) x = torch.sin(self.linear8(x)) x = self.linear9(x) return x ``` 最后,我们可以训练PINN模型并生成真实解和误差图像。在训练过程中,我们将使用L-BFGS算法进行优化,并将训练过程中的损失函数值记录下来。 ```python # Set the device to GPU if available device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Set the random seed for reproducibility torch.manual_seed(1234) np.random.seed(1234) # Generate the training data x_train, y_train = generate_training_data() # Define the PINN model model = PINN(layers=[2, 64, 64, 64, 64, 64, 64, 64, 64, 1]).to(device) # Define the optimizer optimizer = torch.optim.LBFGS(model.parameters(), lr=1, max_iter=5000, tolerance_grad=1e-6, tolerance_change=1e-12) # Define the loss function def loss_fn(x, y): # Compute the predictions of the PINN model u = model(x) # Compute the derivatives of the PINN model u_x, u_y = torch.autograd.grad(u, x, grad_outputs=torch.ones_like(u), create_graph=True) u_xx, _ = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), create_graph=True) u_yy, _ = torch.autograd.grad(u_y, x, grad_outputs=torch.ones_like(u_y), create_graph=True) # Compute the residual of the Poisson equation f = source_term(x) residual = u_xx + u_yy - f # Compute the boundary condition error bc_error = (model(boundary_points) - boundary_values).pow(2).mean() # Compute the loss function loss = (residual.pow(2).mean() + bc_error) / 2 return loss # Define the boundary points and values boundary_points = torch.cat([ torch.zeros(50, 1), torch.linspace(0, 1, 50).reshape(-1, 1), ], dim=1).to(device) boundary_values = boundary_condition(boundary_points) # Train the PINN model loss_history = [] model.train() for i in range(100): def closure(): optimizer.zero_grad() loss = loss_fn(x_train.to(device), y_train.to(device)) loss.backward() loss_history.append(loss.item()) return loss optimizer.step(closure) # Compute the true solution and the predicted solution on a grid x = torch.linspace(0, 1, 101) y = torch.linspace(0, 1, 101) X, Y = np.meshgrid(x, y) points = torch.from_numpy(np.vstack([X.flatten(), Y.flatten()]).T).float().to(device) u_true = true_solution(points).reshape(X.shape) u_pred = model(points).detach().cpu().numpy().reshape(X.shape) # Compute the error between the true solution and the predicted solution error = np.abs(u_true - u_pred) # Plot the true solution and the predicted solution plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.pcolormesh(X, Y, u_true, cmap='coolwarm', shading='auto') plt.colorbar() plt.title('True Solution') plt.subplot(1, 2, 2) plt.pcolormesh(X, Y, u_pred, cmap='coolwarm', shading='auto') plt.colorbar() plt.title('Predicted Solution') plt.tight_layout() plt.show() # Plot the error between the true solution and the predicted solution plt.figure(figsize=(6, 4)) plt.pcolormesh(X, Y, error, cmap='viridis', shading='auto') plt.colorbar() plt.title('Error') plt.tight_layout() plt.show() # Plot the loss function during training plt.figure(figsize=(6, 4)) plt.semilogy(loss_history) plt.xlabel('Iteration') plt.ylabel('Loss') plt.title('Loss Function') plt.tight_layout() plt.show() ``` 运行以上代码,即可得到真实解和误差的图像。注意,由于PINN模型的随机性质,每次运行结果可能略有不同。

相关推荐

最新推荐

recommend-type

Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式

主要介绍了Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

pytorch 彩色图像转灰度图像实例

今天小编就为大家分享一篇pytorch 彩色图像转灰度图像实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

pytorch 可视化feature map的示例代码

今天小编就为大家分享一篇pytorch 可视化feature map的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

使用PyTorch训练一个图像分类器实例

今天小编就为大家分享一篇使用PyTorch训练一个图像分类器实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

pytorch实现mnist数据集的图像可视化及保存

今天小编就为大家分享一篇pytorch实现mnist数据集的图像可视化及保存,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。