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

第三十周周报

一、文献阅读

题目信息

摘要

在河网水动力过程研究中,数值模拟是研究常用方法,但存在计算复杂、数据处理等问题。随着计算技术发展,一维水动力模型虽能模拟河网非恒定流,但计算需求有时较高。传统的机器学习算法发展为物理系统建模有着很大的帮助,计算效率高,但存在缺乏物理可解释性、等问题。物理信息神经网络(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)≈∂x∂Q +B ∂t∂Z =f c(x,t;θ,γ),fm(x,t)≈∂t∂Q +∂x∂Q U +gA (∂x∂Z +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(θ)=Nu1∑i=1Nu(U (x,t;θ)−U)2,Lz(γ)=Nz1∑i=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=1∑Nff c2(x,t;θ,γ)+i=1∑Nff m2(x,t;θ,γ) +ωNf1i=1∑Nffs2(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,Zmin−Z , if if if Zmax≤Z Zmin≤Z <ZmaxZ <Zmin

    Z~min~和Z~max~分别为截面的最低点和最高点标高。如果预测的水位超出了期望的范围,这个约束就会起到作用;如果预测的水位在期望范围内,这个惩罚项就会变为零。

  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=1∑Njg(Z iin ,Z iout ) +Nj1 i=1∑Nj(Q in−Q out ) ,

    其中N~j~表示河网中结点的总数。 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×10−3和 2.97 × 1 0 − 4 2.97×10^{-4} 2.97×10−4,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],t≥0​

其中,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,t≥0,即 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。该网络能够处理输入的非线性关系,并生成较为平滑的解。

代码实现如下:

python 复制代码
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文献。

相关推荐
AAA 建材批发王哥(天道酬勤)44 分钟前
机器学习和深度学习是人工智能(AI)领域的两个重要分支,它们都依赖于数学、统计学和计算机科学的基础知识。
人工智能·深度学习·机器学习
APItesterCris1 小时前
如何监控和防范小红书笔记详情API的安全风险?
网络·笔记·安全
明朝百晓生1 小时前
【无线感知会议系列-21 】无线感知6G 研究愿景
网络·人工智能·算法·5g
&永恒的星河&1 小时前
深度剖析:NLP 领域基于 TF-IDF 和 Text-Rank 的关键字提取原理
人工智能·ai·自然语言处理·nlp·tf-idf·pagerank·textrank
编程乐趣2 小时前
Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5
人工智能·c#·gpt-3
学测绘的小杨2 小时前
数字艺术类专业人才供需数据获取和分析研究
大数据·人工智能·算法
编码小哥2 小时前
opencv对直方图的计算和绘制
人工智能·opencv·计算机视觉
bohu832 小时前
opencv笔记1
人工智能·笔记·opencv
三月七(爱看动漫的程序员)2 小时前
Active Prompting with Chain-of-Thought for Large Language Models
数据库·人工智能·深度学习·学习·语言模型·自然语言处理
UQI-LIUWJ2 小时前
论文略读:ASurvey of Large Language Models for Graphs
人工智能·语言模型·自然语言处理