2025.1.19机器学习笔记:PINN文献精读

第三十周周报

  • 一、文献阅读
    • 题目信息
    • 摘要
    • Abstract
    • 创新点
    • 物理背景
    • 网络框架
    • 实验
      • 实验一:直道稳定流条件
      • 实验二:环状网络中的非稳定流条件
    • 结论
    • 缺点及展望
  • 二、代码实践
  • 总结

一、文献阅读

题目信息

  • 题目:《Enhanced physics-informed neural networks for efficient modelling of hydrodynamics in river networks》
  • 期刊: Hydrological Processes
  • 作者: Xiao Luo, Saiyu Yuan, Hongwu Tang, Dong Xu, Qihua Ran, Yuhao Cen, Dongfang Liang
  • 发表时间: 2024
  • 文章链接:https://www.researchgate.net/publication/379763912_Enhanced_physics-informed_neural_networks_for_efficient_modelling_of_hydrodynamics_in_river_networks

摘要

在河网水动力过程研究中,数值模拟是研究常用方法,但存在计算复杂、数据处理等问题。随着计算技术发展,一维水动力模型虽能模拟河网非恒定流,但计算需求有时较高。传统的机器学习算法发展为物理系统建模有着很大的帮助,计算效率高,但存在缺乏物理可解释性、等问题。物理信息神经网络(PINNs)将物理定律引入机器学习,在解决物理的偏微分方程方面有非常大的作用,但目前的PINNs用于河流水动力建模的研究非常有限,特别是在复杂河网的全面应用方面更是少之又少,因此本篇论的目的就是在探索将PINNs应用于河网非恒定流建模,作者过增强PINNs架构,有效模拟具有不规则横截面的真实河网的水动力特性。作者首先对水力参数进行预处理以优化训练速度,同时引入层归一化解决梯度消失问题。此外,还引入了水位范围和节点方程等物理约束确保训练能够有效收敛的同时还加入其他物理约束。最后,作者通过两个实验证明了增强后的PINNs架构能以较少数据预测河网水动力,同时其对时间步长敏感性低,这种PINNs机构是模拟复杂河网水动力过程的有效方法。

Abstract

This article enhances the physics-informed neural networks (PINNs) method to effec-tively model the hydrodynamics of real-world river networks with irregular cross-sections. First, we pre-process hydraulic parameters to optimize training speed with-out compromising accuracy, achieving a 91.67% acceleration compared with tradi-tional methods. To address the vanishing gradient problem, layer normalization is also incorporated into the architecture. We also introduce novel physical constraints—water level range and junction node equations—to ensure effective
training convergence and enrich the model with additional physical insights. Two practical case studies using HEC-RAS benchmarks demonstrate that our improved PINN method can predict river network hydrodynamics with less data and is less sen-sitive to time step size, allowing for longer computational time steps. Incorporating physical knowledge, our enhanced PINN methodology emerges as an efficient and promising avenue for modelling the complexities of hydrodynamic processes in natu-ral river networks.

创新点

  1. 预处理水力参数提升训练速度
  2. 引入层归一化解决梯度消失
  3. 增加水位范围和节点方程等物理约束,确保收敛的同时加入更多物理规律

物理背景

本论文使用一维的Saint-Venant方程作为物理模型,Saint-Venant方程被广泛用于描述河流中的水流。
在这里插入图片描述
这些方程基于质量和动量守恒原理,适用于同一河段的两段之间。
然而,当涉及到河网中的交叉点时,需要替代方程来准确描述这些点的水力条件。
利用质量连续性原理,在没有源或汇的情况下,流入某一点的流体质量必须等于流出该点的流体量。可以直接推导出方程(3)来描述结点处的水力条件:
在这里插入图片描述
Akan和Yen(1981)进行了一项研究,他们在研究中证明,当接点处的流量为亚临界时,能量方程可以用水级相等来近似,在交叉点处,流入和流出的水面高程可以认为是相等的。如式(4)所示:
在这里插入图片描述

网络框架

构建增强型PINNs框架,包括采用全连接深度神经网络近似未知解、预训练水力参数、PINNs近似SVE、增加物理信息(水位软约束和节点方程约束)、选择激活函数与层归一化、特定的模型训练和评估方法。
作者提出的增强型PINN的架构图如下图所示:
在这里插入图片描述
下面我们对作者提出的PINN框架进行分析:

  1. 该论文DNN的结构是一个全连接的前馈神经网络来得出 U ( x , t ) U(x, t) U(x,t) Z ( x , t ) Z(x,t) Z(x,t)的值
    在数学上可以理解为:
    U ( x , t ) ≈ U ^ ( x , t ; θ ) , Z ( x , t ) ≈ Z ^ ( x , t ; γ ) , \begin{array}{l}U(x, t) \approx \widehat{U}(x, t ; \theta),\\Z(x, t) \approx \widehat{Z}(x, t ; \gamma),\end{array} U(x,t)U (x,t;θ),Z(x,t)Z (x,t;γ),
    x = [ x 1 , x 2 , … , x N c ] x = [x_1,x_2,\dots,x_{N_c}] x=[x1,x2,,xNc]表示空间坐标向量,t表示时间坐标向量。 N c N_c Nc为截面总数。 θ θ θ γ γ γ是网络的参数。
    在这里插入图片描述

  2. 此外,作者认为天然的河道是非常复杂的(因为其形状常常是不规则的),因此求解此类系统的SVEs需要根据每个断面的实际地形计算各种中间变量(即为每个横截面计算水力特性)。这种复杂的计算对模型的训练速度造成了很大的影响。
    因此,作者提出一种预训练方法:通过计算横截面的水力参数(如流量面积和水面高程)与横截面几何形状之间的关系来简化计算。
    具体步骤如下:
    首先,作者在训练关键变量之前,对水位进行分层处理,并使用插值函数来近似每个分层水平的水力特征。 然后,预计算的数据集将作为深度神经网络的输入,目的是逼近不同横截面区域的流量面积 A(Z)、河流宽度 B(Z) 和输水能力函数 K(Z)。
    其中:
    A ( Z ) ≈ A ^ ( Z ^ ( x , t ; γ ) , α ) , B ( Z ) ≈ B ^ ( Z ^ ( x , t ; γ ) , β ) , K ( Z ) ≈ K ^ ( Z ^ ( x , t ; γ ) , δ ) , \begin{aligned} &A(Z) \approx \widehat{A}(\widehat{Z}(x, t ; \gamma), \alpha),\\ &B(Z) \approx \widehat{B}(\widehat{Z}(x, t ; \gamma), \beta),\\ &K(Z) \approx \widehat{K}(\widehat{Z}(x, t ; \gamma), \delta), \end{aligned} A(Z)A (Z (x,t;γ),α),B(Z)B (Z (x,t;γ),β),K(Z)K (Z (x,t;γ),δ),
    这些近似值是通过调整 α、β 和 δ来实现。
    获得了近似的流量面积 A ( Z ) A(Z) A(Z),就可以求得 Q ^ ( Z ) \widehat{Q}(Z) Q (Z),其中 Q ^ ( Z ) = A ( Z ) U ^ ( x , t ; γ ) \widehat{Q}(Z)=A(Z) \widehat{U}(x, t ; \gamma) Q (Z)=A(Z)U (x,t;γ)
    在这里插入图片描述

  3. 构建完DNN后,就开始定义损失函数
    首先需要定义式(1)和式(2)的残差项:
    f c ( x , t ) ≈ ∂ Q ^ ∂ x + B ^ ∂ Z ^ ∂ t = f ^ c ( x , t ; θ , γ ) , f m ( x , t ) ≈ ∂ Q ^ ∂ t + ∂ Q ^ U ^ ∂ x + g A ^ ( ∂ Z ^ ∂ x + Q ^ ∣ Q ^ ∣ K ^ 2 ) = f ^ m ( x , t ; θ , γ ) . \begin{array}{l}f_{c}(x, t) \approx \frac{\partial \widehat{Q}}{\partial x}+\widehat{B} \frac{\partial \widehat{Z}}{\partial t}=\widehat{f}_{c}(x, t ; \theta, \gamma),\\f_{m}(x, t) \approx \frac{\partial \widehat{Q}}{\partial t}+\frac{\partial \widehat{Q} \widehat{U}}{\partial x}+g \widehat{A}\left(\frac{\partial \widehat{Z}}{\partial x}+\frac{\widehat{Q}|\widehat{Q}|}{\widehat{K}^{2}}\right)=\widehat{f}_{m}(x, t ; \theta, \gamma) .\end{array} fc(x,t)xQ +B tZ =f c(x,t;θ,γ),fm(x,t)tQ +xQ U +gA (xZ +K 2Q Q )=f m(x,t;θ,γ).
    总体的损失函数如下:
    L ( θ , γ ) = λ u L u ( θ ) + λ z L z ( γ ) + L f ( θ , γ ) , L(\theta, \gamma)=\lambda_{u} L_{u}(\theta)+\lambda_{z} L_{z}(\gamma)+L_{f}(\theta, \gamma), L(θ,γ)=λuLu(θ)+λzLz(γ)+Lf(θ,γ),
    其中 L u ( θ ) L_{u}(\theta) Lu(θ) L z ( γ ) L_{z}(\gamma) Lz(γ)分别用于计算U和Z的真实值与DNN预测值之间的差异。
    L f ( θ , γ ) L_{f}(\theta, \gamma) Lf(θ,γ)是残差的损失项。
    损失函数的具体形式如下:
    L u ( θ ) = 1 N u ∑ i = 1 N u ( U ^ ( x , t ; θ ) − U ) 2 , L z ( γ ) = 1 N z ∑ i = 1 N z ( Z ^ ( x , t ; γ ) − Z ) 2 , L f ( θ , γ ) = 1 N f [ ∑ i = 1 N f f ^ c 2 ( x , t ; θ , γ ) + ∑ i = 1 N f f ^ m 2 ( x , t ; θ , γ ) ] , \begin{array}{c}L_{u}(\theta)=\frac{1}{N_{u}} \sum_{i=1}^{N_{u}}(\widehat{U}(x, t ; \theta)-U)^{2}, \\L_{z}(\gamma)=\frac{1}{N_{z}} \sum_{i=1}^{N_{z}}(\widehat{Z}(x, t ; \gamma)-Z)^{2}, \\L_{f}(\theta, \gamma)=\frac{1}{N_{f}}\left[\sum_{i=1}^{N_{f}} \widehat{f}_{c}^{2}(x, t ; \theta, \gamma)+\sum_{i=1}^{N_{f}} \widehat{f}_{m}^{2}(x, t ; \theta, \gamma)\right],\end{array} Lu(θ)=Nu1i=1Nu(U (x,t;θ)U)2,Lz(γ)=Nz1i=1Nz(Z (x,t;γ)Z)2,Lf(θ,γ)=Nf1[i=1Nff c2(x,t;θ,γ)+i=1Nff m2(x,t;θ,γ)],

  4. 在使用PINN模型预测Z(水位)时会有一个问题:在观测值有限的情况下,预测的水位很可能会出现负值(即低于河床的高度),同时Z的不准确就会导致其他变量(如:A、B、K)不准确。
    为了确保这样错误的计算不会产生连锁反映,在计算水力参数之前,作者对预测的水位值进行了限制(如果它们低于河床高度,就会将其设置为等于河床高度)。但是,这种方法是有缺点的当预测的水位低于河床高度时,对应的偏微分方程会自动简化为零。这并不符合真实的物理规律。
    为了解决这个问题,作者在原来的损失函数基础上加入了一个软约束项,其通过惩罚预测水位超出期望范围的情况来增强模型的物理一致性。通过这种约束的设置,可以让模型的预测结果更加具有科学性。
    L f ( θ , γ ) = 1 N f [ ∑ i = 1 N f f ^ c 2 ( x , t ; θ , γ ) + ∑ i = 1 N f f ^ m 2 ( x , t ; θ , γ ) ] + ω 1 N f ∑ i = 1 N f f s 2 ( x , t ) L_{f}(\theta, \gamma)=\frac{1}{N_{f}}\left[\sum_{i=1}^{N_{f}} \widehat{f}_{c}^{2}(x, t ; \theta, \gamma)+\sum_{i=1}^{N_{f}} \widehat{f}_{m}^{2}(x, t ; \theta, \gamma)\right]+\omega \frac{1}{N_{f}} \sum_{i=1}^{N_{f}} f_{s}^{2}(x, t) Lf(θ,γ)=Nf1 i=1Nff c2(x,t;θ,γ)+i=1Nff m2(x,t;θ,γ) +ωNf1i=1Nffs2(x,t)
    其中ω表示惩罚系数,设为10-5。惩罚系数变大可以直接加强这个约束,从而减少水位超出范围的可能性。
    f s ( x , t ) f_{s}(x, t) fs(x,t)的具体形式为:
    f s ( x , t ) = { Z ^ − Z max ⁡ ,  if  Z max ⁡ ≤ Z ^ 0 ,  if  Z min ⁡ ≤ Z ^ < Z max ⁡ Z min ⁡ − Z ^ ,  if  Z ^ < Z min ⁡ f_{s}(x, t)=\left\{\begin{array}{clc}\hat{Z}-Z_{\max }, & \text { if } & Z_{\max } \leq \widehat{Z} \\0 , & \text { if }& Z_{\min } \leq \widehat{Z}<Z_{\max } \\Z_{\min }-\widehat{Z}, & \text { if } & \widehat{Z}<Z_{\min }\end{array}\right. fs(x,t)= Z^Zmax,0,ZminZ , if  if  if ZmaxZ ZminZ <ZmaxZ <Zmin
    Zmin和Zmax分别为截面的最低点和最高点标高。如果预测的水位超出了期望的范围,这个约束就会起到作用;如果预测的水位在期望范围内,这个惩罚项就会变为零。
    在这里插入图片描述

  5. 网状的河流由多个河道组成,每个河道都有单独的空间坐标。此外,在河道交汇的地方,水流会分成多个部分,这些交叉点在模型中被视为内部边界。在传统的数值模型中,处理这些交汇点会增加模型的复杂性和计算量。但在PINNs中,通过实施“水位相等”原则,增加了结点约束的同时又不会增加模型的复杂性。 这种方法在观测数据缺乏的情况下,降低了无法收敛的风险的同时也提高了预测的准确性。
    作者通过引入了一个与这些结方程相关的约束项 L j ( θ , γ ) L_{j}(\theta, \gamma) Lj(θ,γ),其具体形式如下:
    L j ( θ , γ ) = 1 N j [ ∑ i = 1 N j g ( Z ^ i in  , Z ^ iout  ) ] + 1 N j [ ∑ i = 1 N j ( Q ^ in − Q ^ out  ) ] , L_{j}(\theta, \gamma)=\frac{1}{N_{j}}\left[\sum_{i=1}^{N_{j}} g\left(\widehat{Z}_{i_{\text {in }}}, \widehat{Z}_{\text {iout }}\right)\right]+\frac{1}{N_{j}}\left[\sum_{i=1}^{N_{j}}\left(\widehat{Q}_{\text {in}}-\widehat{Q}_{\text {out }}\right)\right], Lj(θ,γ)=Nj1 i=1Njg(Z iin ,Z iout ) +Nj1 i=1Nj(Q inQ out ) ,
    其中Nj表示河网中结点的总数。 g ( ) g() g()表示满足与连接点相连的横截面上的水位的函数关系。

实验

作者利用HEC-RAS生成训练数据并引入少量随机白噪声(0.2%),采用数值实验,通过RMSE和MAPE评估模型性能。

实验一:直道稳定流条件

实验一的条件是在稳态条件下的单个河流河段。作者通过创建一个受控环境,从而可以对增强后的PINNs方法进行评估。
在这里插入图片描述
在实验一中应用预训练方法评估横截面水力参数,以C1截面为例预训练后DNN预测值与插值计算结果贴合,收敛时达到足够精度,验证了预训练方法的有效性。
其中,图(a)展示了流量面积(A)的真实值和预测值的对比,图(b)展示了图(a)在训练时的损失变化。图©展示了输水能力函数(K)的真实值和预测值的对比,图(d)展示了图(b)在训练时的损失变化。结果表面:
在这里插入图片描述
此外,作者通过不同的观测横截面数量(12、6、4、2)进行训练,评估PINNs在不同数据量下的表现。其中,神经网络架构设为三个隐藏层,每层50个神经元,激活函数采用Tanh,损失函数为均方误差(MSE),并对水位数据集进行z - score标准化。优化策略的初始阶段,AdamW学习率根据Lc的值动态调整,训练共20,000个周期,之后用L - BFGS - B优化器确保收敛。
在不同的横截面数量中,模型的参数如下:
在这里插入图片描述
作者使用12个横截面的观测数据,通过对比HEC-RAS和PINNs的结果,验证PINNs能捕捉到水流横截面内的水文动力特征,包括速度和深度等水动力特性的空间变化和分布。对于Z和U变量,RMSE分别为 2.63 × 1 0 − 3 2.63×10^{-3} 2.63×103 2.97 × 1 0 − 4 2.97×10^{-4} 2.97×104,MAPE分别为0.003%和0.02%,Q的最大绝对误差为 1.83 m 3 / s 1.83 m^{3}/s 1.83m3/s,能量坡度也能准确捕捉水动力过程。
在这里插入图片描述
此外,作者还对预训练对导数计算的影响进行了分析,目的是确定预训练对导数计算精度的影响。 对比有无预训练方法的变量Q和QU的导数计算,发现预训练对导数计算精度影响不大,验证了预训练模型可整合到计算框架中。
在这里插入图片描述
在实验一的最后,作者还对观测横截面数量对模型结果的影响进行了探究。随着用作约束的横截面数量减少,模型的预测精度下降。
实验结果表明,当受6个横截面观测约束时,U的MAPE为7%,Z的RMSE为0.14m;约束为4个横截面观测时,U的MAPE变为20.5%,Z的RMSE为0.36m。在10次实验中,传统神经网络和PINN在不同观测截面数量下进行评估,结果显示随着约束数据减少,两者误差均上升,但PINN在不同约束下表现出更稳定的精度和计算稳定性。
在这里插入图片描述

实验二:环状网络中的非稳定流条件

实验二目的是评估PINNs在捕捉真实世界环形河道系统中复杂的流动模式和边界交互能力。研究背景是在一个环形河道网络中的非稳定流动态。主河道分为两个子河道,然后再下游重新汇合。
如下图所示:
在这里插入图片描述
利用预训练技术,模型增加了河宽作为变量以适应非稳定流条件,从结果来看,模型预测值和实际训练值高度一致,证明了模型的有效性。
在这里插入图片描述
实验二的神经网络包含三个隐藏层,每层30个神经元,激活函数和损失函数分别为Tanh和MSE。AdamW优化器初始学习率为0.001,训练过程中衰减率为0.001,经过20,000次迭代训练达到稳定收敛后,再用L - BFGS - B优化器进行微调。实验二中使用了水位相等约束方程和节点处的流量守恒约束。
参数如下:
在这里插入图片描述
作者在实验二中研究了时间间隔对预测精度的影响。在10分钟内,以不同时间间隔进行实验,该评估显示,数据约束间隔的减少并不会导致预测准确性的明显下降。虽然物理约束可在一定程度上弥补数据稀疏,但数据过度缺乏会使精度有所下降。在 Δ o b s = 10 m i n \Delta obs = 10min Δobs=10min时,U和Z的最大误差分别为0.033m/s和0.018m,相比PINNs在1D稳态明渠案例中的水位误差(可达1m)。
在这里插入图片描述
此外,作者还分析了PDE约束间隔对模型性能的影响。作者通过分析不同时间步长间隔下观测数据和PDE残差约束时26个不同横截面的模型评估指标(U的MAPE和Z的RMSE),结果表明模型在部分组表现较好,部分组精度有不同程度下降,其中数据约束最少的第四组和第八组表现最差,但在一定范围内PDE约束的时间间隔对计算精度影响不明显。
在这里插入图片描述

结论

预训练水力参数可加速训练,新物理约束确保收敛且加深物理理解,增强后的PINNs在河网水动力建模中高效且数据需求少、对时间步长敏感度低。作者通过改进PINNs方法对实际场景中具有不规则横截面的河网水动力进行有效建模。此外,预处理水力参数提升了训练速度的同时也没有牺牲精度,层归一化解决梯度消失问题,新物理约束确保训练收敛并丰富物理内涵。实验表明,改进后的PINNs方法数据需求少,且对时间步长敏感度低,是河网水动力建模的有效方法。

缺点及展望

缺点:
作者提出本论文的实验比较简单,未涵盖真实河网的全部复杂性。此外,使用PINNs处理时间相关PDE时局限于固定时域,无法计算超出边界的解,缺乏泛化能力。
研究展望:
可以将增强后的PINNs架构研究更多河段,验证模型的泛化能力;优化模型种训练算法和网络架构,提升模型的性能;研究在增强后的PINN框架的在实际种的应用,如洪灾防范、水资源和环境保护等。

二、代码实践

在之前我们阅读了一篇PINN求解PDE的论文,其中涉及到使用pytorch实现PINN求解PDE,其中,有一个部分是使用PINN拟合Burgers方程。今天我们就来尝试复现,并了解一下PINNs的代码实现。
代码:https://github.com/jayroxis/PINNs
参考文章:https://blog.csdn.net/qq_42818403/article/details/142685980
Burgers方程是一种经典的非线性偏微分方程,在流体力学、交通流等领域有着广泛的应用。
Burgers方程公式为: u t + u u x = ν u x x , x ∈ [ − 1 , 1 ] , t ≥ 0 u_{t}+u u_{x}=\nu u_{x x}, \quad x \in[-1,1], t \geq 0 ut+uux=νuxx,x[1,1],t0
其中,u 表示速度场,t 为时间,x 为空间坐标,ν 为粘性系数。

如下图所示:
初始时刻u符合sin分布,随着时间推移在x=0处发生间断。这个经典问题,可使用pytorch通过PINN实现对Burgers方程的求解。
在这里插入图片描述
网络架构:

  • 输入: 时间t和空间坐标x(形状均为 ( n , 1 ) (n,1) (n,1))
  • 输出: ( t , x ) (t,x) (t,x)上的解 u ( t , x ) u(t,x) u(t,x)
  • 激活函数: 使用 Tanh 激活函数能够有效处理非线性问题,同时可以使模型生成平滑的函数
  • 边界条件要求: u ( t , − 1 ) = u ( t , 1 ) = 0 , t ≥ 0 u(t,-1)=u(t, 1)=0, \quad t \geq 0 u(t,1)=u(t,1)=0,t0,即 x = − 1 x = -1 x=1 x = 1 x =1 x=1时,解为 0。因此,我们可以通过计算这些边界上的解值,定义边界损失。
  • 初始条件(t=0时): u ( 0 , x ) = − sin ⁡ ( π x ) , x ∈ [ − 1 , 1 ] u(0, x)=-\sin (\pi x), \quad x \in[-1,1] u(0,x)=sin(πx),x[1,1],即 u ( 0 , x ) = − s i n ( π x ) u(0,x)=-sin(πx) u(0,x)=sin(πx)。因此,初始损失通过比较模型预测的解和精确初始条件来定义。
  • 选用7层全连接神经网络,每层包含 100 个神经元,激活函数为 Tanh。该网络能够处理输入的非线性关系,并生成较为平滑的解。

代码实现如下:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np


# 绘制损失曲线
def plot_loss(losses):
    plt.figure(figsize=(8, 5))
    plt.plot(losses, color='blue', lw=2)
    plt.xlabel('Epoch', fontsize=14)
    plt.ylabel('Loss', fontsize=14)
    plt.title('Training Loss Curve', fontsize=16)
    plt.grid(True)
    plt.tight_layout()
    plt.show()

# 绘制数值解图像
def plot_solution(model):
    x = torch.linspace(-1, 1, 100).unsqueeze(1)
    t = torch.full((100, 1), 0.0)  # 在t=0时绘制解
    with torch.no_grad():
        u_pred = model(t, x).numpy()
    
    # 参考解 u(0,x) = -sin(πx)
    u_exact = -np.sin(np.pi * x.numpy())

    plt.figure(figsize=(8, 5))
    plt.plot(x.numpy(), u_pred, label='Predicted Solution', color='red', lw=2)
    plt.plot(x.numpy(), u_exact, label='Exact Solution (Initial)', color='blue', lw=2, linestyle='dashed')
    plt.xlabel('x', fontsize=14)
    plt.ylabel('u(t=0, x)', fontsize=14)
    plt.title('Burgers Equation Solution at t=0', fontsize=16)
    plt.legend(fontsize=12)
    plt.grid(True)
    plt.tight_layout()
    plt.show()
# 绘制整个 (x, t) 平面的解
def plot_solution_3d(model):
    # 创建 (x, t) 网格
    x = torch.linspace(-1, 1, 100).unsqueeze(1)
    t = torch.linspace(0, 1, 100).unsqueeze(1)
    X, T = torch.meshgrid(x.squeeze(), t.squeeze())
    
    # 将 X 和 T 拉平,方便模型预测
    x_flat = X.reshape(-1, 1)
    t_flat = T.reshape(-1, 1)

    with torch.no_grad():
        u_pred = model(t_flat, x_flat).numpy().reshape(16, 16)

    # 绘制三维曲面图
    fig = plt.figure(figsize=(10, 7))
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(X.numpy(), T.numpy(), u_pred, cmap='viridis')

    ax.set_xlabel('x', fontsize=12)
    ax.set_ylabel('t', fontsize=12)
    ax.set_zlabel('u(t, x)', fontsize=12)
    ax.set_title('Solution of Burgers Equation on (x, t) Plane', fontsize=14)

    plt.show()

# 绘制二维等高线图
def plot_solution_contour(model):
    # 创建 (x, t) 网格
    x = torch.linspace(-1, 1, 100).unsqueeze(1)
    t = torch.linspace(0, 1, 100).unsqueeze(1)
    X, T = torch.meshgrid(x.squeeze(), t.squeeze())

    # 将 X 和 T 拉平,方便模型预测
    x_flat = X.reshape(-1, 1)
    t_flat = T.reshape(-1, 1)

    with torch.no_grad():
        u_pred = model(t_flat, x_flat).numpy().reshape(16, 16)

    # 绘制二维等高线图
    plt.figure(figsize=(8, 6))
    plt.contourf(X.numpy(), T.numpy(), u_pred, 100, cmap='viridis')
    plt.colorbar(label='u(t, x)')
    
    plt.xlabel('x', fontsize=12)
    plt.ylabel('t', fontsize=12)
    plt.title('Contour Plot of Burgers Equation Solution', fontsize=14)
    
    plt.tight_layout()
    plt.show()
    
    
# 定义网络结构
class PINN(nn.Module):
    def __init__(self):
        super(PINN, self).__init__()
        self.layer = nn.Sequential(
            nn.Linear(2, 16), nn.Tanh(),
            nn.Linear(16, 16), nn.Tanh(),
            nn.Linear(16, 16), nn.Tanh(),
            nn.Linear(16, 16), nn.Tanh(),
            nn.Linear(16, 16), nn.Tanh(),
            nn.Linear(16, 1)
        )
    
    def forward(self, t, x):
        u = self.layer(torch.cat([t, x], dim=1))
        return u

# 定义Burgers方程中的物理损失
def physics_loss(model, t, x):
    u = model(t, x)
    u_t = torch.autograd.grad(u, t, torch.ones_like(t), create_graph=True)[0]
    u_x = torch.autograd.grad(u, x, torch.ones_like(x), create_graph=True)[0]
    u_xx = torch.autograd.grad(u_x, x, torch.ones_like(x), create_graph=True)[0]
    f = (u_t + u * u_x - (0.01 / torch.pi) * u_xx).pow(2).mean()
    return f

# 定义边界条件损失
def boundary_loss(model, t, x_left, x_right):
    u_left = model(t, x_left)
    u_right = model(t, x_right)
    return u_left.pow(2).mean() + u_right.pow(2).mean()

# 初始条件损失
def initial_loss(model, x):
    t_0 = torch.zeros_like(x)
    u_init = model(t_0, x)
    u_exact = -torch.sin(torch.pi * x)
    return (u_init - u_exact).pow(2).mean()

# 训练模型并记录损失
def train(model, optimizer, num_epochs):
    losses = []
    for epoch in range(num_epochs):
        optimizer.zero_grad()

        # 随机采样 t 和 x,并确保 requires_grad=True
        t = torch.rand(3000, 1, requires_grad=True)
        x = torch.rand(3000, 1, requires_grad=True) * 2 - 1  # x ∈ [-1, 1]

        # 物理损失
        f_loss = physics_loss(model, t, x)

        # 边界条件损失
        t_bc = torch.rand(500, 1)
        x_left = -torch.ones(500, 1)
        x_right = torch.ones(500, 1)
        bc_loss = boundary_loss(model, t_bc, x_left, x_right)

        # 初始条件损失
        x_ic = torch.rand(1000, 1) * 2 - 1
        ic_loss = initial_loss(model, x_ic)

        # 总损失
        loss = f_loss + bc_loss + ic_loss
        loss.backward()
        optimizer.step()

        # 记录损失
        losses.append(loss.item())

        if epoch % 100 == 0:
            print(f'Epoch {epoch}, Loss: {loss.item()}')
    
    return losses

# 初始化模型和优化器
model = PINN()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

# 训练模型
losses = train(model, optimizer, num_epochs = 100000)

# 绘制训练损失曲线
plot_loss(losses)

# 绘制数值解图像
plot_solution(model)
plot_solution_3d(model)   # 三维曲面图
plot_solution_contour(model)   # 二维等高线图

结果如下图所示:
基本上预测结果能够拟合实际的解,且loss无线接近于0。
通过 PINN 结合自动微分和物理约束,能够高效求解 Burgers 方程这样的非线性偏微分方程。相比传统的数值方法,PINN 具有处理高维问题和复杂边界条件的潜力。
在这里插入图片描述
在这里插入图片描述

总结

本周主要精读了一篇PINN的文献和复现了之前论文的代码。
本周阅读的文献中提出了一种增强型PINNs方法,其通过预处理水力参数、引入层归一化以及增加水位范围和节点方程等物理约束,有效解决了传统PINNs在河网水动力建模中的局限性,且增强后的PINNs架构能够以较少的数据预测河网水动力,且对时间步长的敏感性低,是一种有效的模拟方法。此外,在代码实现部分详细介绍了网络架构的设计、物理损失、边界条件损失和初始条件损失的定义,以及模型的训练过程。
下一周计划阅读timeGan文献。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

STM32 FreeROTS 任务创建和删除实验(静态方法)

实验目标 学会 xTaskCreateStatic( )和 vTaskDelete( ) 的使用&#xff1a; start_task&#xff1a;用来创建其他的三个任务。task1&#xff1a;实现LED1每500ms闪烁一次。task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键KEY1是否按下&#xff0c;按…

家政服务小程序,打造智慧家政新体验

春节即将来临&#xff0c;家政市场呈现出了火热的场景&#xff0c;大众对家政服务的需求持续增加。 近年来&#xff0c;家政市场开始倾向数字化、智能化&#xff0c;借助科学技术打造家政数字化平台&#xff0c;让大众在手机上就可以预约家政服务&#xff0c;减少传统家政市场…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

Vue3 nginx 打包后遇到的问题

前端vite文件配置 export default defineConfig({plugins: [vue(),DefineOptions()],base:./,resolve:{alias:{:/src, //配置指向src目录components:/src/components,views:/src/views}},server:{// host:0.0.0.0,// port:7000,proxy:{/api:{target:xxx, // 目标服务器地址 &am…

linux下配置python环境及库配置

概述 使用Linux作为开发环境拥有完整的开源工具链且易于通过系统包管理器安装&#xff0c;与系统集成良好。对于开源项目开发&#xff0c;能方便地从源代码编译安装软件&#xff0c;使用构建工具&#xff0c;提供更原生的开发环境。 可高度定制系统&#xff0c;满足特殊开发需求…

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…

spark任务优化参数整理

以下参数中有sql字眼的一般只有spark-sql模块生效&#xff0c;如果你看过spark的源码&#xff0c;你会发现sql模块是在core模块上硬生生干了一层&#xff0c;所以反过来spark-sql可以复用core模块的配置&#xff0c;例外的时候会另行说明&#xff0c;此外由于总结这些参数是在不…

华为数据中心CE系列交换机级联M-LAG配置示例

M-LAG组网简介 M-LAG&#xff08;Multi-chassis Link Aggregation&#xff09;技术是一种跨设备的链路聚合技术&#xff0c;它通过将两台交换机组成一个逻辑设备&#xff0c;实现链路的负载分担和故障切换&#xff0c;从而提高网络的可靠性和稳定性。下面给大家详细介绍如何在…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测

您需要服务器机房温度监测解决方案吗&#xff1f; 服务器机房是企业中用于存储、管理和维护服务器及其相关组件的设施。服务器机房通常位于数据中心内&#xff0c;是一个专门设计的物理环境&#xff0c;旨在确保服务器的稳定运行和数据的安全性。服务器机房主要起到存储和管理数…

4 AXI USER IP

前言 使用AXI Interface封装IP&#xff0c;并使用AXI Interface实现对IP内部寄存器进行读写实现控制LED的demo&#xff0c;这个demo是非常必要的&#xff0c;因为在前面的笔记中基本都需哟PS端与PL端就行通信互相交互&#xff0c;在PL端可以通过中断的形式来告知PS端一些事情&…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。在上一篇博客文章中&#xff0c;已经对TCP协议及如何编程实现进行了详细的梳理讲解&#xff0c;在本文中&#xff0c;主要讲解与TCP一样广泛使用了另一种协议&#xff1a…

A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置

下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器&#xff0c;集成了先进的 AI 技术&#xff0c;旨在提升编程效率。以下是其主要特点和功能&a…

基于机器学习随机森林算法的个人职业预测研究

1.背景调研 随着信息技术的飞速发展&#xff0c;特别是大数据和云计算技术的广泛应用&#xff0c;各行各业都积累了大量的数据。这些数据中蕴含着丰富的信息和模式&#xff0c;为利用机器学习进行职业预测提供了可能。机器学习算法的不断进步&#xff0c;如深度学习、强化学习等…

【王树森搜索引擎技术】概要01:搜索引擎的基本概念

1. 基本名词 query&#xff1a;查询词SUG&#xff1a;搜索建议文档&#xff1a;搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光&#xff1a;用户在搜索结果页上看到文档&#xff0c;就算曝光文档点击&#xff1a;在曝光后&#xff0c;用户点击文档&…

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…