高斯-塞德尔和连续松弛迭代方法的 Matlab 代码



我需要在 Matlab 中编写高斯 Seidel 和 Successive over 松弛迭代方法。我已经为每个代码创建了以下代码,但是我的最终解决方案向量没有返回正确答案,我真的很难弄清楚原因。谁能帮我?在这两种情况下,x 是最终的解向量,i 返回迭代次数。

提前致谢

高斯赛德尔法:

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

索尔方法:

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

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


编辑:四月4,2014 - 还检查:https://www.dropbox.com/s/p9wlzi9x9evqj5k/MTH719W2013_Assn4_Part1.pdf?dl=1。 我教过一门关于应用线性代数的课程,并拥有实现高斯-赛德尔和 SOR 的 MATLAB 代码。 查看幻灯片 12-20 以了解理论以及如何实现高斯-赛德尔,查看幻灯片 35-37 以了解 SOR 方法。

让我知道它是怎么回事。

相关内容

  • 没有找到相关文章

最新更新