Доброго времени суток, читатели! Сегодня мы поговорим о матрицах в Matlab, об их применении в решении систем линейных алгебраических уравнений. Подробно разберем методы решения, и для этого необходимо знание нескольких базовых алгоритмов.
Также стоит отметить, что у каждого алгоритма, которым мы будем искать решение СЛАУ в Matlab, своя скорость нахождения этого решения, наличие или отсутствие условия выполнения алгоритма и т.д.
В традициях нашего сайта разберём на примере:
Решить систему линейных уравнений:
4*a + b - c = 6
a - b + c = 4
2*a - 3*b - 3*c = 4
Метод обратной матрицы в Matlab
Начнем с достаточно распространенного метода. Его суть состоит в том, что сначала необходимо выписать коэффициенты при a, b и c (то есть те коэффициенты, которые находятся слева) в одну матрицу, а свободный член (то есть то, что справа) в другую.
В итоге у нас получится 2 матрицы:
A=[4 1 -1; 1 -1 1; 2 -3 -3]; % коэффициенты B=[6; 4; 4];
Для реализации этого метода (и следующих методов тоже) требуется одно условие: чтобы определитель матрицы, составленной из коэффициентов левой части не был равен нулю. Проверка на определитель:
det(A)
Вывод: 30
После проверки условия можем перейти к следующему шагу: нахождение обратной матрицы. В Matlab для этого используется оператор inv
.
А само решение СЛАУ в Matlab находится как перемножение найденной обратной матрицы на матрицу свободных членов:
x=inv(A)*B Вывод: 2 -1 1
Мы получили 3 значения, которые и соответствуют нашим коэффициентам: то есть a = 2, b = -1, c = 1
. Можете проверить, подставив полученные ответы в исходную систему, и убедиться, что мы решили СЛАУ правильно.
Также следует отметить, что матрицы нужно перемножать именно, как сделали мы, то есть слева обратная матрица, справа матрица свободных членов.
Если вы не все поняли, то советую вам почитать нашу статью по основам Matlab.
Метод Гаусса
Метод Гаусса в Matlab реализуется достаточно просто: для этого нам нужно всего лишь изучить один новый оператор.
(\) -
левое деление.
При следующей записи:
x = A\B Вывод: 2 -1 1
Мы получим ответы на нашу исходную систему. Только заметьте, мы решили СЛАУ стандартным набором функций в Matlab, и желательно этот оператор использовать когда матрица коэффициентов квадратная, так как оператор приводит эту матрицу к треугольному виду. В других случаях могут возникнуть ошибки.
Метод разложения матрицы
Теперь поговорим о разложении матрицы. Нахождение решения через разложение матрицы очень эффективно. Эффективность обусловлена скоростью нахождения решения для данного вида систем и точностью полученных результатов.
Возможны следующие разложения:
- разложение Холецкого
- LU разложение
- QR разложение
Разберём решение через LU и QR разложение, так как в задачах чаще всего встречается задание на решение именно через такие разложения.
Основное отличие этих двух разложений: LU разложение применимо только для квадратных матриц, QR — возможно и для прямоугольных.
LU разложение
Решим выше предложенную задачу через LU разложение:
[L, U] = lu(A); Вывод: L = 1 0 0 0.25 1 0 0.5 2.8 1 U = 4 1 -1 0 -1.25 1.25 0 0 -5 Затем: y = L\B; x = U\y Вывод: 2 -1 1
QR разложение
И через QR разложение соответственно:
[Q, R] = qr(A); x = R\(Q'*B) Вывод: 2.0000 -1.0000 1.0000
Отметим, что апостроф ( '
) после Q означает транспонирование.
Стандартные функции Matlab
Так же Matlab предлагает функцию linsolve
, с помощью которой возможно решить систему линейных алгебраических уравнений. Выглядит это так:
x = linsolve(A,B) Вывод: 2 -1 1
Как видите, ничего сложного тут нет, на то они и стандартные функции Matlab.
Повторение
Итак, сегодня мы с вами изучили несколько методов для решения СЛАУ в Matlab, как с помощью матриц, так и с помощью стандартных функций. Давайте их повторим на другом примере:
Решить систему линейных уравнений:
6*a - b - c = 0
a - 2*b + 3*d = 0
3*a - 4*b - 4*c = -1
A=[6 -1 -1; 1 -2 3; 3 -4 -4]; B=[0; 0; -1];
- Методом обратной матрицы:
x=inv(A)*B Вывод: 0.0476 0.1810 0.1048
x = A\B Вывод: 0.0476 0.1810 0.1048
[L, U] = lu(A); y = L\B; x = U\y Вывод: 0.0476 0.1810 0.1048
[Q, R] = qr(A); x = R\(Q'*B) Вывод: 0.0476 0.1810 0.1048
На этом я с вами попрощаюсь, надеюсь, вы научились применять матрицы в Matlab для решения СЛАУ.
А можно, пожалуйста, дописать сюда методы Крамера и Жордана-Гаусса. Последний, если память не изменяет, как-то делается через команду rref().
Да, можно, пока что в виде комментария:
Решим 1 систему из данной статьи, методом Крамера:
Сначала найдем 4 определителя матриц, составленных следующим образом:
A = [4 1 -1; 1 -1 1; 2 -3 -3]; %матрица коэфф
A1= [6 1 -1; 4 -1 1; 4 -3 -3]; %замена 1 столбца на столбец свободных членов
A2= [4 6 -1; 1 4 1; 2 4 -3]; %замена 2 столбца
A3= [4 1 6; 1 -1 4; 2 -3 4]; %замена 3 столбца
d = det(A); %вывод: 30
d1 = det(A1); %вывод: 60
d2 = det(A2); %вывод: -30
d3 = det(A3); %вывод: 30
Затем найдем коэффициенты:
a = d1/d; %Вывод: 2
b = d2/d; %Вывод: -1
c = d3/d; %Вывод: 1
Ответ получен верно.
Метод Жордана-Гаусса, который также называется метод исключения Гаусса, решается в MATLAB таким образом:
>> A= [4 1 -1; 1 -1 1; 2 -3 -3]; b=[6;4;4]
>> C= rref([A b]) %приведение расширенной матрицы к треугольному виду
>>x=C(1:3,4:4) %выделение последнего столбца из матрицы – это решение системы уравнений
>> A*x %проверка
Большое спасибо.
огромное спасибо, вы спасли мою КР)
Мы рады вам помочь)