X(i) = NaN; end X = X'; N = 0; return end
% Если высота матрицы а и столбца b не совпадают % то выдача диагностирующего сообщения if m ~= length(B) error('Высота матрицы A и столбца B не совпадают'); end
% Приведение расширенной матрицы A|B к диагональному виду A = rref([A, B]); B = A(:, n + 1); A = A(:, 1 : n); %m - число базисных строк m = rank(A); %Расчет коэффициентов С(1)..С(n-m), при которых вектор решения Х %будет минимальным по евклидовой норме. Приравнивая частные производные %нулю, составляем матрицу коэффициентов D и матрицу свободных коэффициентов E. %Соответствующие формулы смотрите в описании к программе. % i - номер строки, j - номер элемента в строке (номер столбца) for i=1:(n-m) for j=1:(n-m)
D(i,j) = 0;
for k=1:m
D(i,j)=D(i,j)+A(k,i+m)*A(k,j+m);
end
if i==j
D(i,j)=D(i,j)+1;
end end E(i)=0; for k=1:m
E(i)=E(i)+B(k)*A(k,i+m); end end
%Транспонирование вектора-строки E в вектор-столбец и %вычисление коэффициентов С(1)..С(n-m) E = E'; C = D \ E;
%Вычисление вектора решений в соответствии с найденными коэффициентами for k = m+1 : n X(k) = C(k-m); end for k = 1 : m X(k) = B(k); for j = 1 : (n - m)
X(k) = X(k) - A(k, j+m)*X(j+m); end end
%Транспонирование вектора-строки X в вектор-столбец X = X';
%Вывод РЕЗУЛЬТАТОВ disp('Вектор решения минимизированный по евклидовой норме'); disp(X); N = norm(X, 'fro'); disp('Евклидова норма вектора решений'); disp(N); %disp('Невязка Eps ='); %Eps = B - A*X
return
%Тестирование функции решения систем линейных алгебраических уравнений SLAE
%Пример 1
% Матрица коэффициентов при неизвестных
A = [ 1 -3 6 -5 0; 4 2 1 10 2; 2 0 -9 1 6 ]
% Матрица свободных членов
B = [ 3; 5; 7 ]
% --== 1 ==--
disp('- - = = 1 = = - -');
disp('Стандартное решение посредствам системы MatLab X = A\B');
X = A\B;
disp('X = ');
disp(X);
disp('Невязка Eps = ')
disp(B - A*X);
disp('Евклидова норма N = ')
disp(norm(X, 'fro'));
% --== 2==--
disp('- - = = 2 = = - -');
disp('Решение MatLab c первоначальной диагонализацией по методу Гауса');
% Приведение расширенной матрицы A|B к диагональному виду
[m, n] = size(A);
A = rref([A, B]);
B = A(:, n + 1);
A = A(:, 1 : n);
X = A\B
disp('Невязка Eps = ');
disp(B - A*X);
disp('Евклидова норма N = ');
disp(norm(X, 'fro'));
% --== 3 ==--
disp('- - = = 3 = = - -');
disp('Решение системы функцией SLAE');
% Повторный ввод параметров
A = [ 1 -3 6 -5 0; 4 2 1 10 2; 2 0 -9 1 6 ];
B = [ 3; 5; 7 ];
[X, N3] = SLAE(A, B);
disp('Невязка Eps = ');
disp(B - A*X);