Метод Якоби для решения линейных систем в MATLAB

#matlab #iteration #linear-algebra

#matlab #итерация #линейная алгебра

Вопрос:

Как бы вы закодировали это в MATLAB? введите описание изображения здесь

Это то, что я пробовал, но это работает не совсем правильно.

 function x = my_jacobi(A,b, tot_it)
%Inputs:
%A: Matrix
%b: Vector
%tot_it: Number of iterations
%Output:
%:x The solution after tot_it iterations
    n = length(A);
    x = zeros(n,1);
    for k = 1:tot_it
      for j = 1:n
        for i = 1:n
            if (j ~= i) 
                x(i) = -((A(i,j)/A(i,i)) * x(j)   (b(i)/A(i,i)));

            else
                continue;
            end
          end
      end
  end
end
  

Ответ №1:

j является итератором суммы по каждой i , поэтому вам нужно изменить их порядок. Также формула имеет сумму, и в вашем коде вы ничего не добавляете, так что это еще одна вещь, которую следует учитывать. Последнее, что я вижу, что вы опускаете, это то, что вы должны сохранить предыдущее состояние x , потому что в правой части формулы это необходимо. Вы должны попробовать что-то вроде этого:

 function x = my_jacobi(A,b, tot_it)
  %Inputs:
  %A: Matrix
  %b: Vector
  %tot_it: Number of iterations
  %Output:
  %:x The solution after tot_it iterations
  n = length(A);
  x = zeros(n,1);
  s = 0; %Auxiliar var to store the sum.
  xold = x
  for k = 1:tot_it
    for i = 1:n
      for j = 1:n
        if (j ~= i) 
          s = s   (A(i,j)/A(i,i)) * xold(j);
        else
          continue;
        end
      end
      x(i) = -s   b(i)/A(i,i);
      s = 0;
    end
    xold = x;
  end
end