WUT_Computer_Science/ENUME/projectA/jacobiMethod.asv

43 lines
1.6 KiB
Plaintext
Raw Normal View History

2021-11-11 19:19:57 +01:00
function x = jacobiMethod(Matrix, Vector)
[Rows,~] = size(Matrix);
D = diag(diag(Matrix));
inverseD = inv(D);
U = triu(Matrix, 1); % Generates upper triangular part of matrix
% where the second variable denotes on which diagonal of matrix should we
% start
L = tril(Matrix, -1); % Generates lower triangular part of matrix
% where the second variable denotes on which diagonal of matrix should we
% start
initial_x = ones(Rows, 1);
initial_x = - inverseD * ( ( L + U ) * initial_x) + inverseD * initial_x; % As per formula
% We will be using D \ initial_x and D \ () since it is faster and more
% accurate according to matlab
whichIterationAreWeOn = 0;
currentError = inf; % We set it to inf so that it the algorithm will always start
% (See condition below)
demandedTolerance = 1e-10;
while currentError >= demandedTolerance
x = - inverseD * ( ( L + U ) * initial_x) + inverseD * initial_x; % As per formula
currentError = norm(x - initial_x);
disp(currentError);
if currentError <= demandedTolerance
currentError = norm(Matrix*x-Vector);
disp(currentError);
if currentError <= demandedTolerance
break;
else
demandedTolerance = demandedTolerance * 2;
end
end
initial_x = x;
whichIterationAreWeOn = whichIterationAreWeOn + 1;
end
disp("Final demandedTolerance");
disp(demandedTolerance);
disp("Final Iteration: ");
disp(whichIterationAreWeOn);
disp("A\b matlab:");
disp(Matrix / Vector);
end