本文提供的代码采用2.x版本
已知 ,控制方程形式:
初始条件:
边界条件:
该方程的解析表达式通过Hopf-Cole变换获得,较为复杂,感兴趣的读者可自行搜索。
@tf.function
def net_f(self, x, t):
"""Compute physics residual"""
# 使用单个GradientTape计算所有导数
with tf.GradientTape() as tape2:
tape2.watch([x, t])
with tf.GradientTape(persistent=True) as tape1:
tape1.watch([x, t])
u = self.net_u(x, t)
# 计算一阶导数
u_t = tape1.gradient(u, t)
u_x = tape1.gradient(u, x)
# 计算二阶导数
u_xx = tape2.gradient(u_x, x)
# 清理tapes
del tape1
# Burgers方程残差: u_t + u*u_x - nu*u_xx
f = u_t + u * u_x - self.nu * u_xx
return f

参数 和 未知,控制方程形式:
已知一些测试点数据,反求未知参数。
np.linalg.norm(u_star, 2)
u_train_noisy = u_train + noise * np.std(u_train) * np.random.randn(u_train.shape[0], u_train.shape[1])

通过上图显示的信息,可以看到精确数据训练结果和带有噪声数据训练结果和真实结果的对比。