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

逐次超松弛法(SOR)Python实现触发int转C long溢出报错问题求助

报错原因及问题分析
  • 直接触发报错的原因:迭代过程中x的数值持续膨胀,最终超过了C long类型的存储上限,触发类型转换溢出错误。
  • 根本原因1:迭代逻辑存在浅拷贝错误
    你在循环中写的xold = x属于numpy数组的引用赋值,xold和x会指向同一块内存空间,每轮对x的更新都会同步修改xold的值,完全没有保存上一轮的迭代结果,导致迭代逻辑完全走偏,数值快速增长。
  • 根本原因2:系数矩阵不满足SOR迭代收敛的前提条件
    SOR(以及其特殊形式w=1时的高斯赛德尔迭代)收敛的前提是系数矩阵为严格对角占优矩阵或对称正定矩阵。你提供的矩阵M对角线元素均为1,每行非对角线元素之和最小为2,远大于对角线值,不满足收敛要求,即使修复拷贝问题迭代也会发散,数值持续膨胀直到触发溢出。
  • 补充:你测试用例的原矩阵仅适合用直接解法求解,迭代法天然不适用这类不满足收敛条件的矩阵,np.linalg.solve等内置直接解法可以得到你预期的解析解。
修复建议
  1. 修正xold的拷贝逻辑,将while循环内的xold = x改为xold = x.copy(),确保每轮迭代前保存上一轮的完整x值。
  2. 若要验证SOR代码的正确性,建议更换为严格对角占优的测试矩阵,例如将M的对角线元素调整为远大于同行其他元素之和的值,示例调整如下:
# 调整为对角占优矩阵
M = [[10,1,1,0,0,0],
     [1,10,1,1,0,0],
     [1,1,10,1,1,0],
     [0,1,1,10,1,1],
     [0,0,1,1,10,1],
     [0,0,0,1,1,10]]
  1. 若必须使用原矩阵求解,直接调用np.linalg.solve(M,b)即可得到预期结果,不要使用迭代法。

内容的提问来源于stack exchange,提问作者qhumphrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:24:02