本文使用 TensorFlow 1.15 环境搭建深度神经网络(PINN)求解二维 Poisson 方程:
模型问题
− Δ u = f in Ω , u = g on Γ : = ∂ Ω . \begin{align} -\Delta u &= f \quad & \text{in } \Omega,\\ u & =g \quad & \text{on } \Gamma:=\partial \Omega. \end{align} −Δuu=f=gin Ω,on Γ:=∂Ω.
其中 Ω = [ X a , X b ] × [ Y a , Y b ] \Omega = [X_a,X_b]\times[Y_a,Y_b] Ω=[Xa,Xb]×[Ya,Yb] 是一个二维矩形区域, Δ u = u x x + u y y , g \Delta u = u_{xx}+u_{yy}, g Δu=uxx+uyy,g 是边界条件给定的函数,可以非零.
代码展现
二维PINN 与一维的整体框架是类似的,只是数据的维度升高了,为了读者方便这里直接展示完整代码,每段代码都添加了注释帮助理解:
检查 TF 版本号:
# PINN 求解 2D Poisson 方程
import tensorflow as tf
print(tf.__version__)
主要函数:
import os
#tensorflow-intel automatically set the TF_ENABLE_ONEDNN_OPTS=1
#os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
# Here, TF_ENABLE_ONEDNN_OPTS=0 should be above import tensorflow as tf
import tensorflow as tf
import numpy as np
import time
import matplotlib.pyplot as plt
import scipy.io
import math
# 定义数据集类,用于生成训练所需的数据
class Dataset:
def __init__(self, x_range, y_range, N_res, N_bx, N_by, Nx, Ny, xa, xb, ya, yb):
self.x_range = x_range # x 轴范围
self.y_range = y_range # y 轴范围
self.N_res = N_res # 方程残差点数量
self.N_bx = N_bx # x 方向边界条件点数量
self.N_by = N_by # y 方向边界条件点数量
self.Nx = Nx # x 方向网格数量
self.Ny = Ny # y 方向网格数量
self.xa = xa # x 方向左边界
self.xb = xb # x 方向右边界
self.ya = ya # y 方向下边界
self.yb = yb # y 方向上边界
# 定义边界条件函数
# 可以求解非齐次 Dirichlet 边界条件
def bc(self, X_b):
U_bc = Exact(self.xa, self.xb, self.ya, self.yb)
u_bc = U_bc.u_exact(X_b)
return u_bc
# 生成数据:残差点和边界条件点
def build_data(self):
x0, x1 = self.x_range
y0, y1 = self.y_range
Xmin = np.hstack((x0, y0))
Xmax = np