![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Приклад. Определим пятую степень переменного х как именованную внешнюю функцию:
Определим пятую степень переменного х как именованную внешнюю функцию:
Обратите внимание, что выходной строки, соответствующей оператору In[2], нет, поскольку в нем использовано отложенное присвоение SetDelayed (: =). С заголовками внешних функций можно обращаться так же, как с заголовками встроенных функций. Например, Здесь Nest дает выражение, в котором функция power5 применяется к выражению (a+b) заданное количество раз (в примере три раза). Следующая функция вычисляет среднее арифметическое значение элементов списка:
Обратите внимание на то, что переменная, являющаяся результатом вычисления функции (в данном случае это mean), является глобальной.
Создайте функцию, которая вычисляет среднеквадратическое значение элементов списка.
Аналогично строятся и процедуры. Рассмотрим пример.
Процедуры обычно включают несколько функций (встроенных либо внешних). Эти функции – шаги процедуры – располагаются в соответствии с последовательностью, в которой они должны вычисляться, и отделяются одна от другой символом "; ". Создадим процедуру, которая выдает значение коэффициента полинома Обратите внимание на то, что при создании процедуры по такому шаблону, как в рассмотренном примере, само тело процедуры заключается в круглые скобки. Еще одно важное замечание. Выясним свойства внутренней переменной у той процедуры, которая создана.
в процедурах желательно всем внутренним переменным установить статус локальные. Для этого используется другая форма записи процедуры.
expr 1; expr 2; … последовательность выражений, которые нужно вычислить; она образует тело (body) процедуры; Module[{a, b, ….}, body ] процедура с локальными переменными a, b, …
Воспользуемся этой формой и построим процедуру:
MATHEMATICA сообщила, переменная у из процедуры cfex занимает место в памяти ЭВМ, тогда как переменная и после выполнения lcfex из памяти удалена.
Чистые (неименованные) функции Если внешняя функция, возникающая в определенном месте программы, больше нигде, кроме этого места не используется, то ей необязательно присваивать определенное имя. Такие функции, использующиеся только в одном месте программы и не являющиеся именованными, называют чистыми функциями. В системе MATHEMATICA есть несколько эквивалентных способов построения чистых функций. Для построения чистой функции используется встроенная функция Function (или в сокращенной записи &) с тремя форматами кодирования;
Function[x, body ] чистая функция, в которой х заменяется на любой заданный аргумент (т.е. х – локальная переменная), body тело функции, задаваемое выражением системы MATHEMATICA; Function[{x1, x2, …}, body ] чистая функция от нескольких аргументов; Function[ body ] или body & чистая функция, аргументы которой определяются как # или #1, #2, #3, …
Примеры. Это чистая функция, определяющая кубический корень аргумента. Здесь получен результат применения этой чистой функции к трем значениям аргумента, заданным списком. Ниже приведены две других формы задания той же чистой функции. Пример чистой функции от двух аргументов. С помощью приведенной чистой функции рассчитывается резонансная частота колебательного контура в МГц по заданным значениям емкости и индуктивности. Подобно тому как не нужно присваивать имя функции, если она далее в программе не используется, для чистой функции не обязательны явные обозначения аргументов (все это экономит память – курочка по зернышку). В этом случае, вместо аргументов, задаются " нумерованные слоты " # i. В системе MATHEMATICA символом # заменяется первый аргумент (можно обозначить и #1), а # п заменяет п -й аргумент. Правила таковы:
# первая переменная чистой функции; #n п -тая переменная чистой функции; # # последовательность всех переменных чистой функции; # #n последовательность переменных чистой функции, начиная с п -ой, кончая последней
* При использовании сокращенной формы для чистой функции важно не забыть поставит знак & (амперсанд), иначе MATHEMATICA не воспримет выражение как чистую функцию
Амперсанд имеет низкий приоритет, поэтому, можно писать выражение типа 1 + #1 & без скобок. Однако бывают ситуации, когда скобки необходимы. Для начала по принципу " Кашу маслом не испортить" ставьте их. Примеры. Здесь значения кубического четырехчлена с заданными коэффициентами от переменной х и постоянной 2 получены с помощью чистой функции (в короткой форме с амперсандом). Получили дифференциальное уравнение второго порядка. Разберитесь сами. Обратите внимание на первую строчку. Сдвоенный слот ## (SlotSequence) применяется, если количество аргументов заранее неизвестно. Краткая форма чистой функции удобна для задания критериев сортировки (функция Sort) и отбора (функция Select) элементов списка. Примеры на сортировку и отбор, приведенные ниже, разберите самостоятельно.
Есть специальные операторы, обеспечивающие применение какой-либо функции к выражению или к его частям. С некоторыми из них мы уже встречались. Apply[f, expr ] или f@@ expr – заменяет заголовок выражения expr на f. Напоминаю, что в системе MATHEMATICA замена заголовка производится не формально, а со смыслом. Это демонстрирует следующий пример: Здесь times – просто имя, а Times – это имя встроенной функции (произведение) и система действует в соответствии с этой встроенной функцией. В этом примере заголовок List (в неявном виде задан фигурными скобками) заменен на Plus. Часто при составлении программы возникает необходимость применить одну и ту же функцию последовательно несколько раз. Здесь мы рассмотрим операторы кратного применения функции только одного переменного.
Nest[f, x, n] дает выражение, в котором функция f применена к аргументу х последовательно п раз; NestList[f, x, n] дает список результатов применения f к аргументу х, начиная с 0, кончая п раз: {x, f[x], f[f[x]], …}; FixedPoint[f, x] применяет функцию f до тех пор, пока результат не перестанет изменяться (в пределах машинной точности); FixedPointList[f, x] дает список {x, f[x], f[f[x]], …}, который оканчивается, когда элементы перестают меняться; FixedPoint[f, x, SameTest-> comp ] оканчивает вычисление f, когда функция comp, примененная к двум последовательным результатам, принимает значение True
Примеры. Найдем приближенно корень уравнения Это значение получено после 10 итераций. Чтобы оценить погрешность, выведем все промежуточные результаты. Видим, что после 8-ой итерации произошла стабилизация шести знаков после десятичной точки. Обычно, заранее угадать необходимое количество итераций трудно. В этом случае можно ввести другой критерий остановки, например, потребовать, чтобы вычисления продолжались до тех пор, пока абсолютное значение разности результатов, полученных в i -ой и i +1-ой итерациях была меньше некоторой заданной величины. В этом случае решение задачи можно найти так: Здесь путем задания третьего аргумента функции FixedPoint затребована точность вычисляемого корня В следующем примере вычисляется список производных гауссова импульса до 4-го порядка, включительно и выводятся графики соответствующих функций. Мы уже знаем, что в выражении вида
Map[f, expr ] или f/@ относит f к каждому элементу первого уровня выражения expr; Map[f, expr, n] применяет f к элементам всех уровней выражения expr вплоть до п -го; Map[f, expr, {n}] применяет функцию f ко всем элементам п -го уровня выражения expr; MapAll[f, expr ] или f//@ применяет f ко всем подвыражениям выражения expr; MapAt[f, expr, n] применяет f к элементу, стоящему на позиции п; MapThread[f, {a1, a2, …}, {b1, b2, …}, …] дает
MapThread[f, { expr 1, expr 2, …}, n}, …] применяет f к частям выражений expri уровня п.
Примеры. В приведенном ниже примере функция Cos применяется сначала к элементам первого уровня, затем только к элементам второго уровня и, наконец, к элементам первого и второго уровней.
Здесь функция отнесена ко всем уровням вложенного списка. Функция Cos применена сначала только к первому члену выражения
Разберитесь самостоятельно.
Следующий пример показывает как этот оператор можно применить, например, к построению " списка" (нескольких) графиков, причем для каждого задать свои опции. В примере – это интервалы времени, на которых они строятся.
В заключение этой лекции нужно отметить следующее: во многих случаях MATHEMATICA позволяет существенно укоротить листинг программы и сделать ее более понятной. Покажу на простом примере. Пусть необходимо найти сумму корней первых 500 целых чисел, т. е. MATHEMATICA позволяет ту же задачу решить с помощью одного оператора: Подобных примеров, когда не надо думать (и часто ошибаться), как организовать цикл и т. д., можно привести большое количество. Это, конечно, далеко не все из того, что позволяет система MATHEMATICA вытворять со списками и формулами. Однако и этого достаточно, чтобы убедиться в ее практически неограниченных возможностях в области математических преобразований. И еще один пример – случайные блуждания по сетке – разберите самостоятельно. Здесь использована функция Distribute[{a, b, …}, List], которая выводит все возможные элементы списка. Следующая неизвестная Вам функция Complement[{a, b, c, d, …}, c] работает так, что из заданного списка выделит все элементы, кроме с. Наконец, функция FoldList[f, x, {a, b, c, …}] даст такой список {x, f[x, a], f[f[x, a], b], …}. Теперь сама программа и результаты ее применения. Любит MATHEMATICA такие программы!
Очень коротко (на уровне идей) остановимся на второй из перечисленных выше технологии программирования.
|