%% Решение СЛАУ
%
%
%% Общий вид систем линейных алгебраических уравнений (СЛАУ)
% СЛАУ, содержащая n неизвестных и m уравнений в общем виде может быть записана следующим образом:
% $$
% \left\{
% \begin{array}{rcl}
% x_1a_{11} + x_2a_{12}+ \cdot \cdot \cdot+ x_n a_{1n}&=&f_1\\
% x_1a_{21} + x_2a_{22}+ \cdot \cdot \cdot + x_n a_{2n} &=&f_2\\
% \cdot  \cdot \cdot \cdot \cdot \\
% x_1a_{m1} + x_2a_{m2}+ \cdot \cdot \cdot + x_n a_{mn} &=&f_m\\
% \end{array}
% \right.
% $$
% Зададим вектор неизвестных величин как x, матрицу коэффициентов$A$ и вектор свободных членов $f$следующим образом:
% $$  x =  \left(\begin{array}{ccc}x_1\\ x_2 \\ \vdots \\ x_n  \end{array}\right), A = \left(\begin{array}{ccc}
% a_{11}& a_{12} &\ldots & a_{1n}\\
% a_{21}& a_{22} &\ldots & a_{2n}\\
% \vdots& \vdots &\ddots & \vdots\\
% a_{m1}& a_{m2} &\ldots & a_{mn}
% \end{array}\right),  f =  \left(\begin{array}{ccc} f_1\\ f_2 \\ \vdots \\ f_m  \end{array}\right).
% $$
%
% Тогда исходную систему можно представить в матричном виде:
%
% Ax=f
%        (1)
% Система линейных уравнений может не иметь ни одного решения и тогда она называется несовместной, например, в системе:
%
% левые части уравнений совпадают, а правые различны, поэтому никакие значения x1 и x2 не могут удовлетворить обоим уравнениям сразу.
% Если же система линейных уравнений обладает решением, то она называется совместной. Совместная система называется определённой, если она обладает одним единственным решением, и неопределённой, если решений больше чем одно. Cистема определена и имеет единственное решение x1 = 5,x2 = 1:
%
% Система неопределена, так как имеет бесконечное множество решений вида x1 = k,x2 = 3k−1, где число k произвольно:
%
% Если ранг матрицы коэффициентов $\mathrm{rg}(A)$ совпадает с количеством неизвестных n, то ненулевое решение системы существует и единственно (Совместна)
%  Если \mathrm{rg}(A)<n, то система называется недоопределённой решений системы бесконечно много (Совместна)
% Если \mathrm{rg}(A)>n, то система называется переопределённой и не имеет точного решения (Несовместна)
% Для определения ранга матрицы используется команда rank.

A1 = [1 ,1 1, 1,1;       % матрица системы
     3 2 1 1 -3;
     0 1 2 2 6;
     5 4 3 3 -1];
 
f1 = [7; -2; 23; 12];    % вектор свободных членов

[A1,f1]                   % расширенная матрица
[rank(A1), rank([A1,f1])]    % Ранг меньше размеров матрицы

%
% Решим систему уравнений по правилу Крамера
%%
%

A=[2 -1 5;3 2 -5; 1 1 -2] 

%% Решение СЛАУ с помощью вычисления обратной матрицы
% Если матрица A диагональна и \mathrm{rg}(A)=n, то уравнение  можно решить, определив обратную матрицу к A:
% x=A^{-1}f
%

A2 = [3 -1  1;
     2 -5 -3;
     1  1 -1];
 
f2 = [4;-17;0];

x2 = A2^(-1)*f2

%
%% Решение СЛАУ с помощью операции "\" (косого деления)
% Вычисление обратной матрицы является не самым быстрым (с точки зрения скорости расчета) методом. К тому же, решение с помощью обратной матрицы невозможно в случае, если матрица не является квадратной. Существует множество альтернативных способов решения систем. Некоторые из этих методов ускоряют решение СЛАУ с квадратной матрицей, некоторые, например, предназначены для нахождения приближённого решения систем с переопределёнными матрицами.
% В MATLAB существует универсальная операция для решения СЛАУ - косое деление "\" или по-другому mldivide. При её вызове автоматически подбирается подходящий способ решения из встроенных в MATLAB способов.
% Если имеется ввиду уравнение (1), то синтаксис будет иметь вид  x = A\f.
% В случае \mathrm{rg}(A)=n, ответом является решение системы уравнений одним из методов (метод Холецкого, метод LUP ,метод QR)

x3 = A2\f2     % решение из предыдущего примера

% В случае \mathrm{rg}(A)<n (недоопределённая система) результатом работы оператора "\" является частное решение СЛАУ, имеющее не более $\mathrm{rg}(A)$ нулевых компонент.
% В случае \mathrm{rg}(A)>n (переопрелелённая система) оператор "\" находит приближённое решение методом наименьших квадратов.
%%
%
%% Функция linsolve
% Для того, чтобы выбрать метод решения СЛАУ, оператор косого деления "\" (или функция mldivide) предварительно проверяет, соответствие матрицы $A$ тому или иному алгоритму. На эту проверку уходит определённое время, которое могло быть сэкономлено, если бы пользователь заранее знал тип матрицы и соответствующий ей способ решения линейной системы. Для таких случаев существует функция linsolve, позволяющая задавать способ решения системы вручную. Однако, если способ не подходит для решения введенной матрицы, программа выдаст ошибку.
% По умолчанию используется LUP-метод для квадратных для квадратных матриц, однако дополнительно можно задать тип матрицы $A$. Ниже представлена классификация матриц:
%
% Примеры использования функции linsolve:

A4 = randi([-10, 10],4); 
f4 = randi([-10, 10], 3,1)
A4 = A4(1:3,:)
linsolve(A4,f4)     % недоопределённая система решена с помощью qr-разложения, найдено частное решение


f3 = [-2; 3; 1; 0];
A3 = pascal(4)      % симметричная положительно-определённая квадратная матрица
opts3.POSDEF = true;
opts3.SYM    = true;
linsolve(A3,f3,opts3) % решение системы с симметричной положительноопределённой матрицей методом Холецкого

%
%%