Возможна ли разработка приложения на Octave с GUI? |
Задачи линейной алгебры
5.3 Действиям над матрицами
Начнём с операций, которые применимы к матрицам с точки зрения классической математики. Одним из базовых действий над матрицами является сложение "+" (вычитание "-–"). Здесь важно помнить, что суммируемые (вычитаемые) матрицы должны быть одной размерности. Результатом такой операции является матрица:
>>> Matr_1=[1 2 3; 4 5 6; 7 8 9 ] Matr_1 = 1 2 3 4 5 6 7 8 9 >>> Matr_2=[0 9 8; 7 6 5; 4 3 2 ] Matr_2 = 0 9 8 7 6 5 4 3 2 >>> Matr_3=Matr_1+Matr_2 Matr_3 = 1 11 11 11 11 11 11 11 11 >>> Matr_4=Matr_2_Matr_1 Matr_4 = -1 7 5 3 1 -1 -3 -5 -7
Умножать на число (запись "*") можно любую матрицу, результатом так же будет матрица, каждый элемент которой будет помножен на заданное число:
>>> Matr_1=[1 2 3; 4 5 6; 7 8 9 ]; Matr_5=0.2_ Matr_1 Matr_5 = 0.20000 0.40000 0.60000 0.80000 1.00000 1.20000 1.40000 1.60000 1.80000
Операция транспонирования (запись "’") меняет в заданной матрице строки на столбцы и так же применима к матрицам любой размерности.
>>> Matr_5 ’ ans = 0.20000 0.80000 1.40000 0.40000 1.00000 1.60000 0.60000 1.20000 1.80000
При умножении матриц ("*") важно помнить, что число столбцов первой перемножаемой матрицы должно быть равно числу строк второй. Примеры умножения матриц показаны в листинге:
>>> Matr_1=[1 2 3; 4 5 6; 7 8 9 ]; >>> Matr_2=[0 9 8; 7 6 5; 4 3 2 ]; >>> Matr_1* Matr_2 ans = 26 30 24 59 84 69 92 138 114 >>> A=[-3 2; 0 1 ]; >>> B=[0 -2;3 -1;0 1 ]; >>> B*A ans = 0 -2 -9 5 0 1 % Некорректное умножение матриц >>> A*B error: operator *: nonconformant arguments (op1 is 2x2, op2 is 3x2)
Возведение матрицы в степень ("^") эквивалентно её умножению на себя указанное число раз. При этом целочисленный показатель степени может быть как положительным, так и отрицательным. Матрица в степени -1 называется обратная к данной. При возведении матрицы в положительную степень выполняется алгоритм умножения матрицы на себя указанное число раз. Возведение в отрицательную степень означает, что умножается на себя матрица, обратная к данной. Примеры возведения в степень:
>>> Matr_6=[3 2 1; 1 0 2; 4 1 3 ]; >>> Matr_6^3 ans = 92 40 59 65 29 40 146 65 92 >>> Matr_6^( -1) ans = -0.40000 -1.00000 0.80000 1.00000 1.00000 -1.00000 0.20000 1.00000 -0.40000 >>> Matr_6^( -3) ans = 0.544000 1.240000 -0.888000 -1.120000 -1.200000 1.240000 -0.072000 -1.120000 0.544000
Для поэлементного преобразования матриц (листинг 5.2) можно применять операции, описанные ранее, как операции поэлементного преобразования векторов: добавление (вычитание) числа к каждому элементу матрицы ("+" или "—"), поэлементное умножение матриц (".*") одинакового размера, поэлементное деление матриц одинакового размера (прямое "./" и обратное ".\"), поэлементное возведение в степень (".^") и применение к каждому элементу матрицы математических функций.
>>> M=[3 2 1; 1 1 2; 4 1 3 ]; >>> N=[4 -2 -1;9 6 -2;-3 -1 2 ]; >>> 2* M ans = 6 4 2 2 2 4 8 2 6 >>> N/3 ans = 1.33333 -0.66667 -0.33333 3.00000 2.00000 -0.66667 -1.00000 -0.33333 0.66667 >>> M. *N ans = 12 -4 -1 9 6 -4 -12 -1 6 >>> N. *M ans = 12 -4 -1 9 6 -4 -12 -1 6 >>> M. /N ans = 0.75000 -1.00000 -1.00000 0.11111 0.16667 -1.00000 -1.33333 -1.00000 1.50000 >>> M. \N ans = 1.33333 -1.00000 -1.00000 9.00000 6.00000 -1.00000 -0.75000 -1.00000 0.66667 >>> M. ^ 0.2 ans = 1.2457 1.1487 1.0000 1.0000 1.0000 1.1487 1.3195 1.0000 1.2457 >>> N.^M ans = 64 4 -1 9 6 4 81 -1 8Листинг 5.2. Примеры преобразования матриц
Рассмотрим работу с матрицами на следующем примере.
Пример 5.1. Вычислить математическое выражение для заданных значений и .
Решение задачи показано в листинге 5.3.
>>> A=[-3 2 0; 0 1 2; 5 3 1 ]; B=[0 -2 1; 3 -1 1; 0 1 1 ]; >>> (2*A+1/3*B’ ) ^2-A*B^( -1) ans = 32.667 -20.667 20.667 47.333 26.889 15.667 -40.333 75.333 31.778Листинг 5.3. Вычисление математического выражения (пример 5.1).
Довольно необычное, с точки зрения математики, применение нашлось для операторов "/" и "\". Символ "/" используется для операции называемой делением матриц слева направо, соответственно знак "\" применяется для деления матриц справа налево. Операция эквивалентна выражению , её удобно использовать для решения матричных уравнений вида
>>> A=[2 -1 2; -1 2 -2;2 -2 5 ] A = 2 -1 2 -1 2 -2 2 -2 5 >>> B=[7 0 0; 0 1 0; 0 0 1 ] B = 7 0 0 0 1 0 0 0 1 >>> X=B/A X = 6.00000 1.00000 -2.00000 0.14286 0.85714 0.28571 -0.28571 0.28571 0.42857 >>> X*A - B % Проверка X · A - B = 0 ans = -8.8818e-16 4.4409e-16 6.6613e-16 0.0000e+00 2.2204e-16 -2.2204e-16 0.0000e+00 5.5511e-17 -2.2204e-16
Соответственно эквивалентно и применяется для решения уравнения
>>> A=[2 -1 2; -1 2 -2;2 -2 5 ]; B=[7 0 0; 0 1 0; 0 0 1 ]; X=A\B X = 6.00000 0.14286 -0.28571 1.00000 0.85714 0.28571 -2.00000 0.28571 0.42857 >>> A*X - B % Проверка A · X - B = 0 ans = -8.8818e-16 0.0000e+00 0.0000e+00 4.4409e-16 2.2204e-16 5.5511e-17 6.6613e-16 -2.2204e -16 -2.2204e-16
Если предположить, что и это векторы, а — матрица, то получим запись системы линейных алгебраических уравнений в матричной форме . Это значит, что оператор "\" можно применять для решения линейных систем:
>>> A=[1 2; 1 1 ]; b = [ 7; 6 ]; >>> x=A\b x = 5 1 >>> A*x % Проверка Ax = b ans = 7 6