- •Глава 2. Основные понятия и конструкции системы
- •2.1. Алфавит и синтаксис Maple-языка
- •2.2. Последовательности выражений
- •2.3. Операторы оценивания выражений
- •2.4. Извлечение операндов выражений
- •2.5. Наборы и операции с наборами
- •2.6. Списки и операции со списками
- •2.7. Типы объектов и выражений
- •2.8. Преобразование типов выражений
- •2.9. Имена переменных
- •2.10. Типы переменных
- •2.11. Оператор присваивания
- •2.12. Отмена операции присваивания
- •2.13. Ограничение значений переменных
- •2.14. Операторы
- •2.15. Математические функции
- •2.16. Операции с формулами и выражениями
- •2.17. Операции с полиномами
- •2.18. Массивы, векторы и матрицы
- •2.19. Строковые переменные
- •Упражнения
- •Глава 3. Операции и функции математического анализа
- •3.1. Вычисление сумм и рядов
- •3.2. Вычисление произведений членов некоторой последовательности
- •3.3. Вычисление производных
- •3.4. Вычисление пределов
- •3.5. Интегрирование выражений
- •3.6. Разложение функций в ряды
- •3.7. Нахождение экстремумов, максимумов и минимумов функций
- •3.8. Анализ функций на непрерывность
- •Упражнения
- •Глава 4. Решение уравнений и неравенств
- •4.1. Основные понятия и конструкции
- •4.2. Решение одиночных уравнений
- •4.3. Решение систем алгебраических уравнений
- •4.4. Присваивание значений полученных решений
- •4.5. Поиск корней полиномов
- •4.6. Решение тригонометрических уравнений
- •4.7. Решение неравенств
- •4.8. Решение функциональных уравнений
- •4.9. Решение рекуррентных уравнений
- •4.10. Численное решение уравнений и систем
- •4.11. Решение дифференциальных уравнений
- •Упражнения
2.13. Ограничение значений переменных
Диапазон значений переменных или выражений определяется их типом. Для введения ограничений на возможные значения переменных (выражений) используется функция вида
assume(x, prop) .
Здесь х – имя переменной (выражения), prop – задаваемое ограничение (свойство), пара x, prop может быть заменена одним соотношением. Этот оператор может использоваться для определения области допустимых значений переменной x. Введение ограничений изменяет реквизиты переменной и связи между переменными. Например, оператор assume(a>0) устанавливает, что значениями переменной а могут быть положительные вещественные числа. Все дальнейшие операции над выражениями (упрощение выражений и т.д.), содержащими эту величину, будут производиться с учетом введенных ограничений. Например, чтобы определить, что a<х<b, можно записать, assume(a<x, x<b). Кроме того, неявно этот оператор определяет, что a<b.
Когда относительно выражения x используется функция предположения, все предыдущие предположения об объектах в x уничтожены. Например, если вначале стоит оператор assume(x > 0), а затем позже assume(x<0), то второй отменяет ограничения, сделанные в первом.
Переменные, множество значений которых оговорено оператором assume, называют предполагаемыми (по аналогии с высказыванием, используемым в математике: "Пусть a>0"). При выводе имен таких переменных система может помечать (или не помечать) их тильдой ~ (см. описание меню OptionAssumed Variables).
Один оператор assume задаёт одно свойство для одной переменной. Для задания дополнительных свойств используется оператор вида
additionally(x,prop) .
Синтаксис этой функции аналогичен. Эта функция добавляет к уже имеющимся ограничениям или свойствам переменной x новые.
Например, чтобы сообщить системе, что 0<x<1 можно так: assume(x>0); additionally(x<1); .
Предположения, сделанные относительно имен могут быть уничтожены одним из способов, описанных в разделе "Отмена операции присваивания".
Множество значений предполагаемой переменной х можно посмотреть функцией вида about(x).
Примеры:
1) x – положительно определенная величина.
> assume(x,positive); или > assume(x>0);
> about(x);
Originally x, renamed x~:
is assumed to be: RealRange(Open(0),infinity)
2) Если значения переменной ограничиваются отрезком [-5,5], то это можно записать так:
> assume(a>=-5); additionally(a<=5); about(a);
Originally a, renamed a~:
is assumed to be: RealRange(-5,5)
Ограничивая значения параметров уравнений и неравенств, можно получать различные их решения. Например, решение уравнения x2=a зависит от знака правой части. Фрагмент программы, иллюстрирующий этот пример может выглядеть так:
> eq:=x^2=a: assume(a>=0); solve(eq, x);
1/2 1/2
a~ , -a~
> a:=evaln(a): assume(a<0); solve(eq, x);
1/2 1/2
I (-a~) , -I (-a~)
2.14. Операторы
Операторы, совместно с операндами, служат для конструирования выражений. С другой стороны, операторы можно рассматривать, как данные абстрактного типа.
Часть операторов уже определена в системе, а часть может задаваться пользователем. К числу последних относятся функциональные, процедурные и определяемые оператором define.
Все операторы системы разделяются на следующие типы.
К бинарным (binary) операторам, определенным для двух операндов, относятся операторы, представленные в таблице 1.
Таблица 1. Бинарные операторы
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление |
** или ^ |
возведение в степень |
mod |
вычисление модуля |
$ |
оператор последовательности |
:= |
присваивание |
@ |
оператор композиции |
@@ |
повторение композиции |
.. |
задание области (интервала) |
&string |
нейтральный оператор |
&* |
некоммутативное умножение |
. |
разделительная точка |
\ и . |
конкатенация (объединение) |
, |
разделитель выражений |
Логические бинарные операторы |
|||
< |
меньше |
<= |
меньше или равно |
> |
больше |
>= |
больше или равно |
= |
равно |
<> |
не равно |
and |
логическое и |
or |
логическое или |
Бинарные операторы объединения, пересечения и исключения для множеств |
|||
union |
включение элементов первого операнда во второй, оба операнда – множества |
||
intersect |
пересечение множеств |
||
minus |
исключение из первого множества элементов второго |
||
Унарные (unary) операторы, определенные для одного операнда, делятся на префиксные – стоящие перед операндом, и постфиксные – стоящие после операнда, табл.2.
Таблица 2. Унарные операторы
+ |
Унарный плюс |
- |
унарный минус |
! |
Факториал |
. |
десятичная точка |
$ |
Последовательность |
not |
логическое отрицание |
% |
Метка |
|
|
Нульарные (nullary) операторы, операторы без операндов, представлены в системе одной, двумя или тремя парами кавычек (%, %%, %%%).
Нейтральные (neutral) операторы определяются пользователями по следующим правилам:
1) обозначение нейтрального оператора состоит из символа & (амперсанда), за которым следует последовательность допустимых в Maple символов алфавита или специальных символов (не алфавитных и не числовых). Из специальных символов исключены _ (символ подчеркивания), & , | , ( , ) , [ , ] , { , } , ; , : , ' , ` , # , <пробел> ;
2) максимальная длина имени такого оператора - 495 символов.
Нейтральный оператор генерирует формальное обращение к функции с именем нейтрального оператора. По старшинству эти операторы являются вторыми после десятичной точки и оператора . (точка).
Примеры нейтральных операторов
> a &* b;
a &* b
Следующее определение нейтрального оператора содержит специальный символ и символ после знака амперсанда, что вызывает синтаксическую ошибку.
> &?1 a;
on line 50, syntax error, missing operator or `;`:
&?1 a;
^
> a * b &+ c;
a (b &+ c)
> &-(a,b,c,d);
&-(a, b, c, d)
> a &xx b - &xx(a,b);
0
Ещё один тип – функциональные (functional) операторы. Функциональный оператор задаётся выражением вида
(v1, v2, …, vn)->(f1, f2, …, fn).
Здесь v1, v2, …, vn – переменные, f1, f2, …, fn – результаты действия функционального оператора.
Примеры:
1) Функцию y=x2 можно рассматривать как оператор, ставящий в соответствие каждому х значение х2:
> f:=x->x^2: f(2);
4
2) Оператор, ставящий в соответствие каждому t пару cos(t), sin(t) можно записать так:
> f:=t->(cos(t),sin(t)): f(0); f(Pi);
1, 0
-1, 0
3) > f:=(x,y,z)->(sin(x),cos(y),z): f(1.,1,1);
.8414709848, cos(1), 1
Для создания функциональных операторов можно использовать функцию вида
unapply(a,x1,...,xn).
Здесь a – математическое выражение, x1,...,xn – переменные. Эта функция преобразовывает указанное математическое выражение в функцию от указанных переменных.
Пример:
> f:=unapply([x*sin(t),cos(x-1)/x],x, t);
Для создания композиции функций f и g используется оператор композиции вида f@g. Результатом является сложная функция f(g).
Например,
> (ln@sin)(x);
ln(sin(x))
Для создания n-кратных композиций функции f используется оператор вида f@@n. Такой оператор удобно использовать для создания цепных дробей.
Например,
> f:=x->1/(1+x): (f@@3)(x);
Любое выражение вида f(x) считается неопределенным оператором, если f(x) никак не было определено ранее. Такой оператор не выполняет никаких действий. Если он встречен в строке ввода, то в строке вывода он просто повторяется.
Например,
>f(x)+g(y);
f(x) + g(y)
По порядку старшинства все операторы языка программирования расположены в порядке убывания приоритета следующим образом:
. (лево-ассоциативный оператор)
% (не ассоциативный оператор)
$-operators (лево-ассоциативный оператор)
! (лево-ассоциативный оператор)
^ или **, @@ (не ассоциативные операторы)
*, &*, /, @, intersect (лево-ассоциативные операторы)
+, -, union, minus (лево-ассоциативные операторы)
mod (не ассоциативный оператор)
.. (не ассоциативный оператор)
<, <=, >, >=, =, < > (не ассоциативные операторы)
$ (не ассоциативный оператор)
not (право-ассоциативный оператор)
and (лево-ассоциативный оператор)
or (лево-ассоциативный оператор)
- > (право-ассоциативный оператор)
, (лево-ассоциативный оператор)
: = (не ассоциативный оператор)
Обратите внимание, что операторы возведения в степень ^, **, и повторения композиции @@ определены как не ассоциативные и, следовательно, оператор a^ b ^c недопустим. В этих случаях необходимо использовать круглые скобки.
Оценка выражений, содержащих логические операторы, осуществляется следующим образом. Вначале всегда оценивается левый операнд операторов and и or. Затем, если истинность всего выражения может быть получена из оценки значения левого операнда, то оценка правого операнда не производится.
Для эволюционирования логических выражений используется функция вида
evalb(expr),
возвращающая значение true или false.
Справку об имеющихся в системе операторах можно посмотреть командой
> ?operators ;
а справку о каждом из перечисленных типов и старшинстве операторов можно посмотреть одной из команд:
> ?operators[binary]
> ?operators[unary]
> ?operators[functional]
> ?operators[nullary]
> ?neutral
> ?operators[precedence]
