PINN求解burger方程,tensorflow框架,附代码(三)
TensorFlow 1.x和TensorFlow 2.x区别TensorFlow 1.x版本只有静态图模式,需要手动构建计算图,调试困难,但性能好。TensorFlow 2.x 初期:默认Eager Execution,易于调试,但性能较差。TensorFlow 2.x + @tf.function:两全其美:易于调试 + 高性能,方便在Eager Execution和 Graph Execution间转换本文提供的代码采用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 persistent=True时,tape1可以多次使用,但是需要手动管理内存,tape2自动清理。代码运行在Eager Execution模式下,但通过@tf.function可以在关键函数上获得了Graph Execution的性能优化。反问题参数 和 未知,控制方程形式: 已知一些测试点数据,反求未知参数。np.linalg.norm(u_star, 2) 计算u_star的2范数u_train_noisy = u_train + noise * np.std(u_train) * np.random.randn(u_train.shape[0], u_train.shape[1]) 噪声影响,np.std(u_train)是u_train的标准差,np.random.randn(u_train.shape[0], u_train.shape[1])标准正态分布取值上图中的黑色标记为进行训练的数据通过上图显示的信息,可以看到精确数据训练结果和带有噪声数据训练结果和真实结果的对比。来源:我的博士日记