WUT_Computer_Science/ENUME/projectA/indicatedMethod.m

92 lines
3.1 KiB
Matlab

function x = indicatedMethod(Matrix, Vector)
[~,Columns] = size(Matrix);
checkIfMatrixIsSquareMatrix(Matrix);
[Matrix, Vector] = gaussianEliminationWithPartialPivoting(Columns, Matrix, Vector);
[Matrix, Vector, x] = backSubstitutionPhase(Columns, Matrix, Vector);
x = iterativeResidualCorrection(Matrix, x, Vector);
end % end function
function checkIfMatrixIsSquareMatrix(Matrix)
[Rows,Columns] = size(Matrix);
if Rows ~= Columns
error ('Matrix is not square matrix!');
end % end if
end % end function
function [Matrix, Vector] = gaussianEliminationWithPartialPivoting(Columns, Matrix, Vector)
for i1 = 1 : Columns - 1
m = max(Matrix(i1:Columns,i1));
partialPivoting(Matrix, Vector, i1, m);
[Matrix, Vector] = gaussianElimination(i1, Columns, Matrix, Vector);
end % end for
end % end function
function [Matrix, Vector] = partialPivoting(Matrix, Vector, i1, m)
[~,Columns] = size(Matrix);
for i3 = i1 : Columns
partialPivotingSwapOneRow(Matrix, Vector, i1, i3, m);
end % end for
end % end function
function [Matrix, Vector] = partialPivotingSwapOneRow(Matrix, Vector, i1, i3, m)
if Matrix(i3,i1) == m
swapRowMatrix(Matrix, i1, i3);
swapValueVector(Vector, i1, i3);
end % end if
end % end function
function Matrix = swapRowMatrix(Matrix, i1, i3)
tempRow = Matrix(i1 , :);
Matrix(i1 , :) = Matrix(i3, :);
Matrix(i3, :) = tempRow;
end
function Vector = swapValueVector(Vector, i1, i3)
tempVal = Vector(i1);
Vector(i1) = Vector(i3);
Vector(i3) = tempVal;
end % end function
function [Matrix, Vector] = gaussianElimination(i1, Columns, Matrix, Vector)
for i2 = i1 + 1 : Columns
l = Matrix(i2,i1) / Matrix(i1,i1);
[Matrix, Vector] = substractRows(Matrix, Vector, i2, l, i1, Columns);
end % end for
end % end function
function [Matrix, Vector] = substractRows(Matrix, Vector, i2, l, i1, Columns)
Vector(i2,1) = Vector(i2,1) - l * Vector(i1, 1);
for t = 1 : Columns
Matrix(i2,t) = Matrix(i2,t) - l * Matrix(i1, t);
end % end for
end % end function
function [Matrix, Vector, x] = backSubstitutionPhase(Columns, Matrix, Vector)
for i3 = Columns : -1 : 1
E = 0;
for iter = i3+1 : Columns
E = E + Matrix(i3,iter) * x(iter,1);
end % end for
x(i3, 1) = (Vector(i3,1) - E) / Matrix(i3,i3);
end % end for
end % end function
function x = iterativeResidualCorrection(Matrix, x, Vector)
r = Matrix*x - Vector;
euclideanColumnsormOfR = norm(r);
new_euclideanColumnsormOfR = euclideanColumnsormOfR;
x = improveSolution(x, new_euclideanColumnsormOfR, euclideanColumnsormOfR, Matrix, Vector);
end % end function
function x = improveSolution(x, new_euclideanColumnsormOfR, euclideanColumnsormOfR, Matrix, Vector)
while new_euclideanColumnsormOfR <= euclideanColumnsormOfR
euclideanColumnsormOfR = new_euclideanColumnsormOfR;
r = Matrix*x - Vector;
x = x - r;
new_euclideanColumnsormOfR = norm(r);
end % end while
end % end function