不动点法函数无输出及索引错误问题排查求助
不动点法代码问题分析与修复
核心问题点
- 变量名大小写不匹配:全局变量定义为
xl=1(小写L),但调用函数时传入的是xL(大写L),Python对大小写敏感,会触发NameError导致程序直接终止,无任何输出。 fxI_values列表未填充:代码仅初始化了该列表,但从未添加元素,后续遍历xI_values时访问fxI_values[j]必然触发IndexError: list index out of range。- 循环终止逻辑错误:初始状态下
x0和xI均等于xL,第一次计算的absError为0,直接触发break跳出循环,迭代未正常执行。 - 缺少
tabulate模块导入:代码使用了tabulate函数但未导入,会触发NameError。
修复步骤
- 统一变量名:将全局变量改为
xL=1,与函数参数、调用时的变量名保持一致。 - 填充
fxI_values:每次迭代时计算当前xI对应的g(Xi)值并添加到列表中。 - 调整循环逻辑:先计算当前值对应的
g(Xi),再更新迭代值,同时用新值与旧值计算误差;添加最大迭代次数限制,避免发散场景下的死循环。 - 导入
tabulate模块:在代码开头添加导入语句。
修正后的代码
from tabulate import tabulate xL = 1 error = 0.01 max_iterations = 100 # 添加最大迭代次数限制 def fixedPoint(xL, error, max_iter): x0 = xL xI_values = [] fxI_values = [] calc_error = [] for _ in range(max_iter): xI_values.append(x0) # 计算当前x0对应的g(Xi) fxI = fixedPoint_func(x0) fxI_values.append(fxI) # 用新值与旧值计算误差 absError = abs(fxI - x0) calc_error.append(absError) # 检查收敛条件 if absError <= error: break # 更新迭代值 x0 = fxI # 准备表格数据 table_data5 = [] for j in range(len(xI_values)): iteration_number = j + 1 table_data5.append([iteration_number, xI_values[j], fxI_values[j], calc_error[j]]) # 打印结果 headers = ["Iteration", "Xi", "g(Xi)", "Error"] print("Fixed Point Method :") print() print(tabulate(table_data5, headers=headers, floatfmt=".4f")) print("-" * 100) print() return xI_values[-1] def fixedPoint_func(x): return 3/x # 调用函数 last_FxN = fixedPoint(xL, error, max_iterations)
说明
- 改用
for循环配合最大迭代次数,避免发散场景下的死循环。 - 调整迭代流程:先记录当前值、计算对应
g(Xi)、计算误差,再判断收敛条件,最后更新迭代值,符合不动点法的逻辑。 - 修复了变量名和列表填充问题,确保程序能正常运行并输出结果。
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

