精确计算x₂₀并反向递推求xₙ:结果验证与递推特性分析
首先回顾原问题的核心信息:已知 ( x_n = \int_0^1 \frac{t^n}{t+5} dt ),已推导得到正向递推式:
( x_n = \frac{1}{n} - 5x_{n-1} )
且 ( x_0 = \ln\left(\frac{6}{5}\right) = \ln1.2 )
一、精确计算 ( x_{20} ) 的方法:截断泰勒级数展开
我们可以把被积函数 ( \frac{1}{t+5} ) 在区间 [0,1] 上展开成收敛的泰勒级数:
[
\frac{1}{t+5} = \frac{1}{5} \cdot \frac{1}{1 + \frac{t}{5}} = \frac{1}{5} \sum_{k=0}^{\infty} (-1)^k \left( \frac{t}{5} \right)^k
]
这个级数在 ( t \in [0,1] ) 时绝对收敛,因此可以逐项积分:
[
x_n = \int_0^1 t^n \cdot \frac{1}{5} \sum_{k=0}^{\infty} (-1)^k \left( \frac{t}{5} \right)^k dt = \frac{1}{5} \sum_{k=0}^{\infty} \frac{(-1)k}{5k} \int_0^1 t^{n+k} dt
]
计算积分项 ( \int_0^1 t^{n+k} dt = \frac{1}{n+k+1} ),代入后得到级数形式的 ( x_n ):
[
x_n = \sum_{k=0}^{\infty} \frac{(-1)k}{5{k+1}(n+k+1)}
]
对于 ( n=20 ),这个级数收敛极快(每一项都乘以 ( -1/5 ),绝对值呈指数衰减),只要截断到绝对值小于 ( 10^{-16} ) 的项,就能达到机器全精度。你可以用这段代码验证:
def compute_xn(n): total = 0.0 k = 0 while True: term = ((-1)**k) / (5**(k+1) * (n + k + 1)) if abs(term) < 1e-16: break total += term k += 1 return total x20 = compute_xn(20) print(f"高精度x20:{x20:.18f}")
二、反向递推的结果与表现分析
把原正向递推式变形为反向递推式:
[
x_{n-1} = \frac{1}{5} \left( \frac{1}{n} - x_n \right)
]
用高精度的 ( x_{20} ) 代入,依次计算 ( x_{19} ) 到 ( x_0 )。
结果正确性
- 最终得到的 ( x_0 ) 会非常接近 ( \ln1.2 ),双精度下误差几乎可以忽略,结果完全正确。
- 中间的 ( x_n )(比如 ( x_{10}、x_5 ) 等)也和直接用泰勒级数计算的结果高度吻合,精度达标。
反向递推与正向递推的表现差异
正向递推(从 ( x_0 ) 算到 ( x_{20} ))会出现严重的误差放大:每一步都要乘以5再做减法,机器浮点数的舍入误差会被指数级放大,到 ( x_{20} ) 时结果会完全失真。
而反向递推(从 ( x_{20} ) 算到 ( x_0 ))则是误差衰减的:每一步计算是除以5,舍入误差会被不断缩小,哪怕初始的 ( x_{20} ) 有微小误差,经过反向递推后,前面的 ( x_n ) 误差会越来越小,最终 ( x_0 ) 的精度极高。
核心原因
这是由递推关系的条件数决定的:
- 正向递推的递推因子是-5,绝对值大于1,属于不稳定递推,任何微小误差都会被指数级放大。
- 反向递推的递推因子是1/5,绝对值小于1,属于稳定递推,误差会被指数级衰减,计算结果会越来越准确。
内容的提问来源于stack exchange,提问作者Nash

