我需要在Matlab中实现Jacobi和Guass Seidel的方法。
我找到了此链接,它的代码为每个示例生成正确的结果(在我试过的一个示例上)。
见第3条。
我的问题是,实现与描述的这里和这里不同
我很高兴使用其他人的代码(实际上,我更喜欢尝试和测试的代码),但我想确切地了解它是如何工作的。
有人能告诉我关于文章中使用的实现的描述吗?
或者,这些算法的其他实现在Matlab中是否可以被认为是基准呢?
发布于 2013-12-29 20:13:04
我想向您展示Seidel上的代码是如何工作的,希望您可以自己对Jacobi进行同样的分析。
Q=tril(A); % Q == L
r=b-A*x;
dx=Q\r; 这个部分在数学上意味着x(:,k+1) = inv(L) * (b - A*x(:,k)) = inv(L) * (b - L*x(:,k) - U*x(:,k));
在您提供的维基百科页面中,它需要inv(L) * (b - U*x(:,k));。
但是它们是自inv(L) * (b - L*x(:,k) - U*x(:,k)) = inv(L) * (b - U*x(:,k)) - x(:,k);以来的等价物,所以如果您遵循维基百科中的公式,迭代更新应该是:x(:,k+1)=(dx + x(:,k));,而在您提供的代码中是相同的:x(:,k+1) = x(:,k) + lambda * dx;。
请注意,lambda是一个松弛系数,主要作用于收敛速度的调节。您可以在代码中设置为1,这使得它与wikipeida中的公式完全相同。
https://stackoverflow.com/questions/20829040
复制相似问题