霍纳法则实现与舍入误差绘图复现问题求助
问题排查与解决建议
核心错误:复数生成逻辑错误
你当前生成xs的代码[1.606+(2**-52)*i for i in range(801)]里的i是循环计数变量(整数),并不是复数的虚部单位!这导致你生成的是实数序列,而非教材里要求的「实部固定,虚部为2^-52倍数」的复数序列。正确的复数生成应该用Python的虚数单位1j,示例代码:
# 以x=1.606+2^-52*k(k为虚部系数)为例 xs = [1.606 + (2**-52)*1j * k for k in range(801)]
其他可能的问题点
- 未计算舍入误差:教材的图是舍入误差图,不是直接绘制r(x)的数值结果。你需要先计算r(x)的精确值(比如用高精度运算库
mpmath),再计算霍纳法则得到的数值近似值,最后绘制两者的误差(绝对值误差或相对误差),而非直接画r(x)的数值。 - 霍纳法则实现问题:检查代码是否正确处理复数运算,确认分子分母的多项式系数顺序是否符合要求——霍纳法则需要从最高次项到最低次项依次计算,比如多项式
a_n x^n + ... + a_1 x + a_0,计算式应为((...((a_n)*x + a_{n-1})*x + a_{n-2})*x + ...) + a_0。 - 数值精度范围问题:
2^-52是双精度浮点数的机器epsilon量级,普通浮点数计算可能无法捕捉细微误差,建议用mpmath设置更高精度计算精确值,再对比双精度下的霍纳法则结果。
验证步骤
- 修正复数生成代码,确认每个
x都是实部固定、虚部线性变化的复数; - 用高精度方法计算r(x)的精确值;
- 用你的霍纳法则代码计算数值近似值;
- 计算两者的误差(如
abs(数值结果 - 精确结果))并绘图,此时应该能看到类似教材的舍入误差波动。
内容的提问来源于stack exchange,提问作者Parker
相关产品推荐
相关产品推荐

