逐次超松弛法(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等内置直接解法可以得到你预期的解析解。
修复建议
- 修正xold的拷贝逻辑,将while循环内的
xold = x改为xold = x.copy(),确保每轮迭代前保存上一轮的完整x值。 - 若要验证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]]
- 若必须使用原矩阵求解,直接调用
np.linalg.solve(M,b)即可得到预期结果,不要使用迭代法。
内容的提问来源于stack exchange,提问作者qhumphrey
相关产品推荐
相关产品推荐

