Обозначение
|
Назначение образца
|
-
|
Любое
выражение
|
x_
|
Любое
выражение, представленное именем х
|
: :pattem
|
Образец,
представленный именем х
|
Pattem ? test
|
Возвращает
True, когда test применен к значению образца
|
. Функции пользователя:
Понятие функции ассоциируется с обязательным
возвратом некоторого значения в ответ на обращение к функции по её имени с
указанием аргументов (параметров) в квадратных скобках. Возврат функциями
некоторых значений позволяет применить их наряду с операторами для составления
математических выражений.
Функции подразделяются на встроенные в ядро
системы внутренние функции и функции, заданные пользователем. Примером первых
могут быть Sin[x], Bessell[n,
x] и тд.
Mathematica
содержит множество таких функций, охватывающих практически все широко
распространённые элементарные и специальные математические функции. Есть и
возможность создания функций со специальными свойствами - чистых (pure
function) и анонимных
функций.
Суть функционального программирования
заключается в использовании в ходе решения задач только функций. При этом
возможно неоднократное вложение функций друг в друга и применение функций
различного вида. В ряде случаев, особенно в процессе символьных преобразований,
происходит взаимная рекурсия множества функций, сопровождаемая почти
неограниченным углублением рекурсии и нарастанием сложности обрабатываемых
системой выражений.
Встроенные стандартные функции и их типовые
применения уже были описаны в предшествующих уроках. Так что далее мы
рассмотрим только задание функций особого вида, создаваемых пользователем или
используемых в управляющих структурах программ.
Хотя в системах Mathematica имеется около тысячи
встроенных функций, любому пользователю рано или поздно может потребоваться
создание какой - либо своей функции. Кажется естественным задать её по
правилам, принятым во многих языках программирования. Например, функцию для
возведения x в степень n можно было бы определить так: powerxn[x,
n]:=x^n
Однако такая функция отказывается работать.
Причина этого кроется в том, что в системе
Mathematica символы x и n являются обычными символами, не наделёнными особыми
свойствами. Будучи использованными в качестве параметров функции, они не
способны воспринимать формальные параметры. Так что вычислять нашу ущербную
функцию можно лишь при предварительном присваивании x и n нужных значений.
Разумеется, заданная таким образом функция
является неполноценной. Для того, чтобы функция пользователя нормально
воспринимала переданные ей аргументы, в списке параметров надо использовать
образцы в виде переменных, но имеющие после своих имён символы подчёркивания.
Образцы способны быть формальными параметрами функций и воспринимать значения
фактических параметров. Таким образом, правильной будет запись функции
пользователя в виде: powerxn[x_,
n_]:=x^n.
Теперь вычисление по заданной функции пройдёт гладко, причём как в численном,
так и в символьном виде.
Заметим, что для уничтожения определения
заданной функции можно использовать команду - функцию Clear[Name_function], где
Name_function
- имя функции.
Можно также задать функцию пользователя,
содержащую несколько выражений, заключив их в круглые скобки: f[x_]:=(t=(1+x)^2;
t = Expand[t])
Переменные списка параметров, после имён,
которых стоит знак «_», являются локальными в теле функции или процедуры. На их
место подставляют фактические значения соответствующих параметров.
Обратите внимание на то, что переменная t
функции f является глобальной. Применение глобальных переменных в теле функции
вполне возможно, но создаёт так называемый побочный эффект - в данном случае
меняет значение глобальной переменной t. Для устранения побочных эффектов надо
использовать образцы и другие специальные способы задания функций, описанные
ниже. Итак, можно сформулировать ряд правил для заданий функций пользователя:
· такая функция имеет идентификатор -
имя, которое должно быть уникальным и достаточно понятным;
· в списке параметров функции,
размещённом в квадратных скобках после идентификатора, должны использоваться
образцы переменных, а не просто переменные;
· может использоваться отложенное (:=)
или немедленное (=) присваивание;
· тело функции может содержать
несколько выражений, заключённых в круглые скобки, при этом возвращается
значение последнего выражения;
· переменные образцов в списке
параметров являются локальными и действуют только в пределах тела функции;
· в теле функции могут использоваться
глобальные переменные, но при этом возможны побочные эффекты;
· возможно обращение к функции из тела
этой же функции (рекурсия).
Параметрами функций могут быть списки при
условии допустимости их комбинации.
После своего задания функции пользователя могут
использоваться по тем же правилам, что и встроенные функции.. Чистые функции:
Иногда может потребоваться создание функции, не
имеющей имени (например, если функция будет использоваться только один раз,
сразу же после её создания). Эта функция представляется только выражением без
идентификатора, отсюда и её название - чистая функция (pure
function). Для создания такого
объекта служит встроенная функция Function, используемая в одном из следующих
вариантов:
Function[body] - создаёт
чистую функцию с телом body
Function[{x}, body] - создаёт
чистую функцию параметра x с телом body
Function[{x1, x2,...}, body] - создаёт
чистую функцию ряда параметров x1, x2,… с телом body
Для вычисления созданной таким образом функции
после неё задаётся список параметров в квадратных скобках.
Чистую функцию можно легко превратить в обычную
функцию пользователя.. Анонимные функции:
Предельно компактную форму задания имеют так
называемые анонимные функции. Они не имеют ни названия, ни обычного определения
и задаются только выражениями специального вида. В этом выражении вместо
переменных используют обозначения # (для одной переменной) или #1, #2,… (для
ряда переменных). Завершается тело функции символом «&». Если надо
вычислить функцию, то после её записи в квадратных скобках указывается список
фактических параметров.
С помощью анонимных функций нетрудно создавать
обычные функции пользователя.. Организация циклов:
Многие задачи в пакете Mathematica решаются с
использованием линейных алгоритмов и программ. Они могут быть представлены непрерывной
цепочкой выражений, выполняемых последовательно от начала до конца.
Однако в большинстве случаев серьёзные
вычисления базируются на использовании циклических и разветвлённых алгоритмов и
программ. При этом, в зависимости от промежуточных или исходных данных,
вычисления могут идти по разным ветвям программы, циклически повторятся и тд.
Для реализации разветвлённых программ язык программирования должен содержать
управляющие структуры, то есть специальные конструкции языка, реализующие в
программах ветвление. Они используются при различных методах программирования,
в том числе при процедурном и функциональном программировании.
a. Циклы
типа Do;
К важнейшим управляющим структурам в языках
программирования относятся циклы. С их помощью осуществляется циклическое
исполнение некоторого выражения expr заданное число раз. Это число нередко
определяется значением некоторой управляющей переменной (например i, j и т.д.)
меняющиеся либо с шагом +1, либо от начального значения imin до конечного
значения imax с шагом di. Циклы могут быть одинарными или множественными -
вложенными друг в друга. Последние, используют ряд управляющих переменных.
Такого рода циклы организуются с помощью функции Do:
v Do [expr,
{imax}] -выполняет imax
раз вычисление expr;
v Do
[expr, {I,
imax}] - вычисляет expr
с переменной i, последовательно принимающей значения от 1 до imax
(с шагом 1);
v Do[expr,
{I, imin,
imax}] - вычисляет expr
с переменной I, последовательно
принимающей значения от imin
до imaxс шагом 1;
v Do[expr,
{I, imin,
imax, di}]
- вычисляет expr с
переменной I, оследовательно
принимающей значения олт 1 до imax
с шагом di;
v Do[expr,
{I, imin,
imax}, {j,
jmin, jmax},…]
- вычисляет expr, организуя
ряд вложенных циклов с управляющими переменными j,
I и тд.
Нетрудно убедиться в том, что переменная i в
теле цикла (итератор) является локальной и по выходе из цикла её значение
остаётся тем же, что было до выхода.
Вся программа с циклом является содержанием
одной ячейки, и её листинг охвачен квадратной скобкой. Для иллюстрации вывода
можно использовать команду Print в теле цикла. Также нетрудно заметить, что
управляющими переменными цикла можно принять, как и целочисленные, так и
вещественные значения.
Стоит упомянуть о применении функции Module. Она
создает программный модуль с локальными переменными, в котором организовано
рекуррентное вычисление чисел Фибоначчи.
b. Циклы
типа For;
Другой вид цикла - цикл For
- реализуется одноимённой функцией:
For[start, test, incr, body]
В ней сначала один раз вычисляется выражение start,
а затем поочерёдно вычисляются выражения body
и incr до тех пор, пока
условие test не
перестанет давать логическое значение True.
Когда это случится, то есть когда test
даст False, цикл
заканчивается.
Так же необходимо упомянуть о функции Return[x],
которая возвращает значения. В цикле For
не предусмотрено задание локальных переменных, так что надо следить за
назначением переменных - при использовании глобальных переменных неизбежны
побочные эффекты. 12
c. Циклы
типа While:
Итак, функция For
позволяет создавать циклы, которые завершаются при выполнении (эволюции) какого
- либо условия. Такие циклы можно организовать и с помощью функции While[test,
expr], которая
выполняет expr до тех пор,
пока test не
перестанет давать логическое значение True.
Циклы типа While,
в принципе, могут заменить другие, рассмотренные выше, типы циклов. Однако, это
усложняет запись и понимание программ. Аппарат локальных переменных в этом типе
циклов не используется.
d. Директивы
- функции прерывания и продолжения циклов;
В указанных типах циклов и в иных управляющих
структурах можно использовать следующие директивы - функции:
Ø Abort[
] - вызывает прекращение вычислений с сообщением $ Aborted;
Ø Break[
] - выполняет выход из тела цикла или уровня вложенности программы содержащего
данный оператор ( циклы Do,
For и While
или тело оператора - переключателя Switch).
Оператор возвращает Null
- значение (без генерации секции выхода);
Ø Continue[
] - задаёт переход на следующий шаг текущего цикла Do,
For или While;
. Условные выражения и безусловные
переходы:
Для подготовки полноценных программ помимо
средств организации циклов необходимы и средства для создания разветвляющихся
программ произвольной структуры. Обычно они реализуются с помощью условных
выражений, позволяющих в зависимости от выполнения или невыполнения некоторого
условия (condition)
выполнять те или иные фрагменты программ.
e. Функция
If;
Как у большинства языков программирования,
условные выражения задаются с помощью оператора или функции IF.
Система Mathematica
имеет функцию If, формы
которой представлены ниже:
ü If[condition,
t, f]
- возвращает t, если результатом
вычисления condition
является True, и f,
если результат равен False;
ü If[condition,
t, f,
u] - то же, но даёт u,
если в результате вычисления condition
не было получено ни True,
ни False.
Функция If
обеспечивает ветвление максимум по двум ветвям программы. Для ветвления по
многим направлениям можно использовать древовидные структуры программ с
множеством функций If.
Однако, это усложняет исходный текст программы.
f. Функции
- переключатели;
Для организации ветвления по многим направлениям
в современных языках программирования используются операторы - переключатели. В
системе Mathematica множественное ветвление организовано с помощью функций
Which и Switch:
- Which[test1,
value1, test2,
value2,…] - вычисляет в
порядке следования каждый из testi,
сразу возвращая именно ту величину из valuei,
которая относится к первому testi,
давшему True ;
- Switch[expr,
form1, value1,
form2, value2,…]
- вычисляет селектор expr,
затем сравнивает его последовательно с каждой из меток formi,
вычисляя и возвращая то valuei,
которое соответствует первому совпадению.
При неверном задании первого параметра
(селектора) просто повторяется запись функции.
При использовании селектора в виде целого числа,
тогда как метка выбора - вещественное число. Выбор при этом не происходит,
поскольку целочисленное значение не является тождественным вещественному числу.
.3 Теоретический материал по 3 лабораторной
работе
Для обработки экспериментальных данных или данных
заданных в виде таблиц, в пакете Mathematica
существует множество функций.. Вычисление суммарных значений, среднего
значения и дисперсии:
Для нахождения суммарного значения элементов в
таблицах можно воспользоваться функцией Total[], которая может принимать один
из следующих вариантов:
§ Total[list] - вычисляет сумму всех
элементов списка или таблицы;
§ Total[list,n] - вычисляет сумму всех
элементов таблицы до уровня n, где n=1 - сумма элементов по столбцам, а n=2
полная сумма всех элементов в двумерном массиве. Для нахождения суммы всех
элементов в таблице можно воспользоваться предыдущим вариантом записи функции.
§ Total[list,{n}] - вычисляет сумму
всех элементов таблицы на уровне n, где n=1 - сумма элементов по столбцам, а
n=2 сумма элементов по строкам в двумерном массиве.
§ Total[list,{n1,n2}] - вычисляет
сумму всех элементов таблицы от уровня n1 до n2.
Следует заметить, что максимальное значение n
будет равняться количеству размерностей в таблице или матрице.
Одними из важнейших характеристиками при
обработке экспериментальных данных являются среднее значение и дисперсия. В
пакете Mathematica существуют специальные функции, позволяющие получить
значение среднего и дисперсии для списка элементов:
© Mean[list] - вычисляет среднее по
списку значений;
© Variance[list] - вычисляет дисперсию
по значениям в списке.
Следует заметить, что при работе с двумерными
таблицами, среднее и дисперсия будут вычисляться по столбцам.. Интерполяция:
В вычислительной практике часто приходится иметь
дело с функциями f(x),
заданными таблицами их значений для некоторого конечного множества значений х: f(x0),
f(x1),…,f(xn).
В процессе же решения задачи
необходимо использовать f(x) для
промежуточных значений аргумента. В этом случае строят функцию Ф(х), достаточно
простую для вычислений, которая в заданных точках , называемых узлами
интерполяции, принимает значения f(), , а в остальных точках отрезка (),
принадлежащего области определения f(х),
приближенно представляет функцию f(х) с той или иной степенью
точности.
При решении задачи в этом случае
вместо функции f(x) оперируют
с функцией Ф(х). Задача построения такой функции Ф(х) называется задачей
интерполирования. Чаще всего интерполирующую функцию Ф(х) отыскивают в виде
алгебраического полинома.
Во многих задачах бывает необходимо
получить значения в промежутках между точек, полученных в эксперименте. Одним
из вариантов получения таких значений является построение интерполяционного
полинома, который позволяет получить значение между узловыми точками с той или
иной степенью точности (теорию и методы интерполяции можно посмотреть в
соответствующей литературе). В пакете Mathematica существует
специальная функция Interpolation[], которая позволяет строить интерполяционный
полином по табличным данным. Она существует в нескольких вариантах
представления данных, основными из которых можно считать:
ª Interpolation[{f1,f2,…}] - строит
интерполяционный полином по списку значений функций в предположении, что x
принимает значения 1,2 и т.д.
ª Interpolation[{{x1,f1},{x2,f2},…}]
- строит интерполяционный полином по таблице значений x и y.
Результат работы данной функции выдается в виде
интерполирующей функции InterpolatingFunction[], которая может использоваться
для получения значений, обработки данных и построения графиков. Например
интерполяционный полином можно использовать для построения графиков, используя
функции рисования для аналитических функций.
a. Опции
интерполирования;→n,
Где n - порядок интерполирования, например 0 -
аппроксимация константой, 1-линией, 2- квадратичной функцией и т.д.
Начиная с версии 7 при интерполировании можно
вручную задать метод с помощью опции Method→”название метода”, Hermite -
полиномом Эрмита, Spline - интерполяция сплайнами и т.д.
Если известно, что представляемая таблицей
функция является периодической и в таблице задан только один период изменения
функции, то необходимо использовать опцию PeriodicInterpolation→True, для
того чтобы можно было использовать периодичность.
b. Интерполяционный
полином Лагранжа;
Для каждой функции f(x),
определённой на [a, b], и любого
набора узлов среди алгебраических многочленов
степени не выше n существует единственный
интерполяционный многочлен Ф(х), который может быть записан в форме: Ф(х) =,
где - многочлены степени n,
удовлетворяющие условиям: . Для интерполяционного полинома
Лагранжа многочлен имеет вид:
.
Этот многочлен (1) решает задачу
интерполирования и называется интерполяционным полиномом Лагранжа.
Интерполяционный полином Лагранжа
может быть записан в другой форме:
(2).
Запись полинома в данном виде более
компактна и удобна для использования в программировании.
При решении задачи интерполяции
величина n называется
порядком интерполирующего полинома. При этом как видно из формул (1) и (2),
число узлов интерполирования всегда будет равно n+1 и
значение х для которого определяется величина f(x) должно
лежать внутри области определения узлов интерполяции, т.е.
(3).
В некоторых практических случаях
общее известное число узлов интерполяции m, может быть
больше, чем порядок интерполирующего полинома n. В этом
случае, прежде чем реализовывать процедуру интерполяции согласно формулы (2),
необходимо определить те узлы интерполяции, для которых справедливо условие
(3). При этом следует помнить, что наименьшая погрешность достигается при
нахождении значения х, в центре области интерполяции. Для чего предлагается
следующая процедура:
. После ввода в программу
значения величины х, необходимо проверить условие , где и начальное и конечное значение узлов
интерполяции.
. При выполнении предыдущего
условия начинается поиск области интерполяции, для чего находим первое х,
такое, для которого выполняется условие , при этом номер i, будет
соответствовать середине интервала интерполяции. Для определения области
интерполяции её левая граница будет начинаться с номера i - (n+1)/2, а
заканчиваться узлом с номером i + (n+1)/2.
. После выполнения пунктов 1
и 2 программируется формула (2).
C. Аппроксимация экспериментальных данных
аналитическими функциями:
Иногда бывает необходимо получить аналитическую
функцию, описывающую полученные экспериментальные данные. Для этого можно
воспользоваться функциями производящими «фитирование» данных, т.е.
производящими подбор коэффициентов для заданной тем или иным способом
аналитической функции для которых эта функция будет с достаточно хорошим
приближением описывать экспериментальные данные.
Для этих целей в пакете Mathematica можно
использовать две функции. Первая:[data,funs,vars] - находит с помощью метода
наименьших квадратов фит по данным data, как линейную комбинацию функций funs
по переменным vars.
При нахождении фита, аппроксимирующие функции
могут быть заданы не только как элементы степенного ряда, но и как другие
комбинации функций.
Вторая функция используется в тех случаях, когда
необходимо найти фит к заранее известной модельной функции:
[data,expr,pars,vars] - находит численные значения констант pars для выражения
expr, описывающие наилучшим образом данные data как функцию переменных vars.
.5 Теоретический материал по вопросу для
углубленного рассмотрения
Цикл - это разновидность управляющей конструкции
в языках программирования высокого уровня предназначенная для организации
многократного исполнения набора инструкций.
Входной язык Mathematica содержит большое
количество конструкций, позволяющих для каждой конкретной задачи выбрать
оптимальный метод программирования.. Все возможные способы проведения в
пакете Mathematica
циклических операций:
При помощи циклов осуществляется многократное
исполнение некоторого выражения или процедуры. Число актов вычислений определяется
некоторой управляющей переменной, меняющейся с заданным шагом от начального
значения до конечного или до выполнения некоторого условия.
a. Цикл
Do;
Простейшая конструкция цикла. Возможны различные
форматы её использования:
. Do[expr, {imax}] - выполняет imax раз
вычисление выражения expr;
. Do[expr, {i, imax}] - вычисляет expr с
переменной i, последовательно принимающей значения от 1 до imax (с шагом 1);
. Do[expr, {i, imin, imax}] - вычисляет
expr с переменной i, последовательно принимающей значения от imin до imax с
шагом 1;
. Do[expr, {i, imin, imax, di}] -
вычисляет expr с переменной i, последовательно принимающей значения от 1 до
imax с шагом di;
. Do[expr, {i, imin, imax}, {j, jmin,
jmax}, ...] - вычисляет expr, организуя ряд вложенных циклов с управляющими
переменными j, i и т. д.
Итераторы цикла i,
j,… являются
локальными. Выражение expr
может быть записано в виде последовательности команд, разделённых точкой с
запятой. Оператор Do
вычисляет выражение, но не помещает его в выходную ячейку, поэтому для вывода
результатов часто используются функции визуализации (Print,
Plot, Return
и др).
b. Цикл
For;
Формат использования цикла с заголовком For:
For[start,
test, incr,
body].
Данный цикл вычисляет start,
потом, повторяясь, вычисляет incr
и body, пока test
не примет значение False.
Начало start
и тело body могут быть
записаны в виде элементарных процедур, то есть последовательностью функций,
разделённых точкой с запятой. В цикле For
не предусмотрено задание локальных переменных, так что надо следить за их
назначением (при использовании глобальных переменных неизбежны побочные
эффекты). По окончании цикла формальным результатом вычислений является Null,
поэтому для вывода текущих результатов в теле цикла часто используют функции
визуализации, а по окончании цикла - функцию возврата Return[expr].
c. Цикл
While;
Формат команды While[test, body]
- подсчитываются повторно условие test
и тело цикла body до тех пор,
пока истинность условия не нарушится.
Тело body
может быть записано в виде элементарной процедуры (то есть последовательностью
функций, разделённых точкой с запятой). Переменные цикла в операторе While
не локализованы. По окончании цикла формальным результатом вычислений является Null.
Обычно в body содержится
выражение, изменяющее некоторый параметр в test.
Затем test
перевыполняется с новым значением параметра и так далее.
d. Директивы
прерывания и продолжения циклов;
Элементы процедуры, используемой для
программирования, обычно выполняются по порядку, один за другим. Однако, в
некоторых случаях может понадобиться изменить этот порядок - остановить
выполнение текущего элемента процедуры или просто возвратить полученный
результат. Для этой цели имеется несколько функций, осуществляющих контроль за
выполнением программы.
Часто возникает необходимость прерывания или
продолжения вычислений. Для этого в пакете Mathematica
можно использовать следующие директивы:
. Abort[] - вызывает прекращение
вычислений с сообщением $Aborted. Команда может быть использована в любом месте
программы.
. Break[] - выполняет экстренный выход из
тела цикла или уровня вложенности программы, содержащего данный оператор
(возвращает Null - значение без генерации секции выхода).
. Continue[] - переход на следующий шаг
ближайшего содержащего эту функцию оператора Do,
For или While.
. Interrupt[] - приостанавливает
вычисления, делая запрос об их возобновлении.
. Return[] - прерывает выполнение с
возвращением значения Null.
. Return[expr] - возвращает значение
выражения ехрr, выходя из всех процедур и циклов.
e. Дополнительно;
При выполнении циклов, как правило, необходимо
на каждом витке менять значения используемых переменных. Для наиболее
распространённых операций этого вида в системе Mathematica
созданы специальные операторы:
1. i++
- увеличение значения i
на 1.
2. i--
- уменьшение значения i
на 1.
. ++i
- значение i после добавления
1.
. --i
- значение i после вычитания 1.
5. i+=di
- прибавление di к значению i.
6. i-=di
- вычитание di из значения
i.
7. x*=c
- умножение x на c.
8. x/=c
- деление x на c.
Mathematica
располагает минимальным, но функционально полным набором средств для
организации циклов и разветвлений, которые позволяют создавать полноценные
программы.. Примеры всех возможных способов проведения в пакете Mathematica
циклических операций:
a. Цикл
Do;
b. Цикл
For;
Следующая команда позволяет построить
последовательность функций
c.
Цикл While;
d. Директивы
прерывания и продолжения циклов;
1. Break[]:
2. Continue[]:
3.
Abort[]:
4. Return[],
Return[expr]:
5. Interrupt[]:
При обращении к данной функции в процессе
выполнения цикла инициирует вмешательство пользователя: выдаётся диалоговое
окно, в котором предлагает осуществить некоторый набор действий, например
продолжить выполнение цикла, либо прервать его.
e.
Дополнительно;
В теле функций Do,
While и For
переменные не локализованы, поэтому они сохраняют значения, присвоенные им при
последнем вычислении. Для локализации переменных используется функция Module[{x,
y, …}, expr]
(локализует переменные {x,
y, …} при исполнении
программы expr) или Module[{x=x0,
y=y0,
…}, expr]
(локализует переменные {x,
y, …} при исполнении
программы expr с
присвоением значений локальным переменным). Локализация переменных позволяет
избежать конфликта символов.
. Сравнение между использованием
циклических операций в пакете Mathematica
с использованием циклических операций в других языках программирования:. Сейчас
в мире существует огромное множество различных языков программирования и в
каждом из них использование циклических операций весьма и весьма схоже, но всё
- таки, они разные и у каждого есть свои особенности. В нашем случае я проведу
нить между математическим пакетом Mathematica
и математическим пакетом Maple.
Анализ данной параллели поможет мне провести сравнение использования
циклических операций в различных языках программирования.
Таблица 1.
Сравниваемый
пакет/ Объект
сравнения
|
Пакет
Mathematica
|
Пакет
Maple
|
Циклические
операции общий вид
|
Формат
команды
While[test, body]
|
Формат
использования цикла с заголовком For:
For[start,
test,
incr,
body].
|
Формат
команды:
Do[expr, {i, imin, imax, di}]
|
Maple имеет
обобщённую
конструкцию
цикла,
которая
задаётся
следующим
образом:
|for<name>| |from<expr1>| |to<expr3>| |by<expr2>|
|while<expr4>| do<Statement sequence>od;
|
Есть
ещё одна, более специфическая конструкция цикла: |for<name>|
|in<expr1>| |while<expr2>| do<Ststement sequence>od:
|
Объяснение
циклической операции
|
Подсчитываются
повторно условие test
и тело цикла body
до тех пор, пока истинность условия не нарушится.
|
Данный
цикл вычисляет start,
потом, повторяясь, вычисляет incr
и body, пока test
не примет значение False.
|
Подсчитывается
выражение expr для значений i, принимающих значения от imin до imax с шагом
di.
|
Здесь
name - имя
управляющей переменной цикла, expr1,
expr2, expr3
- выражения, задающие начальное значение, конечное значение и шаг изменения
переменной name, expr4
- выражение, задающее условие, пока цикл (набор объектов между словами do
и od), будет
выполняться. В ходе выполнения цикла управляющая переменная меняется от
значения expr1 до
значения expr2 с шагом,
заданным expr3. Если
блок by<expr2>
отсутствует, то управляющая переменная будет меняться с шагом +1 при expr1>expr2.
|
Здесь
expr1 задает список
значений, которые будет принимать управляющая переменная name.
Цикл будет выполняться, пока не будет исчерпан список и пока выполняется
условие, заданное выражением expr2.
В цикле этого вида управляющая переменная может меняться произвольно.
|
Директивы
прерывания и продолжения циклов
|
Abort[]
- вызывает прекращение вычислений с сообщением $Aborted. Команда может быть
использована в любом месте программы. Break[] - выполняет экстренный
выход из тела цикла или уровня вложенности программы, содержащего данный
оператор (возвращает Null - значение без генерации секции выхода). Continue[]
- переход на следующий шаг ближайшего содержащего эту функцию оператора Do,
For или While.
Interrupt[] - приостанавливает вычисления, делая запрос об их
возобновлении. Return[] - прерывает выполнение с возвращением значения
Null. Return[expr] - возвращает значение выражения ехрr, выходя из
всех процедур и циклов.
|
Next[]
- позволяет пропустить определённый цикл Break[]
- прерывает выполнение фрагмента программы (или цикла), как только он
встречается в ходе её выполнения. Return[]
- позволяет возвратить значение последнего выражения в тело процедуры или
выражения. Любой из операторов Quit[],
Done[],
Stop[]
обеспечивает также прерывание выполнения текущей программы (в частности,
цикла), но при этом окно текущего документа закрывается.
|
Подведение
итогов сравнения.
|
При
сравнении языков программирования данных пакетов можно выделить явные
отличие: 1. Можно увидеть явное отличие
используемых директив. А именно довольно различный набор функций для
продолжения или прерывания цикла. Но имеются и директивы, встречающиеся в
обоих пакетах: Break[],
Return[]. 2. Также
в отличие от Maple
Mathematica не имеет
циклических конструкций, позволяющих производить циклические вычисления по
подвыражениям заданного выражения. Maple
в свою циклическую конструкцию вобрал основные конструкции циклов for
и while.Тем
самым обеспечивая для себя возможность на основе подвыражений создавать
интересные конструкции. В остальном использование циклических операций и
директив прерывания и продолжения циклов этих двух математических пакетов
весьма схоже.
|
. Решение и результаты проделанных лабораторных
работ
.1 Лабораторная работа № 1
. 1-ое задание:
a. Последовательность
действий при выполнении данного задания;
. Решим данное уравнение в общем виде
(аналитически). В этом нам поможет функция DSolve[] (более подробное описание
данной функции можно найти в «Ход работы: Обзор теоретической части»).
. Далее для данной нам функции построим
решение с начальными условиями, которые даны нам в условии задания. Это делаем
также с помощью функции DSolve[], хотя набор аргументов функции в этом случае
немного изменится, а именно: добавляются x(0)=x0,
v(0)=v0.
. Для более удобного дальнейшего
выполнения задания полученный в пункте 2 результат мы упрощаем с помощью
функции Simplify
(более подробное описание данной функции можно найти в методическом пособии к
лабораторной работе № 9 по курсу Программные аппараты средств информатики).
. Последующим нашим действием становится
решение данного уравнение в численном виде, по начальным условиям, данных нам в
задании, х0=-2/5, v0=2. Проделать данную операцию нам поможет функция NDSolve[]
(более подробное описание данной функции можно найти в «Ход работы: Обзор
теоретической части»).
. Завершающим этапом данного задания
является построения графика зависимости х от t. Это мы смогли сделать с помощью
функции Plot[] (более подробное описание данной функции можно найти в
методическом пособии к лабораторной работе № 10 по курсу Программные аппараты
средств информатики).
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
. 2-ое задание:
a. Последовательность
действий при выполнении данного задания;
. Решим данное уравнение в общем виде
(аналитически). В этом нам поможет функция DSolve[] (более подробное описание
данной функции можно найти в «Ход работы: Обзор теоретической части»).
. Далее для данной нам функции построим
решение с начальными условиями, которые даны нам в условии задания. Это делаем
также с помощью функции DSolve[], хотя набор аргументов функции в этом случае
немного изменится, а именно: добавляются x(0)=x0,
v(0)=v0.
. Для более удобного дальнейшего
выполнения задания, полученный в пункте 2 результат мы упрощаем с помощью
функции FullSimplify
(более подробное описание данной функции можно найти в методическом пособии к лабораторной
работе № 9 по курсу Программные аппараты средств информатики).
. Последующим нашим действием становится
решение данного уравнение в численном виде, по начальным условиям, данных нам в
задании, х0=3, y0=2.
Проделать данную операцию нам поможет функция NDSolve[] (более подробное
описание данной функции можно найти в «Ход работы: Обзор теоретической части»).
. Завершающим этапом данного задания
является построения графиков зависимости х от t. Это мы смогли сделать с
помощью функций Plot[] (более подробное описание данной функции можно найти в
методическом пособии к лабораторной работе № 10 по курсу Программные аппараты
средств информатики) и функции Evaluate[], которая делает предварительный
пересчёт данных функций для заданного параметра t.
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
. 3-ее задание:
a. Последовательность
действий при выполнении данного задания;
. В данном задание мы значительно
сократим время выполнения и общую длину решения, а именно: мы запишем несколько
действий в одной записи и, пропустив громоздкие вычисления, сразу получим
график зависимости х от t.
. В данной записи можно увидеть, что для
выполнения данного задания мы использовали функцию NDSolve[] (более подробное
описание данной функции можно найти в «Ход работы: Обзор теоретической части»),
для численного решения данного уравнения, также мы видим, что задействованы
функции Plot[] и Evaluate[],
для построения графика зависимостей x от t.
. Новой функцией является функция
Manipulate[], которая используется для реализации изменения параметра.
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
. 4-ое задание:
a. Последовательность
действий при выполнении данного задания;
. Решим данное уравнение в общем виде
(аналитически). В этом нам поможет функция DSolve[] (более подробное описание
данной функции можно найти в «Ход работы: Обзор теоретической части»).
. Для более удобного дальнейшего
выполнения задания, полученный в пункте 1 результат мы упрощаем с помощью
функции FullSimplify
(более подробное описание данной функции можно найти в методическом пособии к
лабораторной работе № 9 по курсу Программные аппараты средств информатики).
. Последующим нашим действием становится
нахождение кинетической потенциальной и полной энергии, формулы, для вычисления
которых мы можем взять из курса «Физики».
. При вычислении кинетической энергии мы
сталкиваемся с небольшим препятствием, которое можно легко решить, используя
знания физики и курса Программные аппараты средств информатики.
. При вычислении кинетической энергии нам
необходима скорость, которую можно вычислить, взяв первую производную, в нашем
случае от x по t. Это мы сделали с помощью функции D[] (более подробное
описание данной функции можно найти в методическом пособии к лабораторной
работе № 9 по курсу Программные аппараты средств информатики) и немного
упростили её с помощью функции Simplify (более подробное описание данной
функции можно найти в методическом пособии к лабораторной работе № 9 по курсу
Программные аппараты средств информатики).
. Завершающим этапом данного задания
является построения графиков зависимости х от t при конкретных значениях
переменных. Это мы смогли сделать с помощью функций Plot[] (более подробное
описание данной функции можно найти в методическом пособии к лабораторной
работе № 10 по курсу Программные аппараты средств информатики).
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
.2 Лабораторная работа № 2
. 1-ое задание:
a. Последовательность
действий при выполнении данного задания;
. На первом этапе работы мы считываем
данные из файла, для этого мы используем функцию Import[], а в качестве формата
считывания выбираем функцию List, с помощью которой считанные данные будут в
виде списка.
. Последующим нашим действием станет
нахождение среднего значения данной выборки. Среднее значение = Сумма всех
элементов выборки / Общее количество элементов в выборке. Из этой простой
формулы мы можем выделить наш первый шаг, а именно: находим общее число
элементов в выборке с помощью функции Lenght[]. Далее нам необходимо провести
суммирования, проведём данную операцию с помощью цикла For[start,
test, incr,
body].
. Дальнейшим нашим шагом стало нахождения
дисперсии данной выборки, также с использованием цикла For[start,
test, incr,
body].
. Интересные факты: Переменная, с чей
помощью мы производим суммирование элементов, должна зануляться перед циклом.
Плюс для более корректной работы все вычисления следует производить в одном
блоке.
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
2-ое задание:
. На первом этапе работы мы считываем
данные из файла, для этого мы используем функцию Import[], а в качестве формата
считывания выбираем функцию Table,
с помощью которой считанные данные будут в виде таблицы.
. Последующим нашим действием станет
нахождение общего числа элементов в выборке с помощью функции Lenght[].
. Потом мы пишем программу для сортировки
элементов в выборке по возрастанию (метод выбираем самостоятельно). В нашем
случае мы используем метод «Пузырька». По этому методу мы сравниваем элементы и
делаем их перестановку, если выполняется определённое условие.
. По заданию нам сказано, что необходимо
провести сортировку по первому столбцу, то есть общий смысл нашей программы
заключается в том, что происходит сравнение элементов первого столбца и, если
условие выполняется, то сравниваемые объекты меняются местами. В данном случае
сравниваемыми объектами являются строки. Конечным итогом столь запудренного
вычисления стала таблица наших данных, отсортированных по первому столбцу
(полный конечный вариант данной таблицы представлен в приложении, которое
находится в конце отчёта).
. Дальнейшим нашим шагом стало
определение максимального и минимального значения из элементов первого столбца
полученной таблицы.
. Завершающим ходом является построение
графика зависимостей на основе полученной выше таблицы, используя функцию
ListPlot[].
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
. 3-ее задание:
a. Последовательность
действий при выполнении данного задания;
. На основе, полученной из предыдущего
задания отсортированной таблицы, построим интерполяционный полином порядка 25.
Для осуществления этого нам необходимо воспользоваться знаниями, полученными на
курсе Программирования для ЭВМ. С помощью некоторых преобразований мы получаем
программу, которая находит полином 25 порядка в пакете Mathematica.
. Нам необходимо определить границы
полинома. Ход работы в данном случае происходит в два этапа: выявление позиции
того элемента, который следует после Х и для которого ищется значение функции.
Ну и собственно то, что мы искали: по позиции такого элемента вычисляем границы
полинома.
. Далее проведём проверку для нашей
программы. Проверка заключается в том, что если значение Х входит в интервал
наших значений, то наша программа даст корректный результат. В обратном случае
программа прекратит вычисления и выдаст сообщение об ошибке. Ещё одной
особенностью является то, что если для проверки мы берём значения на концах
интервала, то получаем результат с погрешностью, так как задан полином слишком
большого порядка. В нашем случае обе проверки выполнены и получили корректный результат.
. Затем в условие задания нам сказано,
что необходимо получить 100 точек между узлами в интервале значений первого
столбца отсортированной таблицы, используя построенный полином. Для этого
воспользуемся функцией Table[]. Данная функция создаёт список по выражению,
зависящему от параметра и изменяющемуся от минимального значения, до
максимального с заданным шагом.
. В качестве максимального и минимального
значения я беру концы нашего интервала, но с учётом особенности использования
данных значений, я воспользуюсь именно теми концами, при которых мы получаем
корректный результат.
. После я задаю шаг. Шаг = (Максимальное
значение - Минимальное значение) / Количество точек в промежутках между узлами
(в нашем случае 100).
. С помощью указанной выше функции
Table[] генерируем нашу таблицу.
. Потом на основе прогенерированной
таблицы строим график, использовав функцию ListPlot[].
. Завершающим шагом является совмещение
графиков: полученного по начальным значениям и с полученным в третьем задании.
Это мы делаем с помощью функции Show[].
10. P.
S. На совмещённом
графике можно заметить расхождения в некоторых местах. Это происходит из-за
большого заданного порядка полинома. Следовательно, взяв во внимание данный
факт, можно сказать, что полученный результат корректный.
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica:
.3 Лабораторная работа № 3
. 1-ое задание:
a. Последовательность
действий при выполнении данного задания;
. На первом этапе работы мы считываем
данные из файла, для этого мы используем функцию Import[], а в качестве формата
считывания выбираем функцию Table,
с помощью которой считанные данные будут в виде таблицы.
. На основе считанных данных строим
график исходных данных, используя функцию ListPlot[].
. Затем находим минимальное и
максимальное значения нашей выборки. Для этого используем функции Min[]
и
Max[].
. Дальнейшим нашим действием станет
построения интерполирующего полинома и его проверка. Данную операцию нам поможет
произвести встроенная в пакет Mathematica
функция Interpolation[].
5. Затем данную операцию нам по
заданию необходимо сделать при различных порядках полинома (1, 2, 5 и
автоматическим). Здесь нам поможет аргумент InterpolationOrder p.
. Потом строим график,
показывающий данные, полученные с помощью интерполяционного полинома для
различных порядков интерполирования (1, 2, 5 и автоматическим). Построение
графика происходит с помощью функции Plot[].
. График для сравнения
получаем путём объединения графиков различных порядков, полученных с помощью
интерполирующего полинома. Данное действие также производим с помощью функции Plot[].
. Завершающим этапом станет
график сравнения графика исходных данных и графика интерполяционного полинома.
Здесь нам поможет функция Show[]. В нашем случае мы видим,
что оба графика очень похожи, что говорит о том, что полученный нами результат
корректен.
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
.
2-ое задание:
a. Последовательность
действий при выполнении данного задания;
. На первом этапе работы мы находим
среднее значение данной выборки. Для этого мы будем использовать встроенную
функцию Mean[].
. Далее мы должны определить дисперсию
данной выборки, что тоже делается довольно легко, если использовать встроенную
функцию Variance[].
. Последующим нашим шагом является
фитирование исходных данных на основе степенного ряда, исходя из этого, для
решения такой задачи воспользуемся функцией Fit[data,
funs, vars],
тем самым меняя степень ряда мы определим ту степень ряда, при которой он будет
хорошо описывать данные из файла.
. Основываясь на полученный в результате
фитирования степенной ряд строем его график, используя функцию Plot[].
. Затем строим график исходных данных, то
есть тех которые мы считали в самом начале. Делаем это с помощью функции ListPlot[].
. Для сравнения графика степенного ряда и
графика исходных данных совмещаем их на одном графике. Это мы делаем при помощи
функции Show[]. В нашем
случае оба графика достаточно близки друг другу, и как следствие делаем вывод,
что мы получили корректный результат.
. Потом нам необходимо провести
фитирование исходных данных с помощью заданной в условие функции. Производим
данное вычисление посредством функции FindFit[data,
expr, pfrs,
vars]. С её помощью мы
найдём значения параметров в соответствии с нашими исходными данными.
. Найденные в предыдущем пункте значения
подставляем в функции и уже на основе них строим график, задействовав функцию Plot[].
. Проверим найденные нами значения, путём
сравнения двух графиков: графика исходных данных и графика нашей функции.
Данное действие производим при помощи функции Show[].
В нашем случае оба графика практически неотличимы, что свидетельствует о
корректности нашего результата.
. Далее производим фитирование той же
самой функции, но уже с условием о том, среднее значение и дисперсия известны и
были получены нами ранее.
. Взяв за основу значения параметров,
полученных при проделывании предыдущего пункта, построим график функции.
. Завершающим этапом станет сравнение
графика функции при известных значениях параметров с графиком, полученным на
основе наших исходных данных. Данную операцию проделываем с помощью функции Plot[].
b. Проиллюстрированный
порядок действий при выполнении данного задания в пакете Mathematica;
Вывод
При выполнении заданий летней учебной практики
мы:
. Вспомнили функции пакета Mathematica,
изученные ранее (в 1-ом семестре);
. Научились решать дифференциальные
уравнения и системы дифференциальных уравнений с помощью пакета Mathematica;
. Изучили программирование в пакете
Mathematica;
. Освоили обработку экспериментальных
данных в пакете Mathematica;
. Смогли совмещать функции пакета
Mathematica, изученные ранее и функции, изученные во время летней учебной
практики;
. Сумели организовать общую работу
программы с помощью циклов;
. Приобрели практические и теоретические
навыки работы в пакете Mathematica;
Выполнение заданий летней учебной практики
проходило по плану:
. Изучили теоретический материал,
предоставленный нам в методических пособиях к лабораторным работам;
. Выполнили задания, предложенные нам в
трёх лабораторных работах, произведя требуемые вычисления;
. Составили отчеты по проделанным
лабораторным работам;
. Углубленно рассмотрели тему:
«Циклические операции в пакете Mathematica»
и провели сравнение применения данных операций между различными языками
программирования;
. Составили общий отчёт по всей летней
учебной практики, основываясь на проделанную ранее работу;
Заключение по проделанным лабораторным работам и
по вопросу для углубленного рассмотрения:
Лабораторная работа №1
В данной лабораторной работе мы произвели
вычисления дифференциальных уравнений и систем дифференциальных уравнений
различными способами, далее построили графики по каждому заданию, тем самым
закрепили освоенный нами теоретический материал. И затем составили отчёт по
выполненной работе. Благодаря данной работе мы научились решать простые и
сложные дифференциальные уравнения различных порядков, как в численном, так и в
аналитическом виде (в том числе и при заданных начальных условиях). Также в
базу наших знаний вошло умение решать систему дифференциальных уравнений различных
порядков, как в численном, так и в аналитическом виде (в том числе и при
заданных начальных условиях). Плюс мы вспомнили различные функции пакета Mathematica,
которые изучали в первом семестре. В их числе есть череда функций, которые
строят различные графики и с их помощью построили графики по каждому заданию,
основываясь на полученные данные. Конечным результатом нашей работы стали,
приобретённые знания и навыки, а так же верно выполненные задания.
Лабораторная работа №2
В данной лабораторной работе мы освоили новое
направление в пакете Mathematica, а именно: программирование в нём с
использованием функций пользователя и организацией программы с помощью циклов.
Общей целью нашей работы стало создание программы, которая производила бы
требуемые вычисления, а так же выполняла определённые условия, благодаря
которым общее решение имеет смысл, это было сделано с помощью циклов. Более
конкретно можно сказать, наши вычисления это были нахождение среднего и
дисперсии выборки, а также построение интерполирующего полинома. Конечным
результатом нашей работы стала верно, работающая программа, производящая
необходимые вычисления по определённым условиям, а также приобретённые знания и
улучшенные навыки в работе с пакетом Mathematica.
Лабораторная работа №3
В данной лабораторной работе мы освоили новое
направление в пакете Mathematica, а именно: обработка экспериментальных данных.
В ходе нашей работы был произведен ряд вычислений: нахождение среднего значения
и дисперсии, построение интерполирующего полинома с разными порядками,
проведение фитирования данных на основе степенного ряда и на основе заданной
функции (в нашем случае это функция плотности нормального распределения) и
конечно же построение обычных и совмещённых графиков на основе данных для
сравнение исходных данных с полученными. Результатом нашей лабораторной работы
стали, верно, выполненные задания, приобретённый опыт и накопленные знания при
работе в пакете Mathematica.
Вопрос для углубленного рассмотрения.
Исследовав циклические конструкции в различных
языках программирования (в нашем случае с пакетом Maple),
можно сделать вывод, что по принципам построения они схожи между собой, а если
и есть различия, то они связаны с синтаксисом. Ведь основная задача циклических
конструкций - это многократное выполнение одних и тех же операций, что
существенно облегчает работу программисту и позволяет организовать выполнение
итерационных процессов. Программа немыслима без циклических конструкций, так
как большая часть программ основана на повторении.
Общий итог по пройденной летней учебной
практики:
За период летней учебной практики мы не только
закрепили свои знания в использовании пакета Mathematica,
но приобрели новые по темам: «Решение дифференциальных уравнений и систем
дифференциальных уравнений», «Программирование в пакете Mathematica»,
из данного цикла наиболее углубленно мы разобрали тему «Циклические операции в
пакете Mathematica»,
и «Обработка экспериментальных данных в пакете Mathematica».
Практическим результатом летней учебной практики
стали верно, выполненные три лабораторные работы с отчётами и рассмотренный
вопрос для углубленного изучения. Также практическим результатом нашей летней
практики является презентация пройденного материала, что включает в себя общий
отчёт по пройденной летней учебной практики, устная защита и презентация Microsoft
Power Point.
Конечным результатом летней учебной практики
являются приобретённые навыки, полученные новые и закреплённые старые знания, а
так же практические умение работы с пакетом Mathematica
и умение посредством анализа провести сравнение между различными языками
программирования.
Список использованной литературы
1. Аладьев В.З., Бойко В.К.,
Ровба Е.А. Программирование в пакетах Maple
и Mathematica: Сравнительный
аспект: Учебное пособие. - Гродно: 2011 г. - 516 стр.
. Аладьев В.З., Бойко В.К.,
Ровба Е.А. Программирование и разработка приложений в Maple:
Учебное пособие. - Гродно - Таллинн: 2007 г. - 459 стр.
. Большакова И.В., Мастяница
В.С. Экономико-математические расчёты в системе Mathematica:
Учебное пособие. - Минск: 2005 г. - 128 стр.
. Гринберг А.С., Иванюкович
В.А., Скуратович Е.А. Практикум по высшей математике на персональном
компьютере: Учебное пособие - Минск: 2001 г. - 116 стр.
. Дьяконов В.П. Mathematica
5/6/7 Полное руководство. - Москва: 2010 г. - 624 стр.
. Дьяконов В. П.
Математическая система Maple:
Учебное пособие. - Москва: 1998 г. - 397 стр.
. Задания к лабораторным
работам и Методические пособия к ним, предоставленные нам преподавателем.
. Калинин Б.Н. Методическое
пособие по дисциплине «Вычислительная математика». - Москва: 2006 г. - 31 стр.
. Чигарев А.В., Кравчук А.И.,
Кравчук А.С. Основы системы Mathematica.
Задачи и решения: Учебное пособие. - Минск: 2002 г. - 150 стр.
Приложение
Здесь представлена таблица отсортированных
элементов из лабораторной работы № 2, задание 2, пункт 4:
{
{-7.4782, 0.0106483},
{-6.85853, 0.0155772},
{-5.78615, 0.027839},
{-5.03823, 0.0393735},
{-4.99631, 0.0400891},
{-4.98803, 0.0402313},
{-4.70885, 0.0451759},
{-4.66189, 0.0460352},
{-4.65957, 0.0460779},
{-4.14826, 0.055878},
{-4.10359, 0.0567668},
{-4.00253, 0.0587934},
{-3.78303, 0.0632571},
{-3.70748, 0.0648086},
{-3.4716, 0.0696824},
{-3.42546, 0.0706385},
{-3.33794, 0.0724518},
{-3.26111, 0.0740419},
{-3.23262, 0.0746307},
{-3.22664, 0.0747543},
{-3.18977, 0.0755155},
{-3.03802, 0.0786339},
{-2.99739, 0.079464},
{-2.92275, 0.0809819},
{-2.76488, 0.084156},
{-2.73958, 0.0846594},
{-2.59039, 0.0875915},
{-2.56396, 0.0881041},
{-2.53653, 0.0886334},
{-2.48824, 0.0895591},
{-2.42702, 0.0907205},
{-2.31468, 0.0928136},
{-2.26879, 0.0936532},
{-2.23725, 0.0942249},
{-2.18801, 0.0951082},
{-2.18487, 0.095164},
{-2.17403, 0.0953569},
{-2.16714, 0.0954791},
{-2.08527, 0.096913},
{-2.00528, 0.0982804},
{-1.9779, 0.0987404},
{-1.95213, 0.0991696},
{-1.92017, 0.0996964},
{-1.88082, 0.100337},
{-1.83551, 0.101063},
{-1.77032, 0.102086},
{-1.74419, 0.102488},
{-1.69581, 0.103221},
{-1.68421, 0.103394},
{-1.6214, 0.104317},
{-1.61288, 0.104441},
{-1.57167, 0.105029},
{-1.52306, 0.105708},
{-1.51899, 0.105764},
{-1.49981, 0.106026},
{-1.43581, 0.106883},
{-1.38891, 0.107491},
{-1.38107, 0.107591},
{-1.37897, 0.107618},
{-1.26905, 0.108967},
{-1.24768, 0.109219},
{-1.20729, 0.109683},
{-1.18774, 0.109903},
{-1.12867, 0.110549},
{-1.10224, 0.110829},
{-1.02905, 0.111571},
{-1.0246, 0.111615},
{-0.916701, 0.112621},
{-0.878606, 0.112951},
{-0.845743, 0.113225},
{-0.831933, 0.113338},
{-0.75413, 0.113938},
{-0.751781, 0.113955},
{-0.709905, 0.114254},
{-0.698932, 0.11433},
{-0.6642, 0.114562},
{-0.629672, 0.114782},
{-0.611002, 0.114895},
{-0.603572, 0.11494},
{-0.557605, 0.115203},
{-0.55321, 0.115227},
{-0.551948, 0.115234},
{-0.511814, 0.115445},
{-0.385103, 0.116008},
{-0.372646, 0.116055},
{-0.356314, 0.116114},
{-0.354265, 0.116121},
{-0.34753, 0.116145},
{-0.301259, 0.116294},
{-0.287058, 0.116336},
{-0.27696, 0.116364},
{-0.271608, 0.116379},
{-0.246378, 0.116444},
{-0.227495, 0.116488},
{-0.223415, 0.116498},
{-0.194202, 0.116558},
{-0.151379, 0.116632},
{-0.122362, 0.116672},
{-0.120863, 0.116674},
{-0.0866393, 0.116709},
{-0.0829562, 0.116712},
{-0.0585845, 0.11673},
{0.00600694, 0.116747},
{0.0606645, 0.116728},
{0.096617, 0.1167},
{0.113049, 0.116683},
{0.196407, 0.116554},
{0.202199, 0.116543},
{0.237233, 0.116466},
{0.255625, 0.116421},
{0.29595, 0.11631},
{0.346224, 0.116149},
{0.413565, 0.115895},
{0.443302, 0.115769},
{0.44741, 0.11575},
{0.468027, 0.115657},
{0.469277, 0.115651},
{0.470993, 0.115643},
{0.492542, 0.11554},
{0.518275, 0.115412},
{0.53809, 0.115308},
{0.543459, 0.11528},
{0.544308, 0.115275},
{0.581366, 0.115069},
{0.587041, 0.115037},
{0.632007, 0.114767},
{0.635349, 0.114746},
{0.64768, 0.114669},
{0.651488, 0.114644},
{0.662533, 0.114573},
{0.665815, 0.114552},
{0.675237, 0.11449},
{0.689789, 0.114392},
{0.7502, 0.113967},
{0.767072, 0.113842},
{0.789008, 0.113676},
{0.793117, 0.113644},
{0.841433, 0.113261},
{0.843524, 0.113243},
{0.845986, 0.113223},
{0.848055, 0.113206},
{0.848552, 0.113202},
{0.859214, 0.113114},
{0.938491, 0.112426},
{0.942623, 0.112388},
{0.953243, 0.112292},
{0.980984, 0.112034},
{0.983599, 0.112009},
{0.996821, 0.111884},
{1.052, 0.111343},
{1.05875, 0.111276},
{1.06756, 0.111186},
{1.09044, 0.110951},
{1.13021, 0.110533},
{1.13087, 0.110526},
{1.17871, 0.110004},
{1.17948, 0.109995},
{1.18695, 0.109912},
{1.19486, 0.109824},
{1.20989, 0.109654},
{1.23078, 0.109415},
{1.24848, 0.109209},
{1.3046, 0.108541},
{1.3614, 0.10784},
{1.37143, 0.107713},
{1.3781, 0.107629},
{1.404, 0.107297},
{1.43329, 0.106916},
{1.44496, 0.106762},
{1.52335, 0.105704},
{1.53267, 0.105575},
{1.55543, 0.105258},
{1.57512, 0.10498},
{1.59, 0.104769},
{1.59574, 0.104687},
{1.61586, 0.104398},
{1.62506, 0.104264},
{1.63726, 0.104087},
{1.6373, 0.104086},
{1.65432, 0.103837},
{1.65705, 0.103797},
{1.66669, 0.103654},
{1.6706, 0.103596},
{1.67353, 0.103553},
{1.70747, 0.103045},
{1.73143, 0.102682},
{1.78421, 0.10187},
{1.89903, 0.100042},
{1.90419, 0.0999577},
{1.90603, 0.0999277},
{1.90629, 0.0999235},
{1.90665, 0.0999175},
{1.96055, 0.0990298},
{1.98199, 0.098672},
{2.01035, 0.0981947},
{2.04085, 0.0976765},
{2.0738, 0.0971111},
{2.12778, 0.0961726},
{2.17575, 0.0953263},
{2.18609, 0.0951424},
{2.19928, 0.094907},
{2.20195, 0.0948592},
{2.23117, 0.0943345},
{2.23316, 0.0942988},
{2.23396, 0.0942844},
{2.25542, 0.0938961},
{2.27076, 0.0936174},
{2.27567, 0.0935279},
{2.29102, 0.0932476},
{2.31354, 0.0928345},
{2.32149, 0.0926882},
{2.36292, 0.091921},
{2.38063, 0.0915911},
{2.39664, 0.0912916},
{2.39669, 0.0912906},
{2.40942, 0.0910518},
{2.42112, 0.0908317},
{2.4298, 0.0906681},
{2.47151, 0.0898779},
{2.4887, 0.0895503},
{2.51912, 0.0889681},
{2.52577, 0.0888403},
{2.52746, 0.0888079},
{2.53212, 0.0887183},
{2.59852, 0.0874335},
{2.6223, 0.0869699},
{2.62337, 0.086949},
{2.66297, 0.086173},
{2.66701, 0.0860936},
{2.69592, 0.0855241},
{2.73373, 0.0847756},
{2.7929, 0.0835968},
{2.80427, 0.0833692},
{2.80586, 0.0833373},
{2.82836, 0.0828863},
{2.90151, 0.0814119},
{2.90782, 0.0812842},
{2.91626, 0.0811133},
{2.96886, 0.0800453},
{2.97023, 0.0800174},
{2.99671, 0.0794779},
{3.00748, 0.0792581},
{3.02658, 0.0788679},
{3.02876, 0.0788234},
{3.05275, 0.0783325},
{3.06567, 0.0780677},
{3.07282, 0.0779212},
{3.1035, 0.0772915},
{3.11883, 0.0769764},
{3.18641, 0.0755848},
{3.19925, 0.0753197},
{3.22277, 0.0748343},
{3.24867, 0.0742991},
{3.26139, 0.0740361},
{3.26271, 0.0740088},
{3.28102, 0.0736301},
{3.30084, 0.0732199},
{3.32045, 0.0728139},
{3.35878, 0.0720201},
{3.36354, 0.0719215},
{3.42813, 0.0705831},
{3.44019, 0.0703332},
{3.45265, 0.070075},
{3.52587, 0.0685586},
{3.53392, 0.0683919},
{3.53821, 0.0683031},
{3.54464, 0.0681701},
{3.55603, 0.0679343},
{3.59112, 0.0672087},
{3.61139, 0.0667899},
{3.62968, 0.0664122},
{3.66369, 0.0657106},
{3.67209, 0.0655373},
{3.68236, 0.0653258},
{3.69415, 0.065083},
{3.69864, 0.0649906},
{3.70662, 0.0648264},
{3.72322, 0.0644848},
{3.73264, 0.0642912},
{3.74054, 0.0641289},
{3.75064, 0.0639214},
{3.77697, 0.0633812},
{3.78409, 0.0632354},
{3.85874, 0.0617092},
{3.86947, 0.0614906},
{3.90501, 0.0607672},
{3.97131, 0.0594235},
{4.0508, 0.0578229},
{4.06708, 0.0574966},
{4.07816, 0.057275},
{4.10886, 0.0566617},
{4.11379, 0.0565636},
{4.11521, 0.0565352},
{4.11856, 0.0564685},
{4.12071, 0.0564256},
{4.12377, 0.0563648},
{4.20131, 0.0548282},
{4.24714, 0.0539266},
{4.27764, 0.0533296},
{4.32187, 0.052468},
{4.34414, 0.0520362},
{4.34423, 0.0520345},
{4.39183, 0.0511161},
{4.41343, 0.0507015},
{4.44029, 0.0501878},
{4.45456, 0.0499159},
{4.46596, 0.0496989},
{4.51485, 0.0487733},
{4.52398, 0.0486012},
{4.54656, 0.0481769},
{4.56364, 0.0478569},
{4.59545, 0.0472636},
{4.6114, 0.0469673},
{4.63019, 0.0466194},
{4.63544, 0.0465224},
{4.69813, 0.0453713},
{4.70263, 0.0452893},
{4.70785, 0.0451942},
{4.73968, 0.0446159},
{4.78296, 0.0438354},
{4.79753, 0.0435742},
{4.85061, 0.042629},
{4.86823, 0.0423177},
{4.89684, 0.0418144},
{4.91435, 0.0415079},
{4.9181, 0.0414425},
{4.92057, 0.0413993},
{4.93681, 0.0411165},
{4.94071, 0.0410488},
{4.9465, 0.0409484},
{4.95329, 0.0408306},
{4.96468, 0.0406336},
{4.96777, 0.0405801},
{4.9699, 0.0405434},
{5.00783, 0.0398917},
{5.01737, 0.0397286},
{5.03499, 0.0394285},
{5.07554, 0.0387423},
{5.08171, 0.0386385},
{5.0841, 0.0385984},
{5.15162, 0.0374729},
{5.15972, 0.037339},
{5.16322, 0.0372814},
{5.18311, 0.0369543},
{5.20833, 0.036542},
{5.23206, 0.0361563},
{5.23598, 0.0360929},
{5.28161, 0.0353587},
{5.35496, 0.0341969},
{5.42714, 0.0330763},
{5.43959, 0.0328851},
{5.44066, 0.0328688},
{5.46372, 0.0325167},
{5.46407, 0.0325115},
{5.47144, 0.0323994},
{5.48304, 0.0322235},
{5.50413, 0.0319054},
{5.50956, 0.0318238},
{5.52336, 0.031617},
{5.53203, 0.0314876},
{5.56358, 0.0310191},
{5.58279, 0.030736},
{5.59727, 0.0305236},
{5.60751, 0.0303741},
{5.64536, 0.0298252},
{5.64844, 0.0297807},
{5.6757, 0.0293897},
{5.6916, 0.0291631},
{5.70087, 0.0290315},
{5.72203, 0.0287326},
{5.7467, 0.0283867},
{5.75911, 0.0282136},
{5.85798, 0.0268596},
{5.85966, 0.0268369},
{5.8905, 0.0264238},
{5.89726, 0.0263337},
{5.91352, 0.026118},
{6.02307, 0.0246958},
{6.02478, 0.0246741},
{6.08547, 0.0239096},
{6.09769, 0.0237577},
{6.10041, 0.023724},
{6.12504, 0.02342},
{6.13797, 0.0232616},
{6.16122, 0.0229785},
{6.1738, 0.0228264},
{6.30222, 0.0213128},
{6.34003, 0.020881},
{6.37369, 0.0205019},
{6.38352, 0.0203922},
{6.39353, 0.0202807},
{6.40016, 0.0202072},
{6.47313, 0.0194106},
{6.56679, 0.0184215},
{6.59013, 0.0181809},
{6.60438, 0.0180351},
{6.60617, 0.0180169},
{6.61357, 0.0179415},
{6.69617, 0.0171165},
{6.76254, 0.0164742},
{6.84414, 0.0157093},
{6.84975, 0.0156577},
{6.94866, 0.0147689},
{7.25161, 0.0122842},
{7.27628, 0.0120971},
{7.32872, 0.0117068},
{7.38742, 0.0112817},
{7.42035, 0.0110487},
{7.42969, 0.0109832},
{7.471, 0.0106975},
{7.4798, 0.0106374},
{7.52678, 0.0103211},
{7.61499, 0.00974737},
{7.62953, 0.00965531},
{7.6969, 0.0092377},
{7.71255, 0.00914279},
{7.76698, 0.00881882},
{8.02356, 0.00741425},
{8.03289, 0.00736683},
{8.08026, 0.00712997},
{8.15724, 0.00675841},
{8.31598, 0.00604249},
{8.31929, 0.00602822},
{8.43413, 0.00555154},
{8.49317, 0.00531896},
{8.63742, 0.00478492},
{8.86813, 0.00402505},
{8.92102, 0.00386611},
{9.05229, 0.0034946},
{9.12741, 0.0032961},
{9.15409, 0.003228},
{9.29459, 0.00288887},
{9.41283, 0.00262781},
{9.55927, 0.00233309},
{10.4673, 0.0010709},
{11.0329, 0.000636271},
{11.0592, 0.000620586},
{11.2544, 0.000515024},
{11.7031, 0.000331333},
{12.1107, 0.000218662}}