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的下标,不会出现越界问题。
修复方案
- 迭代前先校验矩阵收敛条件
新增严格对角占优校验逻辑,不满足条件的矩阵直接提示,不进入迭代流程,避免数值溢出。
参考校验函数:
在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 Truejacobi、gseidel函数入口处先调用上述函数校验,返回False直接打印提示后退出即可。 - 清理冗余代码
删除循环内的i = i + 1和无效的if (i+1 != cols)判断。 - 不满足收敛条件的矩阵改用其他解法
可以直接使用numpy内置的线性代数求解函数np.linalg.solve(mat, ind)求精确解,或者改用QR分解、LU分解等直接解法。
内容的提问来源于stack exchange,提问作者Martin Lopez
相关产品推荐
相关产品推荐

