Опубликован: 03.12.2012 | Доступ: свободный | Студентов: 1102 / 247 | Длительность: 16:43:00
Лекция 12:

Процедурное программирование

< Лекция 11 || Лекция 12: 1234

11.1.2. Функция Which

Хотя выражение в In[1] на рис. 11.3 работает эффективно и правильно (в чём мы убедились в In[2]), сама запись условий при помощи каскада условных операторов достаточно громоздка и крайне неудобна для восприятия.

Задать выполнение тех же самых действий при тех же самых условиях можно гораздо более простым способом — воспользовавшись оператором множественных альтернатив Which. Как уточняет Е. М. Воробьёв [1, с. 169], "условный оператор Which[test1,expr1,test2,expr2,...] имеет четное число 2n аргументов, среди которых n тестов testi и п выражений expri". При вычислении выражения Which[...] конечным результатом является результат вычисления первого из expri, для которого соответствующее условие testi возвращает True.

Зададим при помощи оператора Which новую пользовательскую функцию posByWhich, которая осуществляет те же действия, что и заданная при помощи If функция posByIf — см. In[1] на рис. 11.4. Результаты действия обеих функций (Out[2] на рисунках 11.3 и 11.4) полностью идентичны.

Задание алгоритма действий при помощи условного оператора Which

Рис. 11.4. Задание алгоритма действий при помощи условного оператора Which

Если все выражения test1 возвращают при вычислении False, значение выражения с заголовком Which равняется Null. Порой оказывается полезным в этом случае заставить Mathematica выполнять какое-либо действие, например, выводить сообщение. Для этих целей Е. М. Воробьёв [1, с. 169] предлагает в качестве последних двух аргументов функции Which добавить ещё одну пару test,expr, при этом вместо test следует указать выражение True, а вместо expr — требуемое действие.

В примере In[1] на рис. 11.5 мы задали условный оператор Which, задав в нём заведомо неверные условия. При попытке его вычислить мы даже не удостоились вывода на экран ячейки Out. В примере In[2] на том же рисунке к аргументам выражения Which[...] мы добавили ещё два — True и "какая-то ошибка". Теперь, заставив Mathematica вычислить вновь заданное выражение, мы всё-таки получили от программы ответ.

Если в процессе вычисления выражения Which[...] первые тесты вернули значение False, и дошла очередь до теста, которые имеет отличное от булевого значение, то редуцированное выражение Which[...] просто перепечатывается в ячейку Out (см. пример In[3] на рис. 11.5).

Подробней о функции Which см. книги Е. М. Воробьёва [1, с. 169] и П. Веллина и др. [14, с. 136–137].

Реакция оператора Which на нестандартные ситуации

Рис. 11.5. Реакция оператора Which на нестандартные ситуации

11.1.3. Функция Switch

Осуществлять ветвление вычислений, то есть, для одного и того же выражения возвращать при вычислении разные результаты, можно не только в зависимости от выполнения некоторых логических условий, но и в зависимости от вида самого выражения. Функция Switch[expr,patt1,expr1,patt2,expr2,...] вычисляет выражение expr1, если expr соответствует шаблону patt1, вычисляет expr2, если expr соответствует шаблону patt2 и т.д. Если выражение expr соответствует сразу нескольким шаблонам, вычисляется то выражение expri, подходящий шаблон которого patti проверяется раньше остальных.

В примере In[1] на рис. 11.6 мы определяем пользовательскую функцию powercheck одного аргумента, которая выясняет, является ли её аргумент символом в степени 1, 2, 3 или 4, и печатает соответствующее сообщение: первая степень, квадрат, куб, четвёртая степень. В примере In[2] мы проверяем действие нашей функции powercheck на нескольких примерах.

В предыдущем примере мы задали в качестве аргументов функции powercheck только такие выражения, которые соответствуют одному из шаблонов в её теле. В примере In[3] на рис 11.6 мы опробовали действие powercheck на выражении, шаблона для которого в её теле нет. В Out[3] в качестве результата мы получили переписанное в исходном виде входящее в тело функции powercheck выражение Switch[...].

Для того, чтобы функция Switch определённым образом реагировала на ситуацию, когда выражению expr не находится подходящего шаблона, например, выполняла выражение exprlast, то в качестве последних двух аргументов функции Switch добавляют выражение _,exprlast. В примере In[4] на рис 11.6 мы немного модифицируем нашу функцию powercheck, добавив в Switch пару новых аргументов. Теперь на отличное от символа в степени 1, 2, 3 или 4 выражение, введённое в качестве аргумента, функция powercheck будет выдавать сообщение "введите другое выражение".

Подробней о функции Switch см. книги Е. М. Воробьёва [1, с. 170–171] и П. Веллина и др. [14, с. 136–137].

Использование функции Switch для ветвления вычислений

Рис. 11.6. Использование функции Switch для ветвления вычислений

11.1.4. Функция Piecewise

Использование условных операторов оказывается непременным при задании кусочных математических функций. Специально для этих целей в Mathematica имеется функция Piecewise. В простейшем случае она задаётся как Piecewise[{{expr1,cond1},{expr2,cond2},...}]. При вычислении данной функции вычисляется выражение expr1, если выполняется условие cond1, вычисляется выражение expr2, если выполняется условие cond2 и т.д. Если ни одно из условий не выполняется, то результатом вычисления Piecewise является 0; для того, чтобы задать вместо 0 другое выражение otherexpr, следует указать его в качестве последнего аргумента функции Piecewise.

В примере In[1] на рис. 11.7 мы задаём математическую функцию одного аргумента x, которая возвращает -x, когда x<-1 и x2, когда x>1; в остальных случаях функция принимает значение 1. В In[2] мы строим график нашей зависимости от аргумента x.

П. Веллин и др. в книге [14, с. 138] при помощи Piecewise определяет функцию, возвращающую абсолютное значение аргумента. В In[3] на рис. 11.7 определим функцию abswal, имеющую то же назначение. В примерах In[4] и In[5] мы проверяем действие функции abswal на числе -5 и символе h. В последнем примере ячейка Out[5] содержит результат вычисления функции abswal[h] отдельно для отрицательного и положительного значений h. Результатом дифференцирования abswal[h] также является набор значений в зависимости от знака аргумента h — см. примере In[6].

Подробней о функции Piecewise см. книгу П. Веллина и др. [14, с. 138–139].

Задание кусочных функций при помощи Piecewise

Рис. 11.7. Задание кусочных функций при помощи Piecewise
< Лекция 11 || Лекция 12: 1234