pytorch PINN求解欧拉方程的间断问题的预测解和真实解以及误差图的代码

时间: 2024-02-13 22:04:34 浏览: 34
以下是基于PyTorch的PINN求解欧拉方程的间断问题的预测解和真实解以及误差图的代码示例: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt # 定义欧拉方程的PINN模型 class EulerPINN(nn.Module): def __init__(self): super(EulerPINN, self).__init__() self.fc1_u = nn.Linear(2, 20) self.fc2_u = nn.Linear(20, 20) self.fc3_u = nn.Linear(20, 1) self.fc1_f = nn.Linear(2, 20) self.fc2_f = nn.Linear(20, 20) self.fc3_f = nn.Linear(20, 1) def forward(self, x): u = torch.sin(self.fc1_u(x)) u = torch.sin(self.fc2_u(u)) u = self.fc3_u(u) f = torch.sin(self.fc1_f(x)) f = torch.sin(self.fc2_f(f)) f = self.fc3_f(f) return u, f # 定义PINN求解欧拉方程的函数 def solve_euler_pinn(x, t, x_l, x_r, t_f, model, optimizer, max_epochs): loss_list = [] for epoch in range(max_epochs): optimizer.zero_grad() x.requires_grad = True t.requires_grad = True x_l.requires_grad = True x_r.requires_grad = True t_f.requires_grad = True X = torch.cat([x, t], dim=1) U, F = model(X) U_x = torch.autograd.grad(U, x, grad_outputs=torch.ones_like(U), create_graph=True)[0] U_t = torch.autograd.grad(U, t, grad_outputs=torch.ones_like(U), create_graph=True)[0] F_x = torch.autograd.grad(F, x, grad_outputs=torch.ones_like(F), create_graph=True)[0] F_t = torch.autograd.grad(F, t, grad_outputs=torch.ones_like(F), create_graph=True)[0] loss = nn.MSELoss()(U_x + F, torch.zeros_like(U_x)) + \ nn.MSELoss()(U_t + U * F_x, torch.zeros_like(U_t)) + \ nn.MSELoss()(model(torch.cat([x_l, t_f], dim=1))[0], torch.zeros_like(x_l)) + \ nn.MSELoss()(model(torch.cat([x_r, t_f], dim=1))[0], torch.ones_like(x_r)) loss_list.append(loss.item()) loss.backward() optimizer.step() if epoch % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, max_epochs, loss.item())) return loss_list # 定义真实解函数 def true_solution(x, t): u = np.zeros((x.shape[0], t.shape[0])) for i in range(x.shape[0]): for j in range(t.shape[0]): if x[i, 0] >= 0 and x[i, 0] <= 0.5*t[j]: u[i, j] = x[i, 0] / t[j] else: u[i, j] = 1 return u # 定义画图函数 def plot_results(x, t, u_pred, u_true): plt.figure(figsize=(10, 10)) plt.subplot(2, 1, 1) plt.pcolor(x, t, u_pred, cmap='jet') plt.colorbar() plt.xlabel('x') plt.ylabel('t') plt.title('Predicted solution') plt.subplot(2, 1, 2) plt.pcolor(x, t, u_true, cmap='jet') plt.colorbar() plt.xlabel('x') plt.ylabel('t') plt.title('True solution') plt.show() # 设置模型参数和求解参数 model = EulerPINN() optimizer = optim.Adam(model.parameters(), lr=0.001) max_epochs = 10000 # 设置求解区域和边界条件 x_l = torch.linspace(0, 1, 100).reshape(-1, 1) x_r = torch.linspace(0, 1, 100).reshape(-1, 1) t_f = torch.linspace(0, 1, 100).reshape(-1, 1) x = torch.linspace(0, 1, 100).reshape(-1, 1) t = torch.linspace(0, 1, 100).reshape(-1, 1) # 求解欧拉方程 loss_list = solve_euler_pinn(x, t, x_l, x_r, t_f, model, optimizer, max_epochs) # 计算预测解和真实解并画图 X, T = np.meshgrid(x.detach().numpy().flatten(), t.detach().numpy().flatten()) U_pred = model(torch.cat([x, t], dim=1))[0].detach().numpy().reshape(-1, 1) U_true = true_solution(np.concatenate([X.reshape(-1, 1), T.reshape(-1, 1)], axis=1), T.reshape(-1, 1)) U_pred = np.transpose(U_pred.reshape((x.shape[0], t.shape[0]))) U_true = np.transpose(U_true.reshape((x.shape[0], t.shape[0]))) plot_results(X, T, U_pred, U_true) # 画出误差图 plt.figure(figsize=(10, 5)) plt.plot(loss_list) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('PINN loss') plt.show() ``` 在上面的代码中,我们定义了一个名为`EulerPINN`的类,该类继承自`nn.Module`,并包含了欧拉方程的PINN模型。我们还定义了一个名为`solve_euler_pinn`的函数,该函数使用PINN求解欧拉方程,并返回损失列表。真实解函数`true_solution`用于计算欧拉方程的真实解。`plot_results`函数用于将预测解和真实解可视化。在主函数中,我们首先设置模型参数和求解参数。然后,我们定义求解区域和边界条件。接下来,我们使用`solve_euler_pinn`函数求解欧拉方程,并计算预测解和真实解。最后,我们使用`plot_results`函数将预测解和真实解可视化,并画出损失图。

相关推荐

最新推荐

recommend-type

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

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

pytorch 实现将自己的图片数据处理成可以训练的图片类型

今天小编就为大家分享一篇pytorch 实现将自己的图片数据处理成可以训练的图片类型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

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

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

关于pytorch处理类别不平衡的问题

数据增强效果就不会太好了,另外过采样也不太合适,因为是空间数据,新增的点有可能会对真实分布产生未知影响。所以采用欠采样来缓解类别不平衡的问题。 下面的代码展示了如何使用WeightedRandomSampler来完成抽样。...
recommend-type

PyTorch上搭建简单神经网络实现回归和分类的示例

本篇文章主要介绍了PyTorch上搭建简单神经网络实现回归和分类的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。