Код Матлаба для итерационных методов Гаусса-Зейделя и Последовательного по релаксации

Мне нужно кодировать итерационные методы Гаусса Зейделя и Последовательного по релаксации в Matlab. Я создал код ниже для каждого из них, однако мой вектор окончательного решения не возвращает правильных ответов, и я действительно изо всех сил пытаюсь выяснить, почему. Может ли кто-нибудь помочь мне? В обоих случаях 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

Метод 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

1 ответ

Гаусс-Зайдель: Ваша линия, которая описывает 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. Я преподавал курс прикладной линейной алгебры и у меня есть код MATLAB, который реализует Gauss-Seidel и SOR. Проверьте слайды 12-20 для теории и как реализовать метод Гаусса-Зейделя и слайды 35-37 для метода SOR.

Дайте мне знать, как это происходит.

Другие вопросы по тегам