我需要在Matlab中对高斯Seidel和Successive进行松弛迭代方法的编码。我已经为每个代码创建了以下代码,但是我的最终解决方案向量并没有返回正确的答案,我真的很难找出原因。有人可以帮帮我吗? 在这两种情况下,x都是最终的解决方案向量,我返回迭代次数。
提前致谢
高斯赛德尔方法:
function [x,i] = gaussSeidel(A,b,x0,tol)
x2 = x0;
count = 0;
D = diag(diag(A));
U = triu(A-D);
disp(U);
L = tril(A-D);
disp(L);
C = diag(diag(A));
disp(C);
Inv = inv(C+D);
error = inf;
while error>tol
x1 = x2;
x2 = Inv*(b-(U*x1));
error = max(abs(x2-x1)/abs(x1));
count = count + 1;
end
x = x2;
i = count;
end
SOR方法:
function [x,i] = sor(A,b,x0,tol,omega)
[m,n] = size(A);
D = diag(diag(A));
U = triu(A-D);
L = tril(A-D);
count = 1;
xtable = x0;
w = omega;
if size(b) ~= size(x0)
error('The given approximation vector does not match the x vector size');
elseif m~=n
error('The given coefficient matrix is not a square');
else
xnew = (inv(D+w*L))*(((1-w)*D-w*U)*x0 +w*b);
RelError = (abs(xnew-x0))/(abs(xnew));
RelErrorCol = max(max(RelError));
while RelErrorCol>tol
xnew = (inv(D+w*L))*(((1-w)*D-w*U)*x0 +w*b);
RelError = (abs(xnew-x0))/(abs(xnew));
RelErrorCol = max(max(RelError));
x0 = xnew;
count = count+1;
xtable = [xtable, xnew];
end
disp(xtable);
x = xnew;
i = count;
end
答案 0 :(得分:3)
Gauss-Seidel:您描述C
的行是错误的。实际上它不应该存在。同样适用于Inv
行,它应该是inv(D+L)
,而不是inv(C+D)
。
至于SOR方法,事后看来似乎是正确的。要仔细检查,请与此方法进行比较:
http://www.netlib.org/templates/matlab/sor.m。此方法依赖于http://www.netlib.org/templates/matlab/split.m
编辑:2014年4月4日 - 同时检查:https://www.dropbox.com/s/p9wlzi9x9evqj5k/MTH719W2013_Assn4_Part1.pdf?dl=1。我教过应用线性代数课程,并拥有实现Gauss-Seidel和SOR的MATLAB代码。检查幻灯片12-20的理论和如何实现Gauss-Seidel和幻灯片35-37用于SOR方法。
让我知道它是怎么回事。