Основные операции над матрицами
Пример 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