How can I prevent update of x(i) at each step of the loop? Essentially, this is a code for Gauss Seidel. How do I modify it to make it Jacobi iterative method?

조회 수: 7 (최근 30일)
A = [7 3 2 1; 2 9 4 5; 1 3 13 4; 4 5 8 14 ]; % A is diagonally dominant
b = [1;2;3;4];
x = zeros(4,1);
%% Method I
% This code automatically updates the most recent value of x(i)
% So this becomes Gauss Seidel on its own
% Understanding has to be developed for it to become Jacobi method
for iter = 1:25
x(1) = (b(1)-A(1,2)*x(2)-A(1,3)*x(3)-A(1,4)*x(4))/A(1,1);
x(2) = (b(2)-A(2,1)*x(1)-A(2,3)*x(3)-A(2,4)*x(4))/A(2,2); % How do you make x(1) not take the updated value from previous step (ln 12)?
x(3) = (b(3)-A(3,1)*x(1)-A(3,2)*x(2)-A(3,4)*x(4))/A(3,3); % Similarly, how do you make x(1) and x(2) not update in this step?
x(4) = (b(4)-A(4,1)*x(1)-A(4,2)*x(2)-A(4,3)*x(3))/A(4,4); % And the same is desired for x(1), x(2), x(3) in this step
disp(['At iteration = ',num2str(iter), ' x = ', num2str(x')]);
end

채택된 답변

Pavan Guntha
Pavan Guntha 2021년 3월 31일
Hi Avinash,
You could try assigning the values stored in x into another variable y at the start of the loop and use the y values in your equations which follow. The following code illustrates this idea:
for iter = 1:25
y = x;
x(1) = (b(1)-A(1,2)*x(2)-A(1,3)*x(3)-A(1,4)*x(4))/A(1,1);
x(2) = (b(2)-A(2,1)*y(1)-A(2,3)*x(3)-A(2,4)*x(4))/A(2,2);
x(3) = (b(3)-A(3,1)*y(1)-A(3,2)*y(2)-A(3,4)*x(4))/A(3,3);
x(4) = (b(4)-A(4,1)*y(1)-A(4,2)*y(2)-A(4,3)*y(3))/A(4,4);
disp(['At iteration = ',num2str(iter), ' x = ', num2str(x')]);
end
Hope this helps!

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by