
本文详解不动点迭代法的 Python 实现要点,重点解决因 fxI_values 未及时填充导致的“IndexError”、因函数不收敛引发的无限循环,以及表格输出失败等问题,并提供健壮、可运行的完整示例。
本文详解不动点迭代法的 python 实现要点,重点解决因 `fxi_values` 未及时填充导致的“indexerror”、因函数不收敛引发的无限循环,以及表格输出失败等问题,并提供健壮、可运行的完整示例。
不动点迭代法是一种求解方程 $x = g(x)$ 近似根的经典数值方法。其核心是构造一个收敛的迭代函数 $g(x)$,并从初值 $x0$ 出发反复计算 $x{k+1} = g(x_k)$,直至相邻两项之差小于给定容差 $\varepsilon$。然而,实际编码中极易因逻辑顺序错位或函数选择不当导致程序崩溃或无输出——这正是原始代码的问题根源。
? 关键问题诊断与修复
原始代码存在两个致命缺陷:
fxI_values 始终为空 → 触发 IndexError
在循环中,fxI_values.append(...) 完全缺失,但后续表格构建却直接访问 fxI_values[j]。由于列表长度为 0,任何索引访问均失败。迭代函数 3/x 不满足局部收敛条件 → 陷入无限循环
从 $x_0 = 1$ 开始:$x_1 = 3/1 = 3$,$x_2 = 3/3 = 1$,$x_3 = 3$……形成周期为 2 的振荡,绝对误差恒为 2,永远无法满足 absError <= error,while True 永不退出。
✅ 正确实现:结构清晰 + 安全终止 + 收敛保障
以下为修复后的完整可运行代码(含必要依赖说明):
from tabulate import tabulate
from math import cos
def fixedPoint(xL, error):
xI = xL
xI_values = []
fxI_values = []
calc_error = []
# 设置最大迭代次数,防止无限循环
max_iter = 20
for iteration in range(max_iter):
xI_values.append(xI)
# 计算下一项:x_{k+1} = g(x_k)
x_next = fixedPoint_func(xI)
fxI_values.append(x_next) # ✅ 关键:立即保存 g(x_k)
# 计算当前误差 |x_{k+1} - x_k|
absError = abs(x_next - xI)
calc_error.append(absError)
# 检查收敛性
if absError <= error:
break
xI = x_next # ✅ 更新当前值,为下次迭代准备
# 构建并打印结果表格
table_data = []
for j in range(len(xI_values)):
# 注意:fxI_values[j] 对应 g(xI_values[j]),即第 j 步的输出
table_data.append([
j + 1,
xI_values[j],
fxI_values[j],
calc_error[j] if j < len(calc_error) else 0
])
headers = ["Iteration", "Xi", "g(Xi)", "Error"]
print("Fixed Point Method:")
print()
print(tabulate(table_data, headers=headers, floatfmt=".4f"))
print("-" * 100)
print()
return xI_values[-1] if xI_values else None
# ✅ 收敛性有保证的迭代函数:g(x) = cos(x),在 [0,1] 区间满足 |g'(x)| < 1
def fixedPoint_func(x):
return cos(x)
# 执行计算
xL = 1.0
error = 0.01
result = fixedPoint(xL, error)
print(f"Converged to: {result:.6f}")⚠️ 使用注意事项
- tabulate 需提前安装:运行 pip install tabulate;
- 迭代函数必须满足收敛条件:理论要求 $|g'(x)| < 1$ 在根附近成立。cos(x) 在 $x \approx 0.739$ 处导数约为 $-\sin(0.739) \approx -0.674$,绝对值小于 1,故收敛;而 3/x 的导数为 $-3/x^2$,在 $x=1$ 处为 $-3$,不满足条件;
- 变量更新顺序至关重要:先保存当前 xI,再计算 x_next,再保存 g(xI),最后才将 xI = x_next —— 错序会导致误差计算错误或数据错位;
- 显式设置 max_iter 是工程实践必需:即使理论收敛,浮点精度也可能导致微小误差无法达标,硬性截断是鲁棒性的底线保障。
通过以上修正,代码不仅能稳定输出格式化迭代过程表,还能准确返回收敛解,真正成为可用于教学与工程验证的不动点法实现范本。

















