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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:57:11