Программирование: логика, циклы, процедуры

Как написать свою программу в Maple, используя логику, циклы и процедуры

Версия для печати

Логика: 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, но они в основном используются внутри циклов и процедур, о которых кратко поговорим ниже.

Задача 8.1 о кубическом β-сплайне

Примените кусочную конструкцию 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.

Задача 8.2 о работе команды piecewise

Эта задача – пример неправильной работы piecewise, когда лучше применять if...end if.

Примените if...end if для построения графика синуса от –2π до 2π, в котором максимумы/минимумы обрублены на высоте/глубине 0.9/–0.9 соответственно. Для этого удобны команда signum и старый друг evalf. Обратите внимание, что вместо применения логики для горизонтали графика (по x), как в примере о piecewise, надо применять логику для вертикали (по y).