论文:Physics-Informed Deep Learning and its Application in Computational Solid and Fluid Mechanics
随着深度学习的快速发展,利用神经网络(Neural Network, NN)求解各类科学计算问题受到了越来越多的关注,包括流场、应力场、热场等问题[1-2]。在固体力学领域,深度学习主要用于材料建模,通过NN取代传统的本构模型[3-5]。在这些应用中,基于大量训练样本的神经网络通过最小化损失来学习输入到输出的映射关系。然而,在实际应用中,获取大量的训练样本通常非常困难。为了有效减少对训练样本量的依赖,Raissi等[6-7]提出物理信息神经网络(Physics-Informed Neural Network, PINN)的方法。PINN可以在少量数据甚至没有数据下通过物理方程辅助学习实现对问题解的推断。该方法核心是通过惩罚的方式将物理约束(如偏微分方程,边界条件等)编码到损失函数中,从而将微分方程求解转化为最小化损失函数的优化问题,最后基于梯度的反向传播优化算法最小化损失,实现对问题解的预测推断。
在固体力学领域,弹性方程是描述材料在受力下变形行为的重要数学模型,理解和应用弹性方程对于设计和分析结构的性能和行为至关重要。线弹性,或弹性理论,是研究材料在外力作用下的形变和应力的学科,是连续介质力学的一个分支。这个理论在建筑、机械、航空航天和许多其他工程领域都有广泛的应用。近年来,PINN已成功地被应用于各种弹性方程的求解。Rao等[8]提出了基于PINN的线弹性方程求解方法,他们将偏微分方程(Partial Differential Equation,PDE)编码到损失函数中而边界(Boundary Condition,BC)通过强制约束方式编码到网络输出中,从而实现了线弹性方程的求解。Haghighat等[9]基于PINN,通过将动量平衡方程和本构方程编码到损失函数中,成功地求解了线弹性方程的正、逆问题。此外,W. Abueidda等[10]提出了一种基于PINN的超弹性方程求解方法,通过将PDE和BC以积分形式编码到损失函数进行约束求解。在此基础上,W. Abueidda等[11]利用PINN进一步研究了涉及不同材料形变的新胡克超弹性和冯·米塞斯塑性问题的求解。为了实现更高效的求解,Qin等[12]提出了基于元学习和PINN的超弹问题求解方法,通过相关超弹任务分布中学习后,实现新任务下超弹问题的求解。然而,与数值方法相比,PINN求解效率仍较低[13]。因此,如何结合PINN物理驱动优势来实现弹性方程地高效求解仍然是一个重要的挑战。
基本问题:
PINN的主要思想为先构建一个输出结果为 u u u 的神经网络,将其作为PDE解的代理模型,将PDE信息作为约束,编码到神经网络损失函数中进行训练。损失函数主要包括4部分:偏微分结构损失(PDE loss),边值条件损失(BC loss)、初值条件损失(IC loss)以及真实数据条件损失(Data loss)。
网格:
1. 训练
# %load Plane_Stress_W-PINNs.py
"""
Forward Problem for Plane Stress Linear Elasticity Boundary Value Problem
Weighted-Physics-Informed Neural Networks (W-PINNs)
Author: Alexandros D.L Papados
In this code we solve for the deformation of a material with Young's Modulus
of E = 1.0 GPA and Poisson Ratio of nu = 0.3. The deformation are represented
by u and v in the x and y directions respectively. We solve the following PDE using
W-PINNs:
G[u_xx + u_yy] + G((1+nu)/(1-nu))[u_xx + v_yx] = sin(2pi*x)sin(2pi*y)
G[v_xx + v_yy] + G((1+nu)/(1-nu))[v_yy + u_xy] = sin(pi*x)+ sin(2pi*y)
with Dirichlet boundary conditions.
The Neural Network is constructed as follows:
( sigma(x,y,theta) )
( u(x,y) )
( x ) ( sigma(x,y,theta) ) ( )
Input: ----> Activation Layers: . ----> Output Layer: ( )
( y ) . ( )
. ( v(x,y) )
( sigma(x,y,theta) )
The final output will be [x,y,u,v,e_x,e_y], where e_x and e_y are the strains in the x and y directions
respectively.
Default example is Domain I (Square Domain, [0,1]^2)
"""
import torch
import torch.nn as nn
import numpy as np
import time
import scipy.io
torch.manual_seed(123456)
np.random.seed(123456)
E = 1 # Young's Modulus
nu = 0.3 # Poisson Ratio
G = ((E/(2*(1+nu)))) # LEBVP coefficient
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.net = nn.Sequential() # Define neural network
self.net.add_module('Linear_layer_1', nn.Linear(2, 30)) # First linear layer
self.net.add_module('Tanh_layer_1', nn.Tanh()) # First activation Layer
for num in range(2, 7): # Number of layers (2 through 7)
self.net.add_module('Linear_layer_%d' % (num), nn.Linear(30, 30)) # Linear layer
self.net.add_module('Tanh_layer_%d' % (num), nn.Tanh()) # Activation Layer
self.net.add_module('Linear_layer_final', nn.Linear(30, 3)) # Output Layer
# Forward Feed
def forward(self, x):
return self.net(x)
# Loss of PDE and BCs
def loss(self, x, x_b, b_u,b_v,epoch