TensorFlow有限差分法计算四阶导数精度低于NumPy问题求解
问题解答
核心原因:默认浮点精度差异
该问题本质是NumPy和TensorFlow的默认浮点精度设置不一致,叠加四阶有限差分运算对数值误差的高敏感性导致的:
- NumPy的
linspace、tanh等基础数值运算默认使用float64(双精度浮点数),精度足够抵消四阶差分运算过程中产生的截断误差,因此输出结果平滑无噪声。 - TensorFlow默认在CPU、GPU设备上的数值运算均使用float32(单精度浮点数),而四阶差分需要对相邻采样点做多次加减乘除运算,会不断放大单精度浮点数本身的截断误差,最终表现为结果上的锯齿状噪声。
修复方案
你只需要在定义TensorFlow张量时显式指定精度为float64,即可得到和NumPy版本完全一致的平滑结果,修改后的示例代码如下:
import tensorflow as tf import matplotlib.pyplot as plt def action(y,x): # 采样点间距 h = (x[-1] - x[0]) / (int(x.shape[0]) - 1) # 四阶导数计算 dy4 = (y[4:] - 4*y[3:-1] + 6*y[2:-2] - 4*y[1:-3] + y[:-4])/(h**4) return dy4 # 显式指定生成张量的精度为float64 x = tf.linspace(0.0, 30, 1000, dtype=tf.float64) y = tf.tanh(x) dy4 = action(y,x) sess = tf.compat.v1.Session() plt.plot(sess.run(dy4)) plt.show()
内容的提问来源于stack exchange,提问作者Tabin
相关产品推荐
相关产品推荐

