首页 > 编程语言 >python 代码实现了一个基于物理信息神经网络(PINN)的模型,用于解决特定的流体力学问题

python 代码实现了一个基于物理信息神经网络(PINN)的模型,用于解决特定的流体力学问题

时间:2024-12-19 10:32:25浏览次数:6  
标签:PINN nn python self torch 神经网络 device 100 Linear

import torch
import torch.nn as nn
import numpy as np
import math
import scipy.io
from fun import func  # 确保fun模块及其func类已正确定义
import matplotlib.pyplot as plt
import time
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/pinn_experiment')

# 检查GPU是否可用,并设置设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f'Using device: {
     device}')

# 设置随机种子以确保结果可复现
np.random.seed(42)
torch.manual_seed(42)
if device.type == 'cuda':
    torch.cuda.manual_seed_all(42)

# 定义基本物理参数
L = 37.2  # 管长
D = 0.0221  # 管道直径
a = 1319  # 波速
C0 = 0.0019  # 阀门流量系数
TC = 0.07  # 关阀时间
H0 = 26.5  # 上游水位
H1 = 26.295  # 下游水位
vv = 1.007 * 10 ** (-6)  # 水在20℃运动粘度系数
k = 1.5 * 10 ** (-3)  # 管壁绝对粗糙度
Delta = k / D  # 相对粗糙度
g = 9.8  # 重力加速度
A = math.pi * D ** 2 / 4  # 主管面积
Q01 = 6.3324 * 10 ** (-5)  # 定义流量Q01
V = Q01 / A  # 平均流速

# 计算雷诺数和相关物理量
fu = func()
Re = fu.Reynold_number(Q01, D, vv)  # 雷诺数
k3 = fu.f_k(Re)  # 柯尔布鲁克参数
f1 = fu.cole_brook_white_2(Re, Delta)  # Colebrook-White方程结果

