Основные операции над матрицами

Пример 1 (создание матриц и векторов).

Заметим сразу, что матрицы и вектора по сути своей это переменные типа массив и список. Основное отличие в том, что добавлены операции сложения и умножения. В силу этого, при загрузке пакета linalg система печатает предупреждение о переопределении ряда операций. Итак, разные определения матриц

> restart: with(linalg):

> A:=matrix([[5,w],[f(x),6]]);

> B:=matrix(2,2,[1,2,3,4]);

> f:=(i,j)->x^(a*i+b*j);

> C:=matrix(2,2,f);

> dC:=map(diff,C,x);

Частично заданные матрицы

> A:=matrix(2,2,[x,y]);

В этом примере A[2,1] означает неопределенность данного элемента матрицы в данный момент

> B:=matrix([col(A,1..2)]);

Некоторые матрицы специального вида

> A:=diag(a,b,c,d);

> B:=array(1..4,1..4,identity): eval(B);

> B:= array(symmetric, 1..3,1..3, [ [0,x,y], [x,0,z] ] ):

> eval(B);

В этом примере знак вопроса означает неопределенность элемента матрицы. Тем не менее можно работать с этой матрицей. Например

> B[1,2];

> B[3,3];

Различные определения векторов

> a:=vector([5,4,3,2,1]);

> b:=vector(4,0);

> c:=vector(4);

> d:=

Перечислим некоторые команды, позволяющие получать информацию о матричных и векторных переменных, изменять параметры матриц и векторов.

Пример 2 (структура матриц и векторов).

Размеры матриц определяются таким образом

> restart: with(linalg):

> A:= matrix(3,4);

> rowdim(A);

> coldim(A);

Строки и столбцы матриц можно

> A:= matrix(3,3,[1,2,3,4,5,6,7,8,9]);

выделять

> row(A,2);

> col(A,2..3);

удалять

> B:=delrows(A, 2..3);

> C:=delcols(A, 1..1);

добавлять (команда addrow(A, r1, r2, m) возвращает матрицу B в которой строка r2 заменена на строку m*row(A,r1) + row(A,r2)):

> B:=addrow(A,1,2,10);

> C:=addcol(A,1,2,-x);

умножать

> B:=mulrow(A, 2, 2);

> C:=mulcol(A, 2, x);

переставлять

> A:= array( [[1,2,x],[3,4,y]] );

> swaprow(A, 1, 2);

> swapcol(A, 2, 3);

Матрицы можно соединять, выделять из них подматрицы и т.д.

Перейдем к командам, которые реализуют основные векторные и матричные операции. Начнем с самых простых и часто используемых операций линейной алгебры.

Пример 3 (операции сложения и умножения).

Для сложения или умножения матриц и векторов используют многоцелевую команду

evalm. Например, зададим матрицы и вектор

> restart: with(linalg):

> A:= array( [[1,2],[3,4]] );

> B:= array( [[0,1],[1,0]] );

> c:= array( [4,5] );

и посмотрим на синтаксис этих операций

> evalm(A+B);

> evalm(A&*B);

> evalm(A&*c);

Так как опреция умножения над полем метриц некомутативна, то для этой операции предусмотрены и другие команды

> multiply(B,A);

> multiply(B,c);

а для векторов еще одна операция

> innerprod(c,B);

Умножить матрицу (вектор) на скаляр позволяет операция

> A:= array( [[1,2],[3,4]] );

> B:=scalarmul(A, x);

Для векторов добавлены еще две операции обычного и векторного произведения

> u:= vector( [1,x,y] );

> v:= vector( [z,1,1] );

> dotprod(u, v);

> crossprod(u, v);

Существует много встроенных команд для работы только с матрицами. Рассмотрим часть из них.

Пример 4 (всторенные операции с матрицами).

Определим матрицу

> restart: with(linalg):

> A := matrix(3,3, [1,2,3,x,y,z,a,b,c]);

Ее определитель, ранг и след равны

> det(A);

> rank(A);

> trace(A);

Сопряженная, транспонированная и обратная к ней равны

> B:=adj(A); # или adjoint

> C:=transpose(A);

> F:=inverse(A); # или evalm(1/A)

Можно найти эрмитову транспонированную, и некоторые другие матрицы, мы не будем на этом останавливаться.

Собственные числа и вектора

Рассмотрим теперь проблему нахождения собственных значений и собственных векторов матриц. В Maple данная проблема может быть решена несколькими способами.

Пример 6 (собственные числа и вектора).

Обсудим проблему нахождения собственных чисел и векторов. Для начала загрузим пакет линейной алгебры и определим произвольную матрицу

> restart:with(linalg):

> A:= matrix([[1,2,3],[2,3,4],[4,5,6]]);

По определению, собственные числа матрицы A являются корнями характеристического полинома det(A-lambda*I) по переменной lambda. Найдем этот полином

> cp:= det(A-lambda);

Корни кубического полинома легко найти аналитически

> solve(cp,lambda);

Можно найти эти значения непосредственно из матрицы

