Jacobi迭代的实现以找到解决方案A x = bAx=b

计算科学 matlab 矩阵 迭代法 雅可比
2021-12-21 23:57:35

我基于这篇论文使用Matlab实现了Jacobi迭代,代码如下:

function x = jacobi(A, b)
% Executes iterations of Jacobi's method to solve Ax = b.

assert(size(A, 1) == size(A, 2))
assert(size(A, 1) == size(b, 1))

% matrix with all zeros except the diagonal elements,
% which are those of A.
D = diag(diag(A));

% matrix A but with its diagonal elements equal zero
R = D - A;

tol = 1.e-8; 
max_num_of_iter = 1000;

% initialize relative error to large value
relative_error = inf; 
num_of_iter = 1;

% initial guess
x_prev = zeros(size(b, 1), 1);

% iterate until convergence or maximum number of iterations is reached
while relative_error > tol && num_of_iter < max_num_of_iter
    x = D \ (b + R * x_prev);

    relative_error = norm(x - x_prev, inf) / norm(x, inf);

    x_prev = x;

    num_of_iter = num_of_iter + 1;
end

现在我不明白为什么x使用 找到迭代D \ (b + R * x_prev),更具体地说,为什么我们有一个+符号而不是一个-登录D \ (b + R * x_prev)

根据[维基百科]( https://en.wikipedia.org/wiki/Jacobi_method,雅可比方法如下:

x(k+1)=D1(bRx(k))

其中是一个矩阵,除了对角线元素是的对角线元素外,它的元素都是零。中对应元素相同的矩阵Dn×nAR=DAA

显然,如果我们想解决

Ax=b

然后

A=L+D+U=D+L+U=D+RAD=R=L+U

(D+L+U)x=bDx+Lx+Ux=bDx=bLxUxDx=b(L+U)x

既然我们已经定义了,那么L+U=R

Dx=b(L+U)xDx=bRxx=D1×(bRx)

所以迭代方法的原始公式提供维基百科似乎与我的计算一致。问题是,如果我使用 a而不是我找不到正确的解决方案。我怎么知道?我正在使用(即高斯消除)来检查解决方案。x(k+1)=D1(bRx(k))-+x = A \ b

1个回答

在您的情况下(代码中的第 12 行) 然后 重新排列为 导致迭代,这是第一行你的while循环。

A=DR.
Ax=DxRx=b,
x=D1(b+Rx),

这仅与维基百科版本的定义不同,即维基百科的 到您的

R=AD
R=DA.