Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Приклад. Определим пятую степень переменного х как именованную внешнюю функцию:






Определим пятую степень переменного х как именованную внешнюю функцию:

Вычислены значения этой функции от трех значений аргумента.

Обратите внимание, что выходной строки, соответствующей оператору In[2], нет, поскольку в нем использовано отложенное присвоение SetDelayed (: =).

С заголовками внешних функций можно обращаться так же, как с заголовками встроенных функций. Например,

Здесь Nest дает выражение, в котором функция power5 применяется к выражению (a+b) заданное количество раз (в примере три раза).

Следующая функция вычисляет среднее арифметическое значение элементов списка:

 

Обратите внимание на то, что переменная, являющаяся результатом вычисления функции (в данном случае это mean), является глобальной.

 

Создайте функцию, которая вычисляет среднеквадратическое значение элементов списка.

 

Аналогично строятся и процедуры. Рассмотрим пример.

Создадим внешнюю функцию, решающую эту задачу при произвольном значении п

Процедуры обычно включают несколько функций (встроенных либо внешних). Эти функции – шаги процедуры – располагаются в соответствии с последовательностью, в которой они должны вычисляться, и отделяются одна от другой символом "; ". Создадим процедуру, которая выдает значение коэффициента полинома при

Обратите внимание на то, что при создании процедуры по такому шаблону, как в рассмотренном примере, само тело процедуры заключается в круглые скобки. Еще одно важное замечание. Выясним свойства внутренней переменной у той процедуры, которая создана.

Как и следовало ожидать, MATHEMATICA установила для нее статус глобальная. В программировании существует такое правило: там, где это не является необходимым, нужно использовать локальные переменные. Обычно

в процедурах желательно всем внутренним переменным установить статус локальные. Для этого используется другая форма записи процедуры.

 

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

 

Примеры.

Найдем приближенно корень уравнения на промежутке [0, 1] методом итераций. Для этого уравнение нужно привести к виду и, взяв начальную точку , вычислять приближения корня по формуле . В нашем случае можно взять , а в качестве начальной точки .

Это значение получено после 10 итераций. Чтобы оценить погрешность, выведем все промежуточные результаты.

Видим, что после 8-ой итерации произошла стабилизация шести знаков после десятичной точки.

Обычно, заранее угадать необходимое количество итераций трудно. В этом случае можно ввести другой критерий остановки, например, потребовать, чтобы вычисления продолжались до тех пор, пока абсолютное значение разности результатов, полученных в i -ой и i +1-ой итерациях была меньше некоторой заданной величины. В этом случае решение задачи можно найти так:

Здесь путем задания третьего аргумента функции FixedPoint затребована точность вычисляемого корня . Однако, поскольку результат выведен с 6-ю десятичными знаками (установлено по умолчанию), два последних знака нужно отбросить.

В следующем примере вычисляется список производных гауссова импульса до 4-го порядка, включительно и выводятся графики соответствующих функций.

Мы уже знаем, что в выражении вида функция относится к списку как к целому. Часто необходимо применить эту функцию отдельно к каждому элементу списка или выражения. В системе MATHEMATICA для этого используются операторы Map. Примеры применения их к спискам рассмотрены в предыдущей лекции. Здесь еще раз выпишем их, добавим несколько новых и на примерах рассмотрим их применение к выражениям.

 

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 такие программы!

 

Очень коротко (на уровне идей) остановимся на второй из перечисленных выше технологии программирования.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.