mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 18:03:14 +02:00
92 lines
3.1 KiB
Matlab
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 |