Логика: if-then-else-end if
Основная команда логики Maple – это if.
Пример: напишем функцию f(x), которая, получив значение x, возвращает –1, если x < 0; 0, если x = 0; +1, если х > 0 (step-функция).
- restart;
- f:=x-> if x<0 then -1 elif x=0 then 0 else 1 end if;
Вот тест для проверки:
- f(-.5);f(0);f(.5);
(Заметим, что это то же самое, что функция Maple signum.)
Замечание. Такой способ построения функций с помощью if-then-elif-else-end if не работает хорошо в Maple. Лучше всего применять другую конструкцию – piecewise, которая будет показана ниже.
Применим более сложную форму if-then-elseif, чтобы показать, как она используется в логических выражениях.
Определяющие эту конструкцию операторы воспринимаются (почти) как чисто английские слова: elif – это «elseif» , а end if имеет смысл «работа окончена». В оператор входят три элемента:
Первый – логические команды if ... then, elif ... then, else и end if. Порядок их записи важен.
Второй элемент – условный оператор (оператор логической проверки, вроде x < 0 и т. п). В Maple допустимы следующие логические проверки:
< | > | = |
<= | >= | <> не равно |
При получении Maple такого условия оно вычисляется как логическое выражение, значением которого может быть true или false. Для помощи в его отладке есть команда вычисления логических (Boolean) выражений evalb. Она работает так:
- evalb(7>5);evalb(3=4);evalb(3<>4);
Выясним смысл результатов исполнения команды. Отметим, что and, or и not можно использовать для комбинирования логических операторов: -2<=x and x<=-1. Есть еще особенности, которые можно увидеть по запросам ?if и ?boolean.
Третий элемент if – это набор исполняемых операторов. В примере выше – это просто числа –1, 0, 1, хотя годится любое синтаксически правильное выражение. Например, можно построить функцию, которая принимает одно значение для отрицательных чисел, а другое – для положительных:
- g:=x-> if x<0 then 1/(1+x^2) else cos(x) end if;
Проверьте, что в ней нет ошибок:
- g(-1.5);g(2.5);
OК, на выходе получаем числа. Но посмотрите, что получится, если затребовать:
- g(Pi);
Такие ошибки надо уметь интерпретировать. Машина говорит, что устала вычислять g, но когда в конце концов выполнит вычисления, окажется, что одно из Boolean-выражений невозможно вычислить. Это получилось, потому что Pi не является истинным числом в Maple, а мы сравниваем число 0 и не-число Pi. (Pi в Maple – это более идея, чем число.) Ту же самую ошибку получите, если попытаетесь вычислить g(a), где a еще не имеет численного значения.
- g(a);
Проблему с Pi можно исправить, применив evalf(Pi), чтобы получить его численное значение:
- g(evalf(Pi));
Теперь нарисуем функцию и посмотрим на нее:
- plot(g(x),x=-10..10);
Опять не та логика! Что же не так?
Конечно же, применяя оператор if с таким синтаксисом, Maple не может нарисовать g(x). Очевидно, что в команде plot при передаче x в g само x – еще не число. Чтобы разобраться, посмотрим, что происходит с оператором g:=x->... в процедуре. Maple строит ее в «операторном представлении», означающем невозможность применения конструкции g(x), x= -10..10 для команды plot. В записи команды х надо опустить, как ниже:
- plot(g,-10..10);
g можно продифференцировать с помощью команды D:
- D(g);
Но если попытаться проинтегрировать, получится неразрешимая ошибка:
- int(g(x),x=-2..2);
Причина ошибки – сложность синтаксиса if-then-else-end if, который не очень удобен для определения функций Maple. Но кусочные функции, вроде g, очень важны, поэтому нужен «чистый» способ работы с ними. К счастью, есть команда piecewise, которая именно для этого и используется. Применим ее для переопределения функции g(x):
- g:=x->piecewise(x<0, 1/(1+x^2),x>=0, cos(x));
Теперь это действительно функция, которую можно построить как функцию:
- plot(g(x),x=-5..5);
интегрировать как функцию:
- int(g(x),x=-5..5);
и дифференцировать как функцию:
- diff(g(x),x);
Этот способ построения кусочных функций лучше, чем if-then-elif-end if, но они в основном используются внутри циклов и процедур, о которых кратко поговорим ниже.
Примените кусочную конструкцию Maple для построения функции, которая вычисляет так называемый кубический β-сплайн и строит его на отрезке t = –4..4. Функция B(t) определяется так:
если t в диапазоне –2.. –1;
если t в диапазоне –1..0;
если t в диапазоне 0..1;
если t в диапазоне 1..2.
Если t вне области –2..2, B(t) = 0.
Для указания границ области, к примеру от –1 до 0, надо комбинировать два неравенства: b < a < c. В Maple применяется and, сочетающий два разных условия: b<a and a<c.
Если функция определена, нарисуйте ее график между –4 и 4.
Проинтегрируйте B(t) в интервале –3..3.
Нарисуйте его первые три производные в интервале –3..3.
Эта задача – пример неправильной работы piecewise, когда лучше применять if...end if.
Примените if...end if для построения графика синуса от –2π до 2π, в котором максимумы/минимумы обрублены на высоте/глубине 0.9/–0.9 соответственно. Для этого удобны команда signum и старый друг evalf. Обратите внимание, что вместо применения логики для горизонтали графика (по x), как в примере о piecewise, надо применять логику для вертикали (по y).