Python实现雅可比迭代出现IndexError报错如何修复并将迭代结果填入表格
问题修复方案
报错原因
IndexError: Replacement index 4 out of range for positional args tuple
该报错触发原因是你定义的tabel模板包含{0}到{6}共7个占位符,但else分支的print语句中仅给tabel.format()传入了4个参数,剩下的3个误差值被写在了format方法外部,无法匹配模板的占位符要求,导致索引越界。
额外问题排查
你代码中x1函数存在笔误:0.2*3应为0.2*x3,否则x3参数未被使用,迭代计算结果会完全错误。同时代码中使用eval处理格式化后的字符串属于不必要的操作,存在安全隐患且性能低下。
修复后的完整代码
def x1(x2,x3): # 修复笔误:0.2*3改为0.2*x3 return (7.85 + (0.1*x2) + (0.2*x3))/3 def x2 (x1,x3): return (-19.3 - (0.1 *x1) + (0.3 *x3))/7 def x3(x1,x2): return ((-0.3 * x1) + (0.2 *x2) +71.4)/10 def error(n,o): # 新增除零保护,避免i=0时出现运算错误 if n == 0: return "-" return ((n-o)/n) *100 bx1, bx2, bx3 = 0, 0, 0 tabel = "{0:1} | {1:7} | {2:7} | {3:7} | {4:7} | {5:7} | {6:7}" print(tabel.format("i", "x1", "x2", "x3", "e1", "e2", "e3")) for i in range (0,5) : if i ==0 : print(tabel.format(i, bx1, bx2, bx3, "-", "-", "-")) cx1 = bx1 cx2 = bx2 cx3 = bx3 else: # 移除eval,直接用round保留三位小数 cx1 = round(x1(bx2, bx3), 3) cx2 = round(x2(bx1, bx3), 3) cx3 = round(x3(bx1, bx2), 3) # 提前计算误差,统一传入format匹配占位符 e1 = round(error(cx1, bx1), 2) e2 = round(error(cx2, bx2), 2) e3 = round(error(cx3, bx3), 2) print(tabel.format(i, cx1, cx2, cx3, e1, e2, e3)) # 更新上一轮迭代值,保证下一轮误差计算正确 bx1, bx2, bx3 = cx1, cx2, cx3
改动说明
- 修复了x1函数的参数使用笔误,保证雅可比迭代逻辑正确性
- 给error函数新增除零保护,避免初始值为0时的运算报错
- 移除不必要的eval调用,改用round方法保留小数位,代码更安全高效
- 将误差计算结果直接传入tabel.format的参数列表,匹配模板的7个占位符要求,彻底解决IndexError报错
- 新增迭代后上一轮值的更新逻辑,保证每轮误差计算的准确性
内容的提问来源于stack exchange,提问作者rainzx27
相关产品推荐
相关产品推荐