> e:= eigenvals(A);

Однако, попробуем заставить систему вычислить эти собственные значения в форме чисел с плавающей запятой

> B:= map(evalf,A);

> eigenvals(B);

Как видим, из-за погрешностей округления нулевое собственное значение перестало быть нулем. Мораль: система Maple (Matemetica) не предназначена для численных расчетов.

Найдем теперь собственные вектора матрицы. По определению это решения уравнения A x = lambda x, т.е. данные вектора определяют пространство вырождения матрицы A - lambda I.

> nullspace(e[1]-A);

> nullspace(e[2]-A);

> nullspace(e[3]-A);

Естественно, что существует возможность определить собственные числа и вектора одновременно

> e := eigenvects(A,radical);

Ответ представляется списком, состоящим зи списков. Для выделения вложенных элементов используют общие правила

> e1:= e[1][1]; v1 := e[1][3][1];

> evalm((e1 - A) &* v1 );

Аналогично можно работать с матрицами, определенными аналитически, т.е. не числовыми. Например

> T:= toeplitz( [a,b,c] );

> eigenvals(T,radical);

> e:= eigenvects(T,radical);

Однако, для корней полиномов старших степеней невозможно найти аналитическое представление. В силу этого, результаты могут быть представлены достаточно неожиданным способом. Рассмотри матрицу

> A:= matrix(

> [[-a1/a2, 1/a2, 0, 1/(R*a2)],

> [1, 0, 0, 0],

> [-q1*a1/a2, q1/a2, 0, a2 + q1/(a2*R)],

> [q2, 0, 1, a1]]);

>

Характеристический полином четвертого порядка невырожден

> cp:= det(lambda-A);

т.е. не факторизуется на множители

> factor(cp);

Все корни подобных полиномов Maple представляет как единое выражение.

> solve(cp,lambda);

Для собственных векторов мы также получим одно выражение

> eigenvects(A);

Второй аргумент показывает, что все четыре собственных значения невырождены. Таким образом, можно найти корни полинома численно и подставить их в данную формулу.

Рассмотрим теперь пример, в котором характеристический полином факторизуется

> B:= matrix(6,6,

> [0,0,0,0,0,a,

> 0,1,0,0,0,-b,

> 0,0,0,-a,b,0,

> 0,0,-c,0,0,0,

> 0,0,d,0,0,0,

> c,-d,0,2,0,0] );

>

> cp:= charpoly(B,lambda);

> f:= factor(cp);

Как видно lambda=0 является собственным значением. Построим характеристическую матрицу C=lambda I -B при lambda=0

> C:= charmat(B,0);

и найдем соответствующий собственный вектор.

> nullspace(C);

Аналогично поступим и со следующими двумя собственными значениями. Например, для + sqrt(ac+bd) получим

> C:= charmat(B, sqrt(a*c+b*d));

> nullspace(C);

Теперь перейдем к кубическому полиному. Присвоим корням этого полинома имя beta

> alias( beta=RootOf(op(3,f),lambda) );

и найдем соответствующие вектора

> C := charmat(B,beta);

> nullspace(C);

Для сравнения получим все эти ответы сразу, используя многоцелевую команду

> eigenvects(B);

Во-первых, следует заметить, что вектора, отвечающие кубической части полинома отличаются от полученных ранее. Это связано с тем, что собственные вектора определяются с точностью до скалярного множителя. Во вторых, когда выдается так много информации сразу, то в ней бывает достаточно сложно разобраться. Так что, это уже дело вкуса какой из путей выбрать для данных вычислений.

Рассмотрим теперь матрицы с вырожденными собственными значениями

> A:= matrix(4,4,[0,1,0,0,-u^2,2*u,0,0,-u*v,v,u,0,-u*t,t,0,u]);

>

> e:= eigenvects(A);

В ответе мы получили четыре совпадающих собственных значения и базис из трех собственных векторов. Это означает, что два вектора совпадают.

Проверим наш ответ. Соберем из векторов матрицу

> X:= augment(e[3][1], e[3][2], e[3][3] );

и подставим ее в наше уравнение

> evalm((u-A) &* X)

Приведение матриц

Практически все алгоритмы приведения матриц к различным специальным формам можно найти в Maple. Ограничимся несколькими замечаниями.

Пример 7 (приведение матриц).

Зададим матрицу

> restart: with(linalg):

> A:=matrix(3,3,[x,y,z,0,9,8,7,6,5]);

Применим алгоритм гауссова исключения

> gausselim(A);

алгоритм гауссова исключения без деления

> ffgausselim(A);

Для работы с символьными матрицами последняя команда предпочтительнее, поскольку исключает деление на ноль.

Приведение матрицы к треугольному виду при помощи алгоритмя Гаусса-Жордана

> A:= array( [[4,-6,1,0],[-6,12,0,1],[-2,6,1,1]] );

> gaussjord(A, 'r');

Эрмитова часть матрицы, зависящей от x, выделяется командой

> H:= inverse(hilbert(2,x));

