python - 高斯赛德尔在python中的实现
问题描述
import numpy as np
from scipy.linalg import solve_triangular as triSolve
#O(n) per iteration, so overall O(nN), good for large SPD/SDD matrices
def GS_iter(A, b, N):
m = len(A)
L = np.tril(A)
P = L-A
print(P)
x = np.zeros(m)
print(x)
for k in range(N):
x = triSolve(L,b+P@x, True)
return x
#examples
A = np.array([[10,2,3,1],[1,10,0,1],[0.2,1,10,2],[0.1,3,3,10]])
b = np.array([1,2,1,0])
x = GS_iter(A,b,50000)
ans = A@x-b
print(ans)
print(np.linalg.norm(ans))
以上是我在 Python 中的 Gauss-Seidel 方法。由于某种原因,即使矩阵 A 是严格的对角线占优,即使在 50000 次迭代后它也不会收敛。下面是 MATLAB 中的相同实现:
function x = gSeidel(A,B,N)
[n,~] = size(A);
L = tril(A);
P = L-A; %P = -U
x = zeros(n,1); %x_0
for k = 1:N
x = L\(B+P*x);
end
end
我犯了什么错误?我认为它在 TriSolve 方法中,因为如果我用常规的 LU 求解器(例如 (np.linalg.solve) 替换它)它可以工作。为什么三角求解在这里没有按预期运行?
解决方案
较低的参数是第四个将您的行替换为x = triSolve(L,b+P@x, lower=True)
Signature:
triSolve(
a,
b,
trans=0,
lower=False,
unit_diagonal=False,
overwrite_b=False,
debug=None,
check_finite=True,
)
推荐阅读
- python - Python正则表达式返回括号内字符串的位置
- java - 在这种情况下,当我尝试运行单个测试用例脚本时,为什么会打开多个浏览器实例?
- spring - 在 Spring Integration 中获取带有原始标题和附件的电子邮件
- c# - Excel:下载文件 LoadTestExcelAddIn.vsto 未成功
- c++ - 如何在 Code::blocks c++ 中使用 shell 命令?
- lldb - 使用 lldb 在主二进制文件中查找名为 '_OBJC_IVAR__$_DIRect._width' 的非外部符号?
- reactjs - 使用 React Router 处理多个路由
- openstack - 泊坞窗上的 OpenStack
- javascript - 比 `setTimeout` 和 `.length` 更好的检查元素是否存在的方法
- android - 在 Android 上访问 IP 子域