§ 1. Математическая система Maple: основные принципы работы
Система Maple (разработана канадской компанией Waterloo Maple Software) на сегодняшнее время является одной из ведущих вычислительных систем компьютерной математики (наряду с MathCad, MathLab, Mathematica). По сути, Maple – это не просто математическая программа, а целый комплекс так называемых пакетов (packages), каждый из которых направлен на решение различных задач линейной алгебры, аналитической геометрии, математического анализа, дифференциальных уравнений, математической статистики, линейного и нелинейного программирования и т.д.
Maple традиционно считают системой аналитико-символьных вычислений (в отличие от нее MathCad – в основном программа для численных расчетов). Это означает, что система в большинстве случаев выдает ответ на решение задачи в самом общем – символьном виде. Maple одна из самых надежных идостоверных систем компьютерной математики. Надежных – в смысле высокой достоверности и точности полученных результатов при самых сложных символьных вычислениях.
Особенно эффективно использование Maple при обучении математике. Высочайший «интеллект» этой системы символьной математики объединяется в ней с мощными средствами математического численного моделирования и возможностями графической визуализации решений.
Maple – интегрированная система. Она объединяет в себе:
- мощный язык программирования, основанный на языке С++ (он же язык для интерактивного общения с системой);
- редактор для подготовки и редактирования документов и программ;
- современный многооконный пользовательский интерфейс с возможностью работы в диалоговом режиме;
- мощную справочную систему [меню Help, вкладки Introduction (общая справочная система), Topic Search… (поиск справки по какому-то определенному разделу или команде), Glossary (глоссарий)];
- ядро алгоритмов и правил символьных и аналитических преобразований математических выражений;
- численный и символьный процессоры;
- систему диагностики ошибок при вычислениях и преобразованиях;
- библиотеки встроенных и дополнительных процедур и функций;
- пакеты (packages) внешних функций для решения различного рода задач и поддержи других языков программирования и программ.
Рассмотрим кратко основные принципы работы в Maple. Более подробную информацию можно взять в [1, 9, 12, 13], а также на многочисленных сайтах, посвященных этой системе.
|
Основой для работы с символьными преобразованиями в Maple является ядро системы. Оно содержит сотни базовых функций и алгоритмов численных и символьных преобразований. В ядре имеются также библиотека операторов, команд и специально подключаемые пакеты (packages).
При первоначальном запуске появляется рабочее окно программы Maple (см. рис. 1.1).
Рис. 1.1.
В некоторых новых версиях программы оно может несколько отличаться от этого (в данном пособии речь идет о версии Maple 12, большинство примеров и описаний идут корректно на версиях Maple 10 и Maple 11). Рабочее окно программы состоит из следующих элементов:
1) основного (главного) меню (вкладки File, Edit, View, Insert, Format, Spreadsheet, Window, Help);
2) панели главных инструментов;
3) контекстной панели инструментов;
4) рабочей области (окно ввода и редактирования документов).
Рабочий лист (worksheet) среды является основным документом, в котором вводятся команды пользователя и в который выдаются результаты работы.
|
В рабочем листе Maple выделяются области ввода и области вывода. В области ввода пользователем вводятся команды (более подробное описание видов команд смотри далее), а также комментарии и текстовая информация. В полях вывода отображаются результаты выполнения введенных команд, включая сообщения об ошибках и графика. Комментарии и текстовая информация ядром Maple не обрабатываются и предназначены только для разработчиков и пользователей программ.
Основной режим работы системы Maple – командно-диалоговый режим. Это означает, что пользователь на запрос системы
[ >
должен ввести команды, понятные процессору Maple. Признаком окончания ввода команды служит символ точка с запятой (;) (результат действия процессора и вычисления будет выведен на экран) или символ двоеточие (:) (вычисления не будут выведены на экран, данный символ используется как знак разделителя при записи некоторых команд в одной строке).
Область ввода и соответствующая ей область вывода называются группой вычислений. На рабочем листе она отмечается квадратной скобкой слева. В группе вычислений может содержаться несколько областей ввода и вывода: все команды и операторы в областях ввода одной группы вычислений обрабатываются системой за одно обращение по нажатию клавиши <Enter>.
Maple имеет следующие основные виды команд:
1) оператор присваивания. Имеет следующий синтаксис (правило описания):
[ > имя_переменной:=значение[;\:]
Например,
[ > x:=3; v:=vector([1,2,3]); f(y):=sin(ln(y));
2) вызов процедуры или функции. Имеет следующий синтаксис:
|
[> имя_процедуры(список параметров)[;\:]
или
[> имя_переменной:=имя_функции(список параметров)[;\:]
В следующих строках определены функция , дробно-рациональная функция
, процедуры интегрирования функции
, дифференцирования
и функция упрощения производной от
:
[ > restart; f(x):=tan(x); g(x):=int(f(x),x);
[ > h(x):=(x+2)/(x-2); diff(h(x),x); R:=simplify(diff(h(x),x));
Приведем описание некоторых встроенных функций элементарных преобразований, которые нам потребуются в дальнейшем:
restart – “обнуление” значений всех переменных, отмена подключенных пакетов и т.д. (рекомендуется использовать в качестве первой команды рабочего листа);
evalf – преобразования числа в число с плавающей точкой (перевод точного числа в приближенное). Имеет следующий синтаксис:
[> evalf(<выражение>, <кол_цифр>);
[> evalf[<кол_цифр>](<выражение>);
Здесь параметры:
<выражение> – выражение, в котором все числа требуется привести к виду чисел с плавающей точкой;
<кол_цифр> – целое число, указывающее количество значащих цифр для вычислений (необязательный параметр);
Digits – глобальная переменная пакета Maple, значение которой (по умолчанию оно равно 10) показывает количество значащих цифр, выводимых на экран;
% (символ процента) – вывод результата выполнения предыдущей операции;
%% – вывод результата выполнения “предпредыдущей” операции;
# (символ решетка) – использование комментария в программе;
simplify – упростить выражение. Имеет следующий синтаксис:
[> simplify(<выражение>);
С полным списком функций, входящих в ядро Maple, и их обозначениями можно познакомиться, набрав команду inifcn, выделить ее мышкой и нажать кнопку <F1>;
3) подключение специальных пакетов Maple. Подключение пакета осуществляется следующим образом:
[> with(имя_пакета)[;\:]
Например, с помощью следующих команд:
[> restart; with(LinearAlgebra):
[> with(simplex);
в оперативную память загружаются пакет LinearAlgebra, ориентированный на решение задач линейной алгебры, и пакет simplex, предназначенный для решения задач линейного программирования.
Напомним, что при начальном запуске системы в оперативную память загружено только ядро системы. Однако при решении огромного класса задач, требующих сложных расчетов, встроенных процедур и функций ядра не хватает. В состав Maple 12 входит около 80 пакетов. Дадим список наиболее часто используемых пакетов Maple (с полным списком пакетов можно ознакомиться, используя главное меню Help –> вкладка Introduction –> Mathematics… –> Packages…):
· DEtools – решение обыкновенных дифференциальных уравнений и систем в численном и аналитическом видах, представление результатов в виде фазовых портретов, полей направлений, интегральных кривых и т.д.;
· finance – пакет финансовой математики;
· geom3d, geometry – пакеты трехмерной и двумерной евклидовой геометрии;
· LinearAlgebra – линейная алгебра (основной и незаменимый пакет для решения задач линейной и матричной алгебры);
· linalg – линейная алгебра и структуры данных массивов (до версии 6.0 являлся основным пакетом для решения задач линейной алгебры);
· inttrans – интегральные преобразования и их обратные преобразования;
· networks – пакет для работы с графами;
· numapprox – численная аппроксимация;
· Optimization – пакет для решения задач нелинейного программирования;
· plots – пакет для расширения графических возможностей;
· powseries – разложение функций в степенные ряды;
· simplex – пакет для решения задач линейного программирования;
· statistic – пакет для обработки статистических данных;
· sumtools — числовые ряды;
4) вызов справки (или примера) по определенному разделу, процедуре, функции, пакету. Вызов производится следующим образом:
[> help(имя)[;\:]
[> example(имя)[;\:]
§ 2. Применение пакета Maple к решению задач математического анализа
В этом параграфе будет рассмотрено применение Maple к решению часто встречающихся задач математического анализа. В состав ядра Maple входит достаточное количество встроенных процедур и функций [1, 9, 12, 13], ориентированных на решение задач математического анализа. В табл. 2.1 приводится список процедур и функций, которые нам потребуются в дальнейшем.
Таблица 2.1.
Процедура, функция | Назначение процедуры, функции |
plot(f(x),x) | Построение графика функции ![]() |
solve(f(x),x) | Решение уравнения ![]() ![]() |
fsolve(f(x),x) | Решение нелинейного уравнения ![]() ![]() ![]() |
diff(f(x),x[i]) | Процедура дифференцирования функции ![]() ![]() |
int(f(x),x[i]) | Процедура интегрирования функции ![]() ![]() |
int(f(x),x=a..b) | Вычисление определенного (![]() ![]() |
piecewise(f1,g1,…,fn,gn) | Определение кусочно-заданной функции в виде ![]() |
limit(f(x),x=x0,dir) | Нахождение предела функции ![]() ![]() |
Окончание табл.2.1.
справа) | |
discont(f(x),x) | Функция, возвращающая значения ![]() ![]() |
maximized(f(x), x=a..b) minimized(f(x), x=a..b) | Нахождение наибольшего и наименьшего значений функции ![]() ![]() |
ехtrema(f(x),{переменные}) | Нахождение безусловных экстремумов функции ![]() |
ехtrema(f(x),{g(x)}, {переменные}) | Нахождение условных экстремумов функции ![]() ![]() |
2.1. Дифференциальное исчисление функции одной переменной
Покажем, как применяется аппарат Maple при исследовании функции одной переменной. А график, построенный командой plot, будем использовать в качестве иллюстрации полученных результатов.
Пример 2.1. Провести полное исследование функции . Решение
Рабочий лист в среде Maple имеет следующий вид.
[> restart; f(x):=(3-x)*exp(x);
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
2.2. Дифференциальное исчисление функции многих переменных
В данном разделе рассмотрим применение аппарата Maple к вычислению частных производных и нахождению экстремумов функции многих переменных. Встроенная в ядро Maple функция дифференцирования diff применима к функции многих переменных
. Ее формат для вычисления частной производной
(
) имеет вид:
[> diff(f(x), x1$k1, …, xn$kn);
Пример 2.2. Дана функция . Найти частные производные первого и второго порядков, проверить справедливость равенства смешанных производных второго порядка.
[> z:=cos(x*x+y)-exp(x-y*y);
/задаем функцию/
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Безусловные экстремумы функции переменной
находятся с помощью встроенной процедуры ехtrema:
[> ехtrema(f(x),{},{переменные});
Однако эта функция, как мы увидим из примера, дает только точки, подозрительные на экстремум. Для точного ответа на вопрос об экстремуме необходимо исследовать функцию с помощью известного критерия Сильвестра.
Пример 2.3. Исследовать на безусловный экстремум функцию
.
Рабочий лист Maple имеет вид:
[> z:=2*x[1]^2-4*x[1]*x[2]+2*x[2]^2-x[1]^4-x[2]^4:
[> plot3d(z, x[1]=-2..2, x[2]=-2..2);
/строим график целевой функции/
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Согласно критерию Сильвестра точка является точкой максимума функции. Вторая точка
также является точкой максимума функции (матрица Гессе в ней имеет такой же вид).
Исследуем точку с помощью критерия Сильвестра.
[> x[1]:=0: x[2]:=0: Gesse; Delta[1]:=Gesse[1,1];
Delta[2]:=Gesse[1,1]*Gesse[2,2]-Gesse[1,2]^2;
[> restart;z:=2*x[1]^2-4*x[1]*x[2]+2*x[2]^2-x[1]^4-x[2]^4:
![]() ![]() ![]() |
Главный минор матрицы Гессе равен нулю, следовательно, необходимо проводить дополнительные исследования. Ниже показано, что при:
,
:
,
:
.
В достаточно малой окрестности точки функция меняет свой знак (при этом
), и точка
не является точкой экстремума.
[> x[1]:=0: z; solve(z>=0, x[2]);
![]() ![]() ![]() ![]() |
Условные экстремумы функции многих переменных
находятся с помощью той же процедуры ехtrema, только в фигурных скобках {} указываются ограничения (уравнения связи) на переменные
.
Известно, что задача на условный экстремум ставится так: найти точку условного экстремума (максимума или минимума) функции
, если на переменные
накладываются дополнительные ограничения (уравнения связи):
(
).
Пример 2.4. Найти точку условного экстремума функции
,
где переменные удовлетворяют уравнениям связи
Решение
Рабочий лист Maple имеет вид:
[> z:=x[1]*x[2]*x[3]; phi[1]:=x[1]+x[2]+x[3]-4;
phi[2]:=x[1]*x[2]+x[1]*x[3]+x[2]*x[3]-5;
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Далее с помощью достаточного признака условного экстремума выясняем, является ли
точкой условного экстремума. Для этого построим квадратичную форму второго дифференциала для функции Лагранжа в точке
:
,
где приращения переменных
связаны соотношениями
или в обозначениях Maple
(связь между найдем, решив соответствующую систему уравнений).
[> d2Ldx1dx1:=diff(L,x[1]$2); d2Ldx2dx2:=diff(L,x[2]$2);
d2Ldx3dx3:=diff(L,x[3]$2); d2Ldx1dx2:=diff(L,x[1],x[2]);
d2Ldx1dx3:=diff(L,x[1],x[3]); d2Ldx2dx3:=diff(L,x[2],x[3]);
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Учитывая, что , получаем
. Это означает, что
есть точка максимума для функции
, где переменные
удовлетворяют двум уравнениям связи
§ 3. Описание пакета LinearAlgebra
В Maple имеется пакет LinearAlgebra, ориентированный на решение задач линейной (матричной) алгебры. Он загружается соответствующей командой:
[> with(LinearAlgebra);
После выполнения этих команд система выводит на экран список процедур и функций, которыми располагает пакет LinearAlgebra.
Пакет LinearAlgebra является более мощным и совершенным по сравнению с linalg (в ранних версиях программы). Он предназначен для работы с матрицами и векторами больших размеров. Самым простым образом матрицу размером
в пакете LinearAlgebra можно сформировать при помощи команды
[> Matrix(m, n, [[a[1,1],…,a[1,n]],…,[a[m,1],…,a[m,n]]]);
Приведем в табл. 3.1 назначение наиболее часто применимых процедур и функций пакета LinearAlgebra. Более полную информацию о каждой процедуре или функции можно узнать в справке, или набрав команду
[> help(имя_процедуры);
Таблица 3.1.
Название процедуры, функции | Назначение процедуры, функции |
Basis | Определяет базис для векторного пространства, заданного системой векторов |
CharacteristicMatrix | Создает для квадратной матрицы ее характеристическую матрицу |
CharacteristicPolynomial | Создает для квадратной матрицы ее характеристический многочлен |
Determinant | Вычисляет для квадратной матрицы ее определитель |
DiagonalMatrix | Создает диагональную матрицу |
Eigenvalues | Вычисляет для квадратной матрицы ее собственные значения (собственные числа) |
Eigenvectors | Вычисляет для квадратной матрицы ее собственные векторы (рекомендуется использовать вместе с процедурой Eigenvalues) |
LinearSolve | Решает систему линейных алгебраических уравнений (СЛАУ) в матричной форме |
MatrixAdd | Процедура сложения двух матриц |
Matrixlnverse | Процедура нахождения обратной матрицы |
MatrixMatrixMultiply | Процедура произведения двух матриц |
MatrixNorm | Функция вычисления нормы матрицы |
MatrixScalarMultiply | Процедура умножения матрицы на скаляр |
MatrixVectorMultiply | Процедура умножения матрицы на вектор |
Minor | Вычисляет минор матрицы |
Normalize | Нормализует вектор |
NullSpace | Возвращает нуль-пространство (ядро) матрицы |
Rank | Вычисляет ранг матрицы |
SylvesterMatrix | Конструирует матрицу Сильвестра из многочленов |
Transpose | Вычисляет матрицу, транспонированную к данной |
Приведем примеры решения наиболее часто встречающихся задач линейной алгебры (исследование систем линейных алгебраических уравнений на совместность, вычисление собственных векторов и чисел матриц).
Пример 3.1. Исследовать СЛАУ с параметром (СЛАУ задана своей расширенной матрицей) и решить в каждом случае:
.
Ниже приведен текст рабочего листа по решению данной задачи (с описаниями по ходу выполнения команд).
[> restart; with(LinearAlgebra):
/задаем вектор-столбцы основной матрицы/
[> a1:=Vector([2,1,3]); a2:=Vector([lambda+1,lambda,-3]);
a3:=Vector([lambda-2,-3,-7]);
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Пример 3.2. Найти собственные числа и соответственные собственные векторы матрицы
.
Текст рабочего листа по решению задачи имеет вид:
[> restart; with(LinearAlgebra):
[> A:=Matrix(3,3,[[3,-6,9],[1,-2,3],[-3,6,-9]]);
/задание исходной матрицы/
![]() ![]() ![]() ![]() ![]() ![]() |
§ 4. Описание пакета Optimization
Пакет Optimization, входящий в состав Maple, предназначен для решения оптимизационных задач. Он загружается в память с помощью команды
[> with(Optimization);
Как видно, в состав этого пакета входят 8 процедур и функций. Описание наиболее важных из них приведено в табл. 4.1.
Таблица 4.1.
Название процедуры, функции | Назначение процедуры, функции |
Interactive | Решение оптимизационной задачи с выводом процесса решения в интерактивном виде |
LPSolve | Решение задачи линейного программирования. Процедура равносильна решению задачи с использованием пакета simplex(см. §5) |
Maximize | Процедура вычисления максимума целевой функции |
Minimize | Процедура вычисления минимума целевой функции |
NLPSolve | Решение задачи нелинейного программирования |
QPSolve | Решение задачи квадратичного программирования |
Пусть даны целевая функция переменной
(
– управляющие переменные,
) и система из
ограничений, выраженных неравенствами (равенствами)
(4.1)
Ниже приведены варианты использования процедуры Maximize при решении различных оптимизационных задач:
[> Maximize(object_function);
процедура нахождения наибольшего значения целевой функции при любых значениях управляющих переменных (решается задача на безусловный экстремум:
,
);
[> Maximize(object_function, { constr});
процедура нахождения наибольшего значения целевой функции при выполнении системы ограничений {constr} (решается задача на условный экстремум:
,
,
);
[> Maximize(object_function, { constr}, assume=nonnegative);
процедура нахождения наибольшего значения целевой функции при выполнении системы ограничений {constr} (решается задача на условный экстремум:
,
,
).
Здесь object_function – целевая функция , {constr} – список ограничений вида (4.1), параметр assume=nonnegative означает, что задача решается в области неотрицательных значений управляющих переменных.
Процедура NLPSolve во многих случаях описывается одним из следующих способов:
[> NLPSolve(object_function, initialpoint={x[1]=a1, x[2]=a2,
…, x[n]=an}, maximize );