> hermite(H,x);

Для определения размерности векторного пространства, порожденного столбцами (строками) матрицы и векторов, заметающих это пространство, используют команды

> B:=array( [[0,0,0,1,0],[0,x,0,0,0],[0,0,y,y,0],[0,x,0,1,0]] );

> rowspace(B, 'd');

> d;

> colspace(B, 'd');

> d;

> rowspan(B);

> colspan(B);

Алгоритм разложения Холецкого

> S:= matrix(3,3, [1,2,3,0,1,1,0,0,4]);

> A:= evalm(transpose(S)&*S);

> R := cholesky(A);

LU разложение матриц

> A:= matrix([[1,-2,3,1],[2,k,6,6],[-1,3,k-3,0]]);

> x:= LUdecomp(A,L='l',U='u',U1='u1',R='r',P='p',det='d',rank='ran');

с побочными результатами

> ran;

> evalm(l);

> evalm(x);

и QR разложение

> A:= matrix(3, 3, [1, 2, 3, 0, 0, 1, 2, 3, 4]):

> linalg[QRdecomp](A, Q='q', rank='r');

Системы линейных уравнений

Если системы уравнений заданы в матричной форме, удобнее использовать пакет linalg.

Пример 8 (решение систем уравнений).

Команда linsolve(A, B) находит вектор (матрицу) X который удовлетворяет уравнению A X = B.

Отметим так же команду leastsqrs(A, b), которая позволяет получить приближение к решению данного уравнения по методу наименьших квадратов, т.е. минимизируя норму вектора (A x - b, 2).

> restart: with(linalg):

> A:= matrix([[1,2],[1,3]]);

> b:= vector([1,-2]);

> linsolve(A, b);

> B:= matrix( [[1,1],[-2,1]] ):

> linsolve(A, B);

> A:= matrix([[5,7],[0,0]]):

> b:= vector([3,0]):

> linsolve(A, b, 'r');

> r;

В последнем примере мы вычислили так же ранг матрицы A.

> A:= array([[1,-1,1],[1,1,-2],[2,0,-1]]);

> b:= vector([1,2,4]);

> leastsqrs(A,b);

> leastsqrs(A,b,'optimize');

Дифференциальные операторы векторного анализа так же реализованы в данном пакете линейной алгебры. Мы можем вычислять ротор, лапласиан, градиент, дивиргенцию и многое другое.

Контрольные вопросы:

1. Знать и уметь пользоваться основными командами Maple приведенными выше

2. Самостоятельно рассмотреть такие темы как: «Решение уравнений» и «Решение дифференциальных уравнений».

3. Выделить список основных команд с которыми вы познакомились выполняя задание 2. Уметь ими пользоваться.

Задания:

1. Получить у преподавателя сложную функцию F(G(x,y),z ) )

2. Продиффиренцировать ее (найти производные всех порядков)

3. Проверить правильность полученных производных путем интегрирования

4. Получить матрицу А , (i,j=1..4) и столбец свободных членов B (i=1..4)

5. Из полученных матриц составить систему линейных уравнений вида A*X=B, и решить ее.

6. Для выполнения заданий 1..5 использовать приложение Maple.

СПИСОК ЛИТЕРАТУРЫ

1. Фигурнов В. Э. – IBM PC для пользователя. Краткий курс. – М.: Инфра - М,, 1998. – 480с.:ил.

2. Борланд Р. Знакомство с Windows 98. – М.: Microsoft Press Русская редакция, 1997, 376с.

3. Леоньтьев Ю. – Самоучитель Word 2000. – СПб: Издательство «Питер», 2000. – 313с.:ил.

4. Леоньтьев Ю. – Самоучитель Excel 2000. - СПб: Издательство «Питер», 2000. – 265с.:ил.

5. Давенпорт Дж. – Компьютерная алгебра. Символьные и алгебраические вычисления. – М.: Мир, 1996. – 354с.:ил.

6. Очков В. Ф. – Mathcad 8 Pro для студентов и инженеров. – М.: Аст-пресс, 1998, 270с.:ил.

7. Сворт Б. – Современные системы оптического распознавания текстов в использовании. – СПб: Издательство «Питер», 2000. – 420с.: ил.

8. Шикин Е.В. – Электронный офис – средство обработки документов. – М.: Инфорком-Пресс, 1999. – 520с.

ОГЛАВЛЕНИЕ

Л/р №1 «Стандартные программы Windows»…………………………… … .3

Л/р №2 «Текстовый редактор Microsoft Word и табличный

процессор Microsoft Excel»………………………………………………….. 11

Л/р №3 «Графический редактор Adobe Photoshop 4.0»……………………. 23

Л/р №4 «Математический пакет Mathcad 8 Pro»…………………………… 33

Л/р №5 «Программа сканирования и распознования текстов FineReader»…43

Л/р №6 «Автоматизированная система лингвистического перевода

PROMT 99»……………………………………………………………………..57

Л/р №7 «Символьные вычисления с помощью программы Maple V»………67

Наши рекомендации