Операторы во входном языке и языке программирования Maple служат для конструирования выражений. Формально операторы представлены своими идентификаторами в виде специальных математических знаков, слов и иных имен. Операторы, как это вытекает из их названия, обеспечивают определенные операции над данными, представленными операндами.
Имеется пять основных типов операторов:
Для просмотра операторов и их свойств можно использовать следующие команды:
> ?operators[binary];
> ?operators[unary];
> ToperatorsCnullary];
> ?operators[precedence];
> ?operators[functional]:
А для изучения примеров применения операторов нужно задать и исполнить команду:
> ?operators[examples];
Команда:
> Tdefine:
позволяет ознакомиться с функций define. С ее помощью можно определять новые операторы.
Бинарные (инфиксные) операторы
Бинарные (инфиксные) операторы используются с двумя операндами, обычно размещаемыми по обе стороны от оператора. В ядро Maple 7 включено около трех десятков бинарных операторов. Основные из них перечислены в табл. 6.1.
Tаблица 6.1. Бинарные операторы
Обозначение |
Оператор |
+ |
Сложение |
- |
Вычитание |
* |
Умножение |
/ |
Деление |
** или ^ |
Возведение в степень |
mod |
Остаток от деления |
$ |
Оператор последовательности |
. |
Разделительная точка |
@ |
Оператор композиции |
@@ |
Повторение композиции |
, |
Разделитель выражений |
:= |
Присваивание |
. .. |
Задание интервала |
/ |
Разделитель выражений |
&* |
Некоммутативное умножение |
&<string> |
Нейтральный оператор |
|| |
Конкатенация (объединение) |
Примеры использования бинарных операторов:
Оператор композиции @@ может использоваться для создания сложных функций, содержащих цепные дроби:
А вот еще один пример применения этого оператора для составления цепного радикала и вычисления ряда таких цепочек в цикле:
Операторы объединения, пересечения и исключения для множеств
Для данных типа «множество» определены следующие бинарные операторы:
В любом случае, в результирующем множестве устраняются повторяющиеся элементы. Действие этих операторов поясняют следующие примеры:
Напоминаем, что эти операторы заданы ключевыми словами. Обратите внимание на то, что в Maple 7 результат применения оператора union представлен членами, расположенными в довольно произвольном порядке.
Унарные арифметические операторы
Унарные операторы используются с одним операндом. Они могут быть префиксными, если оператор стоит перед операндом, и постфиксными, если он стоит после операнда. К унарным относятся семь операторов, приведенных в табл. 6.2.
Таблица 6.2. Унарные операторы
Обозначение |
Оператор |
+ |
Унарный плюс (префикс) |
- |
Унарный минус (префикс) |
; |
Факториал (постфикс) |
. |
Десятичная точка (префикс или постфикс) |
$ |
Последовательность (префикс) |
not |
Логическое отрицание (префикс) |
&string |
Метка (префикс) |
Примеры применения унарных операторов:
Мы уже неоднократно отмечали, что оператор % обеспечивает подстановку в строку ввода (или в выражение) последнего результата операции, Х% — предпоследнего и %%% — третьего с конца. Есть еще одна иногда полезная возможность проследить за ходом частных вычислений внутри документа — применение команды-функции history. В Maple V R5 это была библиотечная функция, которая требовала вызова из библиотеки. В Maple 7 такого вызова уже не требуется. Функция history (ехрr) или history() создает список переменных вида от, где индекс f = 1, 2, 3.... Этим переменным можно присваивать значения в диалоговом режиме и отслеживать результаты вычислений. Команда off;, вводимая после использования данной функции, завершает работу с ней. Ниже представлен диалог с применением функции history:
К сожалению, полученный результат и значения глобальных переменных 01 после завершения работы с данной функцией становятся недоступными, так что практической пользы от ее применения не так уж много. Разумеется, внутри блока history вы можете присвоить результат другой переменной и он сохранится (попробуйте это сделать сами). При каждом очередном применении функции history нумерация переменных 0i начинается с начала, так что какой-либо преемственности при использовании этой функции нет.
Функция history может применяться в качестве средства начальной отладки вычислений. Внутри фрагмента программы, заданного функцией history, можно задавать построения графиков. Например, при исполнении фрагмента программы:
будет построен график синусоиды. В целом работа с функцией history отличается не слишком высокой стабильностью, так что возможности этой функции пока остаются не слишком востребованными.
Логические (или булевы) операторы указывают на логическую связь величин (или выражений). Прежде всего они представлены рядом бинарных операторов, приведенных в табл. 6.3.
Таблица б.З. Бинарные логические операторы
Обозначение |
Оператор |
< |
Меньше |
<» |
Меньше или равно |
> |
Больше |
>= |
Большее или равно |
- |
Равно |
О |
Не равно |
and |
Логическое «и» |
or |
Логическое «или» |
Конструкции с этими операторами, такие как х=у, возвращают логическое значение — константу true, если условие выполняется, и false, если оно не выполняется. Кроме того, к логическим операторам относится унарный оператор not — он представляет логическое «нет». Для возврата логических значений выражений с этими операторами используется функция evalb(условие), например:
Логические операторы часто используются в управляющих структурах программ, составленных на языке программирования Maple. Такое их применение мы рассмотрим позже.
Операторы в Maple описывают операции по преобразованию данных, в частности выражений. Последние, в свою очередь, можно отнести к данным абстрактного типа. Могут быть описаны следующие типы операторов:
Оператор относится к неопределенным, если он не был заранее определен. Такой оператор не выполняет никаких действий и просто повторяется в строке вывода:
> restar:f(1,2,а):
f(l,2,a)
Композиционные операторы (на базе знака @) мы уже применяли. Другие типы операторов рассмотрены ниже.
Функциональные операторы Maple-языка являются альтернативами функций и записываются в двух формах.
Нотация |
Запись оператора |
«arrow» (стрелочная) |
vars -> result |
«angle bracket» (в угловых скобках) |
<result | vars> |
Данные операторы могут использоваться для реализации подстановок. Например, запись х -> х^2 означает подстановку х*2 на место переменной х. Возможны и такие подстановки в множественной форме:
Функциональный оператор в Maple 7 часто используется для задания функций пользователя, которое будет рассмотрено несколько позднее.
Нейтральные операторы, определяемые пользователем
Для создания нейтральных (задаваемых пользователем и в момент задания неисполняемых) операторов, определяемых пользователем, служит знак амперсанда — &. Синтаксис нейтрального оператора следующий:
&name
Имя оператора строится по правилам задания допустимых идентификаторов. Также в качестве имени может быть использована последовательность (один и более) специальных символов. В последовательности специальных символов не должно быть букв, цифр, подчеркивания, а также следующих символов:
& | () {} [] :: '' # <перевод строки> <пробел>
Максимальная длина имени — 495 символов. Нейтральные операторы могут быть унарными и бинарными. Примеры задания бинарного нейтрального оператора приведены ниже:
Определение операторов с помощью оператора define
Большие возможности для создания операторов с заданными свойствами предоставляет специальный оператор define. Он записывается в следующей форме:
define(oper, propertyl, property2. ._)
Здесь ореr — имя определяемого оператора, property!, property2 и т. д. — наименования свойств. В принципе, оператор define позволяет создавать операторы с новыми свойствами, которые отсутствуют у операторов и функций, встроенных в систему.
Могут быть указаны следующие свойства операторов:
Следующий пример задает линейный оператор L:
Для задания некоторых свойств операторов можно использовать уравнения и соотношения вида f(x)=value. Чтобы свойство выполнялось для всех аргументов (или некоторого класса аргументов), используется описание forall. Так, приведенный ниже пример задает оператор F, который вычисляет n-е число Фибоначчи (n > 2):
Обратите внимание на то, что соотношения fib(0)=l и fib(l)=l задают начальные значения целочисленного массива чисел Фибоначчи, которые нужны для реализации обычного итерационного алгоритма их нахождения, — напоминаем, что очередное число Фибоначчи равно сумме двух предшествующих чисел Фибоначчи.
Последний пример иллюстрирует применение системной функции time для определения времени, затраченного на вычисление значения функции fib(20). Это время задается в секундах. Нетрудно заметить, что даже для ПК с процессором Pentium II 350 МГц это время оказалось довольно значительным (более 3 с), поскольку каждое новое число Фибоначчи вычисляется заново.
Maple 7 имеет полный набор элементарных математических функций. Все они, кроме арктангенса двух аргументов, имеют один аргумент х, например sin(x). Он может быть целым, рациональным, дробно-рациональным, вещественным или комплексным числом. В ответ на обращение к ним элементарные функции возвращают соответствующее значение. Поэтому они могут быть включены в математические выражения. Все описанные здесь функции называются встроенными, поскольку они реализованы в ядре системы.
Как правило, если аргументом функции является фундаментальная константа, целое или рациональное число, то функция выводится с таким аргументом без получения результата в форме действительного числа с плавающей точкой. Например:
Нетрудно заметить, что есть и исключения из этого правила — например, на экране монитора ехр(1) будет выведено как константа е, а значение функции arcsin( 2) все же вычислено и результат получен как 1/6 от константы Pi. Вообще говоря, если результат выражается через фундаментальную математическую константу, то он будет вычислен и представлен ею. В противном случае функция с целочисленным и рациональным аргументом или с константой просто повторяется в строке вывода в установленном для этой строки формате.
Для получения подробной информации о некоторой произвольной функции <f> достаточно задать команду:
?<f>
Ввиду общеизвестности элементарных функций мы не будем обсуждать ни их свойства, ни допустимые для них пределы изменения аргумента.
Некоторые целочисленные функции и факториал
Ниже представлены наиболее распространенные целочисленные функции Maple 7, используемые в теории чисел:
Примеры применения:
В последних двух примерах применения оператора факториала полезно обратить внимание, что запись n!! означает лишь (n!)!, а не n!! = 2*4*6*..., то есть произведение четных целых чисел. Действие других функций очевидно.
В ядре Maple определены следующие тригонометрические функции:
Все эти функции являются периодическими (с периодом 2л, кроме тангенса и котангенса, у которых период равен л) и определены для действительного и комплексного аргументов. Примеры вычислений:
Многие свойства тригонометрических функций можно оценить, рассматривая их графики. Для построения таких графиков можно использовать функцию pi ot. На рис. 6.1 сверху показаны графики ряда тригонометрических функций.
Рис. 6.1. Графики ряда тригонометрических и обратных тригонометрических функций
Из графиков тригонометрических функций (рис. 6.1, сверху) хорошо видна их периодичность. Функция тангенса имеет разрывы, и ее значение в этих точках в пределе равно бесконечности. Поэтому для наглядного ее представления вместе с функциями синуса и косинуса (их экстремальные значения по модулю равны 1) приходится вводить ограничения на масштаб графика по оси у.
ПРИМЕЧАНИЕ
Обратите внимание на параметр color=black в функции построения графиков plot. Он задает построение всех графиков черным цветом, что сделано для более четкой печати их в книге. Если убрать этот параметр, то графики разных функций будут строиться с использованием разных цветов, что облегчит их различение. Другие способы выделения отдельных кривых будут описаны в дальнейшем при описании графических возможностей системы Maple 7.
Обратные тригонометрические функции
К обратным тригонометрическим относятся следующие функции:
Примеры вычислений:
К этому классу функций принадлежит еще одна полезная функция: arctan(y.x) = argument(x+I*y)
Она возвращает угол радиус-вектора в интервале от -Pi до Pi при координатах конца радиус-вектора х и у (см. пример ниже):
Графики ряда обратных тригонометрических функций показаны на рис. 6.1.
Гиперболические функции представлены следующим набором:
Примеры применения гиперболических функций представлены ниже:
На рис. 6.2 сверху представлены графики гиперболического синуса, косинуса и тангенса. По ним можно судить о поведении этих функций.
Рис. 6.2. Графики основных гиперболических и обратных гиперболических функций
ПРИМЕЧАНИЕ
В отличие от тригонометрических гиперболические функции не являются периодическими. Функция гиперболического тангенса имеет симметричную кривую с характерными ограничениями. Поэтому она широко используется для моделирования передаточных характеристик нелинейных систем с ограничением выходного параметра при больших значениях входного параметра.
Обратные гиперболические функции
Как и тригонометрические функции, гиперболические имеют свои обратные функции:
Примеры применения:
Графики обратных гиперболических синуса, косинуса и тангенса представлены на рис. 6.2 снизу.
Степенные и логарифмические функции
К степенным и логарифмическим относятся следующие функции системы Maple 7:
Примеры применения:
Графики ряда алгебраических функций показаны на рис. 6.3.
Рис. 6.З. Графики ряда алгебраических функций
На рис. 6.3 показаны также графики синусоиды с экспоненциально падающей и нарастающей амплитудой. Читателю рекомендуется попробовать свои силы в построении графиков комбинаций различных функций.
Функции с элементами сравнения
В алгоритме вычисления ряда функций заложено сравнение результата с некоторым опорным значением. К таким функциям относятся:
Для комплексного аргумента х эти функции определяются следующим образом:
Для введения определения значения floor(x) от комплексного аргумента прежде всего запишем а = Re(x) - fооr(Re(x)) и b = Im(x) - floor(Im(x)). Тогда flооr(x) = floor(Re(x)) + I*floor(Im(x)) + X, где
Наконец, функция ceil для комплексного аргумента определяется следующим образом:
cell(x) = -fооr(-х)
Примеры применения:
Функции комплексного аргумента
Для комплексных чисел и данных, помимо упомянутых в предшествующем разделе, определен следующий ряд базовых функций:
Примеры применения:
Специальные математические функции
Специальные математические функции обычно являются решениями линейных дифференциальных уравнений различного типа и выражаются в виде интегралов, не представимых через элементарные функции. Maple 7 имеет практически полный набор таких функций. Их представления можно найти в справочной литературе, а также в справочной базе данных Maple. В связи с этим ограничимся приведением названий наиболее важных специальных функций:
Ввиду большого числа специальных функций и наличия множества примеров их вычисления в справочной системе Maple 7 ограничимся несколькими примерами вычисления наиболее распространенных специальных функций. По их подобию читатель может опробовать в работе и другие специальные функции.
На рис. 6.4 даны примеры применения ряда специальных функций. Обратите особое внимание на первый пример. Он показывает, как средствами системы Maple 7 задается определение функций Бесселя. Показано, что функции Бесселя являются решениями заданного на рис. 6.4 дифференциального уравнения второго порядка. Maple 7 способна вычислять производные и интегралы от специальных функций.
Рис. 6.4. Примеры применения специальных функций
Еще несколько примеров работы со специальными функциями представлены на рис.6.5. Как видно из приведенных примеров, на экране монитора можно получить математически ориентированное представление специальных функций, обычно более предпочтительное, чем представление на Maple-языке или в текстовом формате. Записи функций при этом выглядят как в обычной математической литературе.
Рис. 6.5. Примеры работы со специальными математическими функциями
На рис. 6.5 показаны примеры разложения специальных функций в ряды и применения функции convert для их преобразования.
Много информации о поведении специальных функций дает построение их графиков. На рис. 6.6 показано построение семейства графиков функций Бесселя BesselJ разного порядка и гамма-функции. Эти функции относятся к числу наиболее известных. Если читателя интересуют те или иные специальные функции, следует прежде всего построить и изучить их графики.
Подробное описание специальных функций можно найти в справочниках [43-45] и в справочной базе данных Maple 7.
Рис. 6.6. Графики функций Бесселя и гамма-функции
Функции для работы с векторами и матрицами
Элементы векторов и матриц являются индексированными переменными, то есть место каждого элемента вектора определяется его индексом, а у матрицы — двумя индексами. Обычно их обобщенно обозначают как i (номер строки матрицы или порядковый номер элемента вектора) iij (номер столбца матрицы). Допустимы операции вызова нужного элемента и присваивания ему нового значения:
V[1] — вызов i-го элемента вектора V;
M[i, j] — вызов элемента матрицы М, расположенного на г-н строке в j-ы столбце;
V[i]:=x — присваивание нового значения х i-му элементу вектора V;
M[i,j]:=x — присваивание нового значения х элементу матрицы М.
Преобразование списков в векторы и матрицы
Прежде всего надо обратить внимание на то, что векторы и матрицы хотя и похожи на списки, но не полностью отождествляются с ними. В этом можно убедиться с помощью следующих примеров, в которых функция type используется для контроля типов множественных объектов (векторов и матриц):
Однако, используя функцию преобразования данных convert, можно преобразовывать одномерные списки в векторы, а двумерные — в матрицы. Функция type используется в следующих формах:
Здесь параметры vector и matrix используются для указания того, какой тип объекта проверяется.
ПРИМЕЧАНИЕ
Обратите внимание на то, что матрицы отображаются иначе, чем двумерные списки, без двойных квадратных скобок. Отображение вектора подобно отображению одномерного списка, поэтому здесь особенно важен контроль типов данных.
Важное достоинство систем компьютерной алгебры, к которым относится и Maple 7, заключается в возможности выполнения аналитических (символьных) операций над векторами и матрицами.
Приведем примеры операций над векторами:
В этих примерах используется функция evalm(M), осуществляющая вычисление матрицы или вектора М.
ПРИМЕЧАНИЕ
Рекомендуется перед проведением символьных операций с векторами и матрицами очистить память от предшествующих определений с помощью команды restart. Если какие-то элементы векторов или матриц были ранее определены, это может привести к очень сильным искажениям вида конечных результатов. Очистка памяти устраняет возможность ошибок такого рода.
Операции над матрицами с численными элементами
Над матрицами с численными элементами можно выполнять разнообразные операции. Ниже приведены основные из них:
ПРИМЕЧАНИЕ
Рекомендуется внимательно изучить эти примеры и попробовать свои силы в реализации простых матричных операций. Мы вернемся к гораздо более серьезному описанию матричных операций и функций в дальнейшем.
Символьные операции с матрицами
Ниже представлены примеры символьных операций, осуществляемых над квадратными матрицами одного размера:
Приведем еще ряд примеров выполнения символьных операций с одной матрицей:
Среди других функций для работы с матрицами полезно обратить внимание на функцию mар, которая применяет заданную операцию (например, функции дифференцирования diff и интегрирования int) к каждому элементу матрицы. Примеры такого рода даны ниже:
В результате возвращаются матрицы, каждый элемент которых представлен производной или интегралом. Аналогично можно выполнять над матрицами и другие достаточно сложные преобразования.
В дальнейшем мы продолжим изучение матричных функций и операций, включенных в пакеты Maple 7.
Функции для работы со строковыми данными
Контроль типа строковых данных
Напоминаем, что строковые данные представляются совокупностью любых символов в обратных апострофах, например *Привет* или `2+2`. Для контроля объектов на принадлежность к строковым данным служит функция type с параметром string:
Из приведенных примеров видно, что контроль строкового типа осуществляется не очень строго, — в частности, единичные символы рассматриваются как строковые и без заключения их в апострофы. В строках могут быть символы кириллицы, но гарантии в правильности обработки таких символов нет — надо мириться с тем, что Maple — англоязычная программа и ее возможности в поддержке других языков ограниченны.
Для интерактивного ввода строк можно использовать функцию readline(filename), задав в качестве имени файла terminal или опустив имя файла. В этом случае ввод строки осуществляется с клавиатуры компьютера:
> s:=read1ine(};
> Привет мой друг!
s:="Привет мой друг!"
ПРИМЕЧАНИЕ
Полезно обратить внимание на то, что запрос в ходе интерактивного ввода может быть сделан на русском языке (если установленный для запросов шрифт имеет символы кириллицы). Нужно также, чтобы и шрифт строки вывода содержал кириллицу, иначе в строке вывода будет типичная «абракадабра» — смесь непонятных символов.
Имеется ряд функций для работы со строками. Из них наиболее важны следующие:
Примеры применения этих функций (в виде продолжения ранее приведенных примеров) представлены ниже:
Эти функции дают достаточно средств для обработки данных строкового типа, которые можно применять не только для создания текстовых комментариев, но и для управления вычислительным процессом в программах.
Преобразование строки в математическое выражение
Часто возникает необходимость в интерактивном вводе математических выражений. Для ввода с запросом выражения используется функция readstat(promt), где promt — строка с текстовым комментарием. Пример ее применения дан ниже:
Альтернативой может стать ввод строкового выражения с последующим преобразованием его в математическое выражение с помощью функции parse:
Обратите внимание на то, что функция evaln не смогла вычислить строковое выражение `2+3` поскольку оно не является числовым типом данных. Однако функция parse преобразовала это выражение в числовое, что и привело к его вычислению.
В этом уроке мы научились: