首页 > 其他分享 >【小白记录深度学习】——物理信息神经网络(PINNs)

【小白记录深度学习】——物理信息神经网络(PINNs)

时间:2024-07-26 20:54:47浏览次数:13  
标签:pred self 神经网络 residual 小白 PINNs derivative

本文的内容基于论文解读,解读的论文为Physics-Informed Neural Networks for Shell Structures和Recent Advances and Applications of Machine Learning in Experimental Solid Mechanics: A Review

什么是物理信息神经网络

PINNs(Physics - informed Neural Networks,物理信息神经网络)的基本原理是应用神经网络来近似解决物理问题,将物理原理(用偏微分方程数学表达)作为先验知识,通过对偏微分方程残差的惩罚来实现。

具体来说,PINNs在训练过程中,会将物理定律融入到学习算法中。例如,在固体力学问题中,平衡方程等物理定律可以被编码到神经网络的训练中。这样,神经网络在学习过程中,不仅会根据数据进行调整,还会受到物理定律的约束,从而使得学习到的结果不仅能够拟合数据,还能够符合物理定律。

想象一下,我们有一个非常复杂的物理问题,这个问题可以用一些数学方程来描述,但是这些方程很难直接求解。这时,PINN方法就像一个聪明的学生,它使用一个神经网络来尝试理解这个问题。这个神经网络就像是学生的大脑,它可以学习和理解复杂的信息。首先,我们把这个物理问题的相关信息告诉神经网络,比如问题的条件、边界等等。然后,神经网络会根据这些信息进行学习和预测。它会尝试找出一个答案,使得这个答案能够满足物理问题的数学方程和边界条件。在学习的过程中,神经网络会不断地调整自己的参数,就像学生不断地改进自己的学习方法一样,直到它找到一个最好的答案。最后,我们就可以得到这个物理问题的解,这个解就是神经网络通过学习和预测得到的结果。

这种方法的优势在于,相比于传统的数据驱动神经网络方法,PINNs需要的数据量更少,就能达到相似的预测能力。因为物理定律的注入为神经网络提供了额外的信息和约束,使其能够更有效地学习和泛化。

例如,在研究流体动力学的PINNs应用中,通过利用几个被动标量浓度场的快照,PINNs能够预测速度和压力场。而在传统的数据驱动方法中,如果不整合流体物理信息,可能需要至少数百对浓度、速度和压力场的快照作为训练数据才能达到相似的预测效果。PINNs通过融合数据和物理知识,为解决科学和工程中的问题提供了一种新的有效途径。

如何构建一个物理信息神经网络

下面的代码是一个简单的基于 PINNs 求解 Navier-Stokes 方程的示例。

import torch
import torch.nn as nn
import numpy as np
from torch.autograd import grad

# 定义神经网络模型
class PINNModel(nn.Module):
    def __init__(self):
        super(PINNModel, self).__init__()
        self.layer1 = nn.Linear(3, 50)  # 输入维度为 3(空间维度 + 时间)
        self.relu = nn.ReLU()
        self.layer2 = nn.Linear(50, 50)
        self.layer3 = nn.Linear(50, 4)  # 输出维度为 4(速度的三个分量和压强)

    def forward(self, x):
        out = self.layer1(x)
        out = self.relu(out)
        out = self.layer2(out)
        out = self.relu(out)
        out = self.layer3(out)
        return out

# 计算导数
def derivative(f, x):
    return grad(f, x, create_graph=True)[0]

# 定义损失函数
def loss_function(model, x, y_true):
    u_pred, v_pred, w_pred, p_pred = model(x)  # 预测的速度分量和压强

    # 计算 Navier-Stokes 方程的残差
    u_x = derivative(u_pred, x[:, 0])
    u_y = derivative(u_pred, x[:, 1])
    u_z = derivative(u_pred, x[:, 2])
    u_t = derivative(u_pred, x[:, 3])

    v_x = derivative(v_pred, x[:, 0])
    v_y = derivative(v_pred, x[:, 1])
    v_z = derivative(v_pred, x[:, 2])
    v_t = derivative(v_pred, x[:, 3])

    w_x = derivative(w_pred, x[:, 0])
    w_y = derivative(w_pred, x[:, 1])
    w_z = derivative(w_pred, x[:, 2])
    w_t = derivative(w_pred, x[:, 3])

    p_x = derivative(p_pred, x[:, 0])
    p_y = derivative(p_pred, x[:, 1])
    p_z = derivative(p_pred, x[:, 2])

    rho = 1.0  # 假设密度为 1

    continuity_residual = u_x + v_y + w_z  # 连续性方程残差
    momentum_x_residual = rho * (u_t + u * u_x + v * u_y + w * u_z) + p_x - (0.1 * (u_x + u_x**2 + u_y**2 + u_z**2))  # x 方向动量方程残差
    momentum_y_residual = rho * (v_t + u * v_x + v * v_y + w * v_z) + p_y - (0.1 * (v_x + v_x**2 + v_y**2 + v_z**2))  # y 方向动量方程残差
    momentum_z_residual = rho * (w_t + u * w_x + v * w_y + w * w_z) + p_z - (0.1 * (w_x + w_x**2 + w_y**2 + w_z**2))  # z 方向动量方程残差

    # 边界条件和初始条件的残差
    bc_residual = (u - 0) ** 2 + (v - 0) ** 2 + (w - 0) ** 2  # 边界速度为 0 的残差
    ic_residual = (u - 0) ** 2 + (v - 0) ** 2 + (w - 0) ** 2 + (p - 0) ** 2  # 初始速度和压强为 0 的残差

    # 组合损失
    loss = torch.mean((continuity_residual) ** 2 + (momentum_x_residual) ** 2 + (momentum_y_residual) ** 2 + (momentum_z_residual) ** 2 + bc_residual + ic_residual)
    return loss