class Pinn:
    def __init__(self, X, T, v, h, normalization_params, lambda_reg=1e-6):
        """
        初始化PINN模型
        :param X: 空间变量 (NT x 1)
        :param T: 时间变量 (NT x 1)
        :param v: 流量数据 (NT x 1)
        :param h: 水头数据 (NT x 1)
        :param normalization_params: 字典,包含归一化参数
        :param lambda_reg: L2正则化参数
        """
        # 存储归一化参数
        self.min_v = normalization_params['min_v']
        self.max_v = normalization_params['max_v']
        self.min_h = normalization_params['min_h']
        self.max_h = normalization_params['max_h']
        self.min_x = normalization_params['min_x']
        self.max_x = normalization_params['max_x']
        self.min_t = normalization_params['min_t']
        self.max_t = normalization_params['max_t']
        self.Num = normalization_params['Num']
        self.Tim = normalization_params['Tim']

        # 将数据转换为张量并移动到指定设备
        self.x = torch.tensor(X, dtype=torch.float32, requires_grad=True).to(device)
        self.t = torch.tensor(T, dtype=torch.float32, requires_grad=True).to(device)
        self.v = torch.tensor(v, dtype=torch.float32).to(device)
        self.h = torch.tensor(h, dtype=torch.float32).to(device)

        # 定义一个零张量用于PDE损失
        self.null = torch.zeros((self.t.shape[0], 1), device=device)

        # 初始化神经网络
        self.network()

        # 将网络移动到指定设备
        self.net.to(device)

        # 设置L2正则化参数
        self.lambda_reg = lambda_reg

        # 设置优化器和学习率调度器
        self.optimizer_adam = torch.optim.Adam(self.net.parameters(), lr=0.01)
        self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
            self.optimizer_adam, patience=100, factor=0.5, verbose=True)
        # 定义LBFGS优化器
        self.optimizer_lbfgs = torch.optim.LBFGS(
            self.net.parameters(),
            lr=0.001,
            max_iter=500,
            max_eval=500,
            history_size=50,
            tolerance_grad=1e-07,
            tolerance_change=1e-09,
            line_search_fn="strong_wolfe"
        )
        # 定义损失函数
        self.mse = nn.MSELoss().to(device)
        self.ls = 0  # 当前损失值
        self.iter = 0  # 当前迭代次数

        # 历史损失记录
        self.total_loss_history = []
        self.pde_loss_history = []
        self.data_loss_history = []

        # 预测结果初始化
        self.v_pred = None
        self.h_pred = None

    def network(self):
        """
        定义神经网络结构
        """
        self.net = nn.Sequential(
            nn.Linear(2, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 100), nn.Tanh(),
            nn.Linear(100, 2)  # 输出两个值:v和h
        )
        # 初始化网络权重
        for m in self.net.modules():
            if isinstance(m, nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                nn.init.zer

标签:PINN,nn,python,self,torch,神经网络,device,100,Linear
From: https://blog.csdn.net/huanghm88/article/details/144578415

相关文章

  • 7-python之数据解析xpath方法解析
    前言python得到的响应数据有几种类型:1.字节(图片视频音乐...)res.content2.json数据(字典)res.json()3.html结构数据(正则,xpath表达式)一、安装新的模块lxmlpipinstalllxml是一个html的文件解析器(解析html语法)通过解析器从html数据中提取到想要的目......
  • Python中创建使用本地包
    在项目中创建本地包,需要以下几个步骤:1.创建包目录2.在包目录中创建一个init.py文件3.在包目录中创建模块文件4.使用包中的模块下面详细介绍操作步骤1.创建包目录包目录用来存放本包相关的代码。包目录是一个普通的文件夹,但是它包含了一些特定文件和结构,使得Python能够......
  • Python_面向对象-6
    文章目录Python面向对象基础今日内容介绍**①:面向过程和面向对象都可以实现代码重用和模块化编程,只不过面向对象的模块化更深,数据也更封闭和安全。****②:面向对象的思维方式更加贴近现实生活,更容易解决大型的复杂的业务逻辑。****③:从前期开发的角度来看,面向对象比......
  • 《python的数学函数绘图软件》毕业设计项目
    大家好,我是俊星学长,一名在Java圈辛勤劳作的码农。今日,要和大家分享的是一款《python的数学函数绘图软件》毕业设计项目。项目源码以及部署相关事宜,请联系俊星学长,文末会附上联系信息哦。......
  • 2024实测验证可用的股票数据接口集合.:python、JavaScript 、JAVA等实例代码演示教你如
    实测可用的股票数据接口,可以直接点击在浏览器中验证:沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/b997d4403688d5e66a【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):https://api.mairui.club/hsrl/ssjy/000001/b997d4403......
  • Python知识分享第二十九天-PyMySQL
    PyMySQL介绍:概述:它是Python的1个库(模块),可以实现通过Python代码,操作MySQL数据库.该库需要手动安装一下.安装方式:方式1:导包时自动安装.方式2:在PyCharm的Settings->Python编辑器或者Anaconda->安装方式3:通过pip方式,在命令行中......
  • 常用于优化算法测试的python非凸函数有哪些?
            在优化算法领域,有一些常用的测试函数,它们被广泛用于评估和比较不同优化算法的性能。        非凸函数是指在其定义域内至少存在一个点,使得该点的任意邻域内函数值不满足凸性条件的函数。换句话说,非凸函数在其定义域内至少存在一个点,使得函数的图像在......
  • Python Tkinter 弹窗美化指南
    在Python编程中,Tkinter是标准GUI(图形用户界面)库,它允许开发者创建桌面应用程序。尽管Tkinter提供了基本的窗口和控件功能,但默认的样式和外观往往显得单调。因此,对Tkinter弹窗进行美化是提升用户体验的重要步骤。本文将详细介绍如何使用Tkinter创建并美化弹窗,包括理论概述和详细的代......
  • python连接okx查询自己的持仓【量化交易】
     需要安装ccxt以下代码在jupyter中运行需要去app中获取自己的apiKey、secret、password,才能查到自己的个人持仓情况根据自己的代理设置proxiesimportccxtimportpandasaspdimporttimefromIPython.displayimportclear_outputimporttracebackfromdatetimeimp......
  • python毕设 社区住户信息管理系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于社区住户信息管理系统的研究,现有研究多聚焦于大型企业或特定行业的信息管理,专门针对社区住户信息管理系统的研究相对较少。在国内......