Python递归数值方法问题:SOR迭代列表赋值错误致结果异常
问题分析与修复方案
核心问题点
- 重复调用迭代函数:初始阶段连续两次调用
ite_SOR,导致Xp被重复更新,直接打乱SOR迭代流程——第一次调用已用初始X更新Xp,第二次调用又用未更新的X再次修改Xp,完全偏离迭代逻辑。 - 误差计算逻辑错误:
max(abs(abs(np.array(X)-abs(np.array(Xp)))))写法冗余且错误,多嵌套了一层abs,正确逻辑是计算两数组差值的绝对值的最大值,应为np.max(np.abs(np.array(X) - np.array(Xp)))。 - 循环未更新误差值:内层
while循环未重新计算error,若初始error>1e-6会进入无限循环,直到数值溢出出现nan;若初始error<=1e-6则直接跳过迭代,完全未执行计算。 - 列表赋值逻辑未生效:虽然
X = Xp[:]对一维列表是有效浅拷贝,但因迭代流程错误,赋值未起到传递迭代值的作用。
修正后的代码
修正后的main()部分
import numpy as np # 假设X和Xp已初始化为相同的初始猜测值,例如: # X = [0.0, 0.0, 0.0] # Xp = [0.0, 0.0, 0.0] om = 1 while om < 2: k = 0 # 第一次迭代:仅调用一次ite_SOR获取更新后的Xp _, Xp = ite_SOR(X, Xp, om, i) # 计算初始误差 error = np.max(np.abs(np.array(X) - np.array(Xp))) while error > 1e-6: # 将X更新为上一轮的Xp X = Xp[:] # 调用迭代函数更新Xp _, Xp = ite_SOR(X, Xp, om, i) # 重新计算误差 error = np.max(np.abs(np.array(X) - np.array(Xp))) k += 1 print(f"ω={om:.1f},迭代次数k={k},最终误差={error:.8f}") om += 0.2
ite_SOR函数注意点
确保函数内b + d + e + c部分符合SOR迭代公式中对应x_i的项计算逻辑,另外:
- 函数直接原地修改传入的
Xp列表元素,返回的Xp与传入对象是同一个,若无需保留原Xp可省略返回,但当前逻辑下返回没问题。 - 若改用numpy数组代替列表,数值计算更高效,赋值拷贝也更清晰(如
X = Xp.copy())。
额外建议
- 统一使用numpy数组替代列表,避免列表与数组混用的潜在问题,同时提升计算效率。
- 迭代过程中打印
X、Xp和error的数值,方便跟踪调试变化。 - 给内层循环添加迭代次数上限(如
k < 1000),避免因收敛问题导致无限循环。
内容的提问来源于stack exchange,提问作者Nicholas Boscolo
相关产品推荐
相关产品推荐

