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

Python实现Jacobi、高斯赛德尔迭代求解线性方程组出现overflow溢出警告

问题产生原因
  • 核心原因:迭代法收敛条件不满足
    雅可比迭代、高斯-赛德尔迭代的收敛前提是系数矩阵严格对角占优或为对称正定矩阵。你使用的第二个测试矩阵matrix2 = [[2.0, 3.0], [-1.0, 1.0]]不满足严格对角占优条件:

    严格对角占优要求矩阵每行主对角线元素的绝对值 > 该行其余元素绝对值之和
    该矩阵第一行主对角线绝对值是2,其余元素绝对值是3,2<3;第二行主对角线绝对值是1,其余元素绝对值是1,二者相等,完全不满足收敛条件。迭代过程中数值会不断发散,越来越大最终超出双精度浮点数的存储范围,触发overflow警告,后续溢出后的非数值(inf/nan)做减法就会触发invalid value警告。

  • 代码冗余问题(非核心报错原因,但属于不规范写法)
    循环中多余的i = i + 1:外层已经是for i in range(filas)自动迭代,手动修改i不会影响循环变量,属于无效代码;
    内层循环的if (i+1 != cols)判断完全多余,range(i+1, cols)本身就不会取到等于cols的下标,不会出现越界问题。
修复方案
  1. 迭代前先校验矩阵收敛条件
    新增严格对角占优校验逻辑,不满足条件的矩阵直接提示,不进入迭代流程,避免数值溢出。
    参考校验函数:
    def is_strictly_diagonally_dominant(mat):
        for i in range(mat.shape[0]):
            diag_abs = abs(mat[i,i])
            row_sum_abs = sum(abs(mat[i,j]) for j in range(mat.shape[1]) if j != i)
            if diag_abs <= row_sum_abs:
                return False
        return True
    
    在jacobi、gseidel函数入口处先调用上述函数校验,返回False直接打印提示后退出即可。
  2. 清理冗余代码
    删除循环内的i = i + 1和无效的if (i+1 != cols)判断。
  3. 不满足收敛条件的矩阵改用其他解法
    可以直接使用numpy内置的线性代数求解函数np.linalg.solve(mat, ind)求精确解,或者改用QR分解、LU分解等直接解法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:08