# 训练函数
def train(model, optimizer, x_train, epochs):
    for epoch in range(epochs):
        optimizer.zero_grad()
        loss = loss_function(model, x_train)
        loss.backward()
        optimizer.step()
        if (epoch + 1) % 100 == 0:
            print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item()}')

# 生成训练数据
x_train = torch.rand(1000, 4)  # 随机生成输入数据(空间维度 + 时间)

# 创建模型实例
model = PINNModel()

# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
train(model, optimizer, x_train, epochs=1000)

物理信息神经网络的具体应用案例

PINNs(物理信息神经网络)在固体力学中有以下具体应用案例:

  1. 线性弹性材料微力学建模:Henkes等人运用PINNs对线性弹性材料的微力学进行建模。
  2. 弹塑性固体的替代模型构建:Haghighat等人使用PINNs为弹塑性固体建立替代模型。
  3. 壳结构的小应变响应建模:Bastek和Kochmann利用PINNs对壳结构的小应变响应进行建模。
  4. 非均匀材料和几何分布的识别:Zhang等人展示了PINNs可以有效地识别在平面应变条件下非均匀材料和几何分布,例如识别内部裂纹信息,且直接将底层物理信息(如材料压缩性和平衡方程)集成到损失函数中,减少了训练数据量并提高了预测精度,还可用于推断其他材料属性如模量分布。

PINNs通过将物理原理作为先验知识融入神经网络,在解决固体力学中的正向和逆向问题方面具有很大的潜力。

标签:pred,self,神经网络,residual,小白,PINNs,derivative
From: https://blog.csdn.net/faderbitch/article/details/140619774

相关文章

  • 【YOLOv8改进- Backbone主干】BoTNet:基于Transformer,结合自注意力机制和卷积神经网络
    YOLOv8目标检测创新改进与实战案例专栏专栏目录:YOLOv8有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv8基础解析+创新改进+实战案例介绍摘要我们提出了BoTNet,这是一种概念上简单但功能强大的骨干......
  • 大模型基础——循环神经网络(RNN)
    循环神经网络(RecurrentNeuralNetwork,RNN)是一种特殊类型的神经网络,它特别适合于处理和预测序列数据中的时间依赖性和时序信息。与传统的前馈神经网络(FeedforwardNeuralNetwork)不同,RNN在隐藏层之间的节点是连接的,从而能够保存和传递之前时间步的信息给当前时间步。循环神......
  • 多层全连接神经网络(八)---实现MNIST手写数字分类
    简单的三层全连接神经网络    在PyTorch里面可以很简单地定义三层全连接神经网络。classsimpleNet(nn.Module):def__init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):super(simpleNet,self).__init__()self.layer1=nn.Linear(......
  • 基于CNN卷积神经网络的步态识别matlab仿真,数据库采用CASIA库
    1.算法运行效果图预览(完整程序运行后无水印) 1.训练过程   2.样本库     3.提取的步态能量图   4.步态识别结果和样本真实标签   2.算法运行软件版本MATLAB2022a 3.部分核心程序(完整版代码包含详细中文注释,训练CASIA库) digitD......
  • CDN小白保姆级入门指南——如何选择服务器
    想玩PCDN不知道从何下手?手里有大把资源却没有机器?这起告诉您如何选择服务器。选择服务器时,需要考虑以下几个关键因素:1.目标用户地理位置:了解目标用户的地理位置是选择服务器的首要考虑因素。选择靠近用户群体的地理位置可以降低延迟,提高内容传输速度。可以考虑使用全球分布的......
  • 【selenium】自动化测试小白入门:实现只开一个窗口,不同用户循环登录
    首先,我在给一个审批流写自动化脚本,需要各个不同的人登录去点通过按钮,每个人的流程都一致,唯一的区别就是user不同。那么,我的实现目标是,不关闭browser,只写一个testcase,实现不同用户按顺序运行同一个testcase第一次尝试,在driver里面写[email protected](scope="session")......
  • 【新手小白的Clion的下载安装配置使用问题】
    MinGW与Clion下载安装及使用详解参考文章:MinGW与Clion下载安装及使用详解Clion官网点击下载clion+MinGW+opencv配置安装参考文章:clion+MinGW+opencv配置安装运行CLion,在Settings→Build,Execution,Deployment中找到toolchains。然后点击+号,添加MinGW的编译工......
  • 没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成
      ......
  • 基于AT89C51单片机的简易计算器(含仿真、源码、论文适用于小白学习、课程设计等)
    本篇文章论述的是基于AT89C51单片机的简易计算器设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。含有仿真、源码的下载链接(如果打开不显示就是资源在审核中,如果着急需要的话可以私信我获取)基于AT89C51单片机的简易计算器资源-CSDN文库......
  • JAVA小白自学日记Day9
     1.序列化序列化版本号:serialVersionUID,是一个类的序列化版本号。如果在反序列化时,类的serialVersionUID与序列化时的版本号不匹配,那么会抛出 InvalidClassException 异常,表示类的版本不兼容,无法进行反序列化。如果流量没有定义,JDK会自动给与一个版本号,当该类发生变化(......