本文使用 TensorFlow 1.15 环境搭建深度神经网络(PINN)求解一维 Poisson 方程:
− Δ u = f in Ω , u = 0 on Γ : = ∂ Ω . \begin{align} -\Delta u &= f \quad & \text{in } \Omega,\\ u & =0 \quad & \text{on } \Gamma:=\partial \Omega. \end{align} −Δuu=f=0in Ω,on Γ:=∂Ω.
其中 Ω = [ X a , X b ] \Omega = [X_a,X_b] Ω=[Xa,Xb] 是一段区间,一维情况 Δ u = u x x \Delta u = u_{xx} Δu=uxx.
完整代码及其注释如下:
import tensorflow as tf
#print(tf.__version__)
import numpy as np
import math
# def is_log2_close_to_int(n, eps=1e-9):
# log_n = math.log2(n)
# return math.isclose(math.fmod(log_n, 1), 0, abs_tol=eps)
# 定义Exact类,用于计算精确解
class Exact:
def __init__(self, xa, xb):
# 初始化类,接受两个参数xa和xb,代表区间的两个端点
self.xa = xa # 区间左端点
self.xb = xb # 区间右端点
def u_exact(self, X):
# 计算并返回精确解u(X)
# 这里使用正弦函数作为精确解,其频率与区间长度(xb-xa)有关
u = np.sin(2*np.pi*X / (self.xb - self.xa))
return u
# 定义Dataset类,用于生成数据
class Dataset:
def __init__(self, x_range, N_res, N_b, xa, xb):
# 初始化类,接受多个参数
self.x_range = x_range # 区间范围,例如[0, 1]
self.N_res = N_res # 内部节点数,用于构建内部网格
self.N_b = N_b # 边界条件点数(通常这里N_b为2,因为有两个边界)
self.xa = xa # 区间左端点
self.xb = xb # 区间右端点
def bc(self, X_b):
# 计算并返回边界条件上的精确解
# 创建一个Exact对象,用于计算精确解
U_bc = Exact(self.xa, self.xb)
u_bc = U_bc.u_exact(X_b) # 计算边界条件X_b上的精确解
return u_bc
def build_data(self):
# 构建并返回数据集,包括内部网格点、边界网格点和区间端点
x0 = self.x_range[0] # 区间左端点
x1 = self.x_range[1] # 区间右端点
# 区间端点(最小值和最大值)
Xmin = np.array