You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不动点法函数无输出及索引错误问题排查求助

不动点法代码问题分析与修复

核心问题点

  1. 变量名大小写不匹配:全局变量定义为xl=1(小写L),但调用函数时传入的是xL(大写L),Python对大小写敏感,会触发NameError导致程序直接终止,无任何输出。
  2. fxI_values列表未填充:代码仅初始化了该列表,但从未添加元素,后续遍历xI_values时访问fxI_values[j]必然触发IndexError: list index out of range。
  3. 循环终止逻辑错误:初始状态下x0和xI均等于xL,第一次计算的absError为0,直接触发break跳出循环,迭代未正常执行。
  4. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:05:06