Использование пакетов


В состав Maple входит большое число специализированных пакетов, ориентированных, как правило, на конкретные разделы математики. Подгрузка пакета осуществляется с помощью команды with, аргументом которой служит имя пакета:

 > with(simplex);

Warning, new definition for maximize
Warning, new definition for minimize
[basis, convexhull, cterm, define_zero, display, dual, feasible, maximize, minimize, pivot, pivoteqn, pivotvar, ratio, setup, standardize]
 

Нередко пакеты содержат функции, называющиеся так же, как функции, входящие в ядро Maple, но отличающиеся от них. В таких случаях после подгрузки пакета содержащиеся в них функции получают более высокий приоритет по сравнению со своими "тезками". В нашем примере система предупредила нас, что после подключения пакета линейной оптимизации будет действовать новое определение функций maximize и minimize .

В качестве результата успешного выполнения команды with Maple выводит на дисплей (курсивом в квадратных скобках) перечень функций, ставших доступными после активизации пакета.

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

 

> with(numtheory, divisors, factorset, phi, order, primroot);

Warning, new definition for order

[divisors, factorset, order, ф, primroot]

 

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

> restart:A:= matrix([[a,b],[c,a]]); linalg[det](A);det(A);

A := matrix([[a, b], [c, a]])

a2 - b c

det(A)


При повторном вызове функции определителя (без указания пакета линейной алгебры, в котором она хранится). Maple "забыл", что такое det и посчитал ее пользовательской функцией.

Следует иметь в виду, что некоторые функции, "приписанные" к тем или иным специализированным пакетам, на самом деле доступны из ядра Maple. Таковы, например, функции ifactor, isolve, isprime, ithprime , nextprime и prevprime из пакета numtheory, matrix и vector из пакета linalg, инертные функции из пакета student . Учет этой особенности позволит экономнее использовать оперативную память компьютера и в конечном итоге ускорить вычисления.

 


Линейная алгебра

В предыдущем разделе мы рассмотрели общие принципы работы со специализированными пакетами Maple. Остановимся несколько подробнее на изучении одного из самых объемных (по числу функций) и часто используемых пакетов - linalg . (Отметим, что начиная с 6-й версии в комплект Maple входит еще один пакет по линейной алгебре - LinearAlgebra.)

Подгрузив пакет с помощью команды with, мы увидим перед собой перечень входящих в него функций, а также предупреждение о новом определении нормы и следа:

 

> with(linalg);

Warning, new definition for norm
Warning, new definition for trace
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp, Wronskian, addcol, addrow, adj, adjoint, angle, augment, backsub, band, basis, bezout, blockmatrix, charmat, charpoly, cholesky, col, coldim, colspace, colspan, companion, concat, cond, copyinto, crossprod, curl, definite, delcols, delrows, det, diag, diverge, dotprod, eigenvals, eigenvalues, eigenvectors, eigenvects, entermatrix, equal, exponential, extend, ffgausselim, fibonacci, forwardsub, frobenius, gausselim, gaussjord, geneqns, genmatrix, grad, hadamard, hermite, hessian, hilbert, htranspose, ihermite, indexfunc, innerprod, intbasis, inverse, ismith, issimilar, iszero, jacobian, jordan, kernel, laplacian, leastsqrs, linsolve, matadd, matrix, minor, minpoly, mulcol, mulrow, multiply, norm, normalize, nullspace, orthog, permanent, pivot, potential, randmatrix, randvector, rank, ratform, row, rowdim, rowspace, rowspan, rref, scalarmul, singularvals, smith, stack, submatrix, subvector, sumbasis, swapcol, swaprow, sylvester, toeplitz, trace, transpose, vandermonde, vecpotent, vectdim, vector, wronskian]

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

 

> A:=matrix(3, 3, [-3, 9, -8, 18, -28, 27, 20, -36, 34]);

A := matrix([[-3, 9, -8], [18, -28, 27], [20, -36, ...

> B:=matrix([[3, 0, 0], [8, -23, 24], [8, -26, 27]]);

B := matrix([[3, 0, 0], [8, -23, 24], [8, -26, 27]]...

> C:=[[1, 2, 4], [-3, 1, -2], [1, -2, -1]];C:=convert(C, matrix);

C := [[1, 2, 4], [-3, 1, -2], [1, -2, -1]]

C := matrix([[1, 2, 4], [-3, 1, -2], [1, -2, -1]])

> F:=transpose(randmatrix(3, 3, unimodular, entries=rand(-3..3)));

F := matrix([[1, 0, 0], [3, 1, 0], [0, 1, 1]])


В последнем случае мы сгенерировали верхнетреугольную унимодулярную матрицу (с указанием диапазона разброса коэффициентов) и затем транспонировали ее.

Найдем определитель матрицы C:

 

> det(C);

5

 

Для умножения согласованных матриц в Maple используется операция &* . Найдем разность произведений матриц A и B, взятых в противоположных порядках:

 

> ABBA:=A&*B-B&*A;

ABBA := (A &* B) - (B &* A)

 

Мы видим, что вместо привычного для нас окончательного результата Maple вернул в качестве ответа некий "полуфабрикат" (умножение и вычитание матриц обозначены, но не выполнены). Дело в том, что для сложных объектов (матриц, массивов, таблиц, процедур) в Maple используется так называемое "правило вычисления до последнего имени" (last name evaluation). Это правило (в отличие от "правила вычисления до конца", используемого для менее громоздких объектов) применяется во избежание лишнего вывода на экран. Для того, чтобы все же вывести на экран интересующую нас матрицу, воспользуемся функцией evalm (другая возможность - использовать уже известную нам функцию op ):

> AB:=evalm(ABBA);

AB := matrix([[8, -26, 24], [4, 90, -74], [-4, 116,...

 

Найдем ранг полученной матрицы:

 

> rank(AB);

2

 

Найдем матрицу, обратную к A. В этом случае, в отличие от бинарной операции умножения матриц, Maple вычисляет результат до конца:

> inverse(A);

matrix([[-5, 9/2, -19/4], [18, -29/2, 63/4], [22, -...

 

Для матриц A и B найдем собственные значения и принадлежащие им собственные векторы:

> eigenvals(A); eigenvectors(A);

-1, 2, 2

[-1, 1, {vector([-3/10, 1, 6/5])}], [2, 2, {vector(...

> eigenvects(B);

[3, 2, {vector([13/4, 1, 0]), vector([-3, 0, 1])}],...

 

Обратите внимание, что при обращении к функции eigenvectors (eigenvects) Maple возвращает собственные значения матрицы, их кратность как корней характеристического многочлена и базис подпространства из собственных векторов, принадлежащего каждому собственному значению.


Разумеется, Maple умеет работать не только с числовыми матрицами:

 

> M:=matrix([[a, 2, c], [b, b, c], [0, a, 1]]);

M := matrix([[a, 2, c], [b, b, c], [0, a, 1]])

> rank(M);

3

> evalm(M^2);

matrix([[a^2+2*b, 2*a+2*b+c*a, c*a+3*c], [b*a+b^2, ...

> f:=collect(charpoly(M, lambda), lambda);

f := lambda^3+(-1-a-b)*lambda^2+(-c*a+a-b+b*a)*lamb...

 

В последнем примере мы нашли характеристический многочлен матрицы M и сгруппировали его относительно lambda.


Волгоградский государственный педагогический университет
Кафедра алгебры, геометрии и информатики