Основы работы в системе компьютерной алгебры Mathematica

Классы данных в Mathematica

Разбить на страницы
Показывать лекцию целиком

Цель лекции: познакомиться с синтаксисом языка Mathematica, основными типами данных и принципами работы с ними.

2.0. Введение

Как отмечает Е. М. Воробьёв в книге [1, с. 15], в основе работы Mathematica лежат два фундаментальных понятия — выражение и вычисление. Понятие выражениям дают А.Н. Прокопеня и А.В. Чичурин [5, с. 76]: "Любые данные, вводимые пользователем в секции, имеющей тип Input, и предназначенные для обработки ядром, Математика рассматривает как выражения (от слова expression). Простейшими являются так называемые атомарные выражения, т.е. числа, символы и строки".

Выражения, отличные от атомарных, называют сложными.

В общем случае Mathematica оперирует выражениями, относящимися к трём классами данных (Е. М. Воробьёв [2, с. 158]). Это

  • численные данные (или числа);
  • символьные данные (символы, тексты, формулы);
  • списки (массивы данных).
  • Познакомимся с каждым классом данных в Mathematica. Формат изложения и основные определения позаимствуем в книге В. П. Дьяконова [2].

    2.1. Численные данные

    Mathematica использует четыре типа чисел: целые, рациональные, вещественные и комплексные, — причём все они относятся к атомарным выражениям.

    Для того чтобы определить, к какому типу относятся численные данные, следует воспользоваться специальной функцией Head — см. рис. 2.1.

    (рис 2.1) Атомарные выражения в Mathematica: числа

    "Целочисленные данные (Integer) – это целые числа, например 1, 2 или 123, которые представляются системой без погрешности и ограничения разрядности. Более того, арифметические операции над целыми числами система выполняет также без погрешностей и без ограничения числа цифр" (В. П. Дьяконов [2, с. 160]).

    Количество цифр, задающих число, ограничено лишь его значением. Другой тип данных — рациональные данные — В. П. Дьяконов [2, с. 160] определяет следующим образом: "Рациональные данные задаются отношением целых чисел, например 123/567, и также представляют результат точно". Mathematica всегда, если это возможно, старается выдать точный результат — в виде целых или рациональных чисел — см. примеры на рис. 2.2.

    Если во входной ячейке задана дробь, числитель и знаменатель которой являются целыми числами, причём числитель нацело делится на знаменатель, то это число является не рациональным, а целым. Так, например, число 30/15 является целым — см. пример In[7] на рис. 2.2.

    (рис 2.2) Операции с целыми и рациональными числами

    Вещественные данные задаются числами, которые в общем случае содержат мантиссу с разделёнными точкой целой и дробной частями и порядок, вводимый как степень числа 10 (В. П. Дьяконов [2, с. 160]). Вещественные числа могут иметь мантиссу с любым, но обязательно конечным числом знаков. Разделять мантиссу и порядок можно как знаком умножения " * ", так и пробелом, причём во втором случае в последних версиях Mathematica пробел автоматически заменяется обозначающим умножение крестиком " x ". Целая часть мантиссы, как отмечено в определении, отделяется от дробной части не запятой, а точкой (В. П. Дьяконов [2, с. 161]). Примеры задания вещественных данных см. на рис. 2.3.

    (рис 2.3) Представление вещественных чисел

    Добавление точки к любому целому числу или к числу в числителе и/или знаменателе рационального числа делает его в понимании Mathematica вещественным. Так, 1 есть целое число, но 1. — уже вещественное (ср. примеры In[1] и In[2] на рис. 2.4). Число 7/5 рассматривается как рациональное, но задание числителя как 7. и/или знаменателя как 5. делает его вещественным (ср. примеры In[3], In[4] и In[5]). Дабы представить некоторое выражение expr как вещественное число, используется функция N[ехрr,n], где n — количество цифр результата (пример In[6]).

    (рис 2.4) Преобразование целых и рациональных чисел в вещественные

    Относительно вещественных чисел В. П. Дьяконов [2, с. 161] пишет следующее: "Вещественные числа всегда имеют некоторую погрешность представления результатов из-за неизбежного округления их и существования так называемого "машинного нуля" – наименьшего числа, которое воспринимается как нуль".

    Одним из основных объектов в математике являются комплексные числа. Не обошли их вниманием и разработчики Mathematica. В Mathematica они задаются в виде z=Re[z]+I*Im[z], где I — мнимая единица (квадратный корень из -1), Re[z] — действительная часть комплексного числа z, а Im[z] — его мнимая часть (см. примеры In[1] и In[2] на рис. 2.5 задания комплексных чисел) (В. П. Дьяконов [2, с. 162]). Умножение мнимой единицы на мнимую часть комплексного числа задаётся явно — символом умножения " * " или пробелом. Выделить действительную и мнимую части заданного или полученного в результате вычислений комплексного числа z можно при помощи функций Re[z] и Im[z] соответственно (примеры In[3] и In[4]).

    (рис 2.5) Представление комплексных чисел

    Если в процессе вычислений выполнялось арифметическое действие с числами разных типов, то тип результата вычислений зависит от типа исходных чисел. Проиллюстрируем эту зависимость на примере сложения. В примерах на рис. 2.6 при помощи Head мы будем определять тип результата сложения разнотипных числовых данных. Так сложение целого и рационального чисел в результате даёт рациональное число (пример In[1]), целого и вещественного — вещественное (пример In[2]), целого и комплексного — комплексное (пример In[3]), рационального и вещественного — вещественное (пример In[4]), рационального и комплексного — комплексное (пример In[5]), вещественного и комплексного — комплексное (пример In[6]). Таким образом, присутствие в вычислениях комплексного числа делает результат любого вычисления комплексным, присутствие в вычислениях вещественного числа (при отсутствии комплексного) делает результат вычисления вещественным. Следует отметить, что даже в таком экзотическом случае, когда к целому числу мы прибавляем вещественное число, а затем вычитаем это же вещественное число, результат вычислений всё равно будет вещественным (пример In[7])

    (рис 2.6) Типы чисел, получающихся в результате сложения разнотипных числовых данных

    2.2. Символьные данные

    2.2.1. Символы и строки

    Символы, как сказано выше, относятся к атомарным выражениям. Символы — это последовательность букв, цифр и знака $, не начинающаяся с цифры (Е. М. Воробьёв [1, с. 15]). Например, и буква с, и слово Conjugate являются символами. Убедиться в этом несложно, воспользовавшись уже известной нам функцией Head — см. рис. 2.7. Кроме того, символами в Mathematica являются именованные или "поименованные константы, которые можно рассматривать как функции без аргумента, возвращающие заранее заданное значение" (В. П. Дьяконов [2, с. 167]). Список некоторых именованных констант Mathematica см. на рис. 2.8.

    Символьные данные В. П. Дьяконов [2, с. 163] описывает следующим образом: "Символьные данные в общем случае могут быть отдельными символами (например, a, b,...,z), строками (strings) и математическими выражениями expr (от expression – выражение), представленными в символьном виде".

    (рис 2.7) Атомарные выражения в Mathematica: символы (рис 2.8) Список именованных констант

    Определение строки в Mathematica даёт Е. М. Воробьёв [1, с. 15]: "Строки — это заключённые в кавычки последовательности букв, цифр и специальных символов". Строки, так же, как числа и символы, относятся к атомарным выражениям. Строки могут также содержать в себе управляющие символы, такие, как \" — кавычки (если они используются не для создания строки, а находятся внутри строки), \n — переход на новую строчку, \t — табуляция и др. Отметим, что "управляющие символы не печатаются принтером и не отображаются дисплеем, а лишь заставляют их выполнять назначенные ими действия" (В. П. Дьяконов [2, с. 163]). Функции Mathematica для работы со строками, которые будут описаны в следующей лекции. Несколько примеров работы со строками см. на рис. 2.9.

    (рис 2.9) Атомарные выражения в Mathematica: символы

    2.2.2. Выражения

    Все выражения, и атомарные, и сложные, имеют одну и ту же многоуровневую структуру h[expr1,expr2,...]. Более полно структура выражений Mathematica обсуждается в книге Е. М. Воробьёва [1, с. 113]. На нулевом уровне этой структуры находится заголовок выражения h, на первом уровне — выражения expr1,expr2..., на втором уровне — элементы выражений expr1,expr2.... Е. М. Воробьёв [1, с. 115] пишет: "Глубина выражения численно равна максимальному номеру уровня в выражении плюс единица и является значением функции Depth".

    Выражениями являются как заголовок функции, так и её элементы. Базовыми структурными элементами, "кирпичиками" для построения всех выражений являются атомарные выражения.

    Если вы не уверены, является выражение перед вами атомарным или сложным, Mathematica позволит легко это проверить при помощи функции AtomQ. Если некоторое выражение expr является атомарным, результат вычисления функции AtomQ[expr] будет True, в ином случае — False.

    Заметим, что используемая нами ранее функция Head для определения типа атомарных выражений применительно к сложным выражениям даёт лишь их заголовок — пример In[1] на рис. 2.10. Для того чтобы увидеть выражение в так называемом внутреннем представлении, следует воспользоваться командой FullForm — примеры In[2] и In[3]. Однако применение функции к атомному выражению даёт на выходе само это выражение — примеры In[4] и In[5]. Внутреннее представление или полная форма — это универсальная форма представления выражений, соответствующая структуре h[expr1,expr2,...], содержащей заголовок h и разделённые запятыми аргументы expr1,expr2,... в квадратных скобках. Именно полная форма непосредственно воспринимается ядром системы. Пользователь же при вводе данных задаёт внешнюю форму: она зачастую может совпадать с внутренней.

    Подробней о внутренней форме выражений см. книгу Е. М. Воробьёва [1, с. 113].

    (рис 2.10) Извлечение информации, определяемой заголовком

    Число элементов в выражении определяет его длину, при этом элементом может являться и атомарное выражение, и сложное выражение, и некоторое сочетание сложных и атомарных выражений. В примере In[2] на рис. 2.11, несмотря на большое количество выражений в истинном для Mathematica смысле (здесь одновременно присутствуют сложение и вычитание, умножение и деление, а также нахождение логарифма), число элементов, определяющих длину основного выражения, равняется всего двум, поскольку одним элементом является извлечение логарифма, а вторым — набор действий в скобках.

    (рис 2.11) Определение длины выражения

    Помимо определения числа элементов выражения Mathematica позволяет отдельно обращаться к каждому из этих элементов. Для этих целей служит функция Part[expr,i], где expr — само выражение, i — номер элемента, к которому необходимо обратиться — примеры In[1], In[2] и In[3] на рис. 2.12. При этом нулевым элементом является заголовок выражения — пример In[4].

    (рис 2.12) Обращение к отдельным элементам выражения

    Атомарные выражения не даром имеют такое название: в их структуре нет составных элементов, поэтому при попытке обратиться к первому или следующему элементам атомарного выражения Mathematica будет выдавать ошибку, а обращение к нулевому элементу даст на выходе тип выражения, так же, как и функция Head — см. рис. 2.13.

    (рис 2.13) Попытка обращения к элементам атомарных выражений

    В примере In[3] рисунка 2.13 продемонстрирован ещё один способ обращения к отдельным элементам выражения: expr[[i]], где expr — само выражение, i — номер элемента, к которому необходимо обратиться.

    Наконец, у пользователя может возникнуть необходимость представить некоторые достаточно громоздкие сложные выражения более наглядно во внутренней форме. В этом поможет функция TreeForm, из названия которой должно быть понятно, что она позволяет представить структуру в виде дерева. П. Веллин и др. [14, с. 37] приводит следующий пример для иллюстрации этой возможности Mathematica: мы задаём выражение TreeForm[a*x^2+b*x+c] и на выходе получаем "дерево" с "корнем" в виде заголовка Plus, тремя ветвями, описывающими выражения c, b*x и a*x^2, последняя из которых, в свою очередь, сама имеет ответвление — возведение в степень, — см. рис. 2.14.

    (рис 2.14) Представление сложного выражения в виде «дерева»

    Е. М. Воробьёв [1, с. 116] выделяет четыре основных способа интерпретации выражений:

  • Заголовок h выражения есть название математической функции, например Log, а элементы выражения — аргументы этой функции.
  • Заголовок понимается как команда, например, Simplify, а элементы — как ее адресаты.
  • Заголовок как оператор (Integrate, Plus), применяемый к операндам.
  • Заголовок как указание на тип данных (List, Integer).
  • 2.2.3. Константы, переменные и функции пользователя

    Одна из ключевых возможностей, один из атрибутов любой среды программирования — возможность определять функции, константы и процедуры. Более подробно мы коснёмся этих вопросов в лекциях настоящего курса, посвящённых программированию, здесь приведём лишь сведения общего характера и простейшие примеры.

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

    Такому объекту, как константы, В. П. Дьяконов [2, с. 167] даёт следующее определение: "Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение". Это значение не меняются по ходу вычисления документа. К численным константам относятся любые числа, непосредственно используемые в выражениях. Так, числа 1 и 2 в выражении 2*Cos[1] являются численными константами. В роли идентификатора численной константы выступает само число. В отличие от численных констант, именованные константы имеют собственные идентификаторы

    В. П. Дьяконов [2, с. 168] пишет, что "переменными в системе Mathematica являются поименованные объекты, которые в ходе выполнения документа могут неоднократно принимать различные значения – как численные, так и символьные. При этом символьные значения переменных, в отличие от обычных языков программирования, могут представлять собой как исполняемые математические выражения expr, так и некоторые обобщенные классы функций и объектов. Например, переменная может представлять графический объект, такой как изображение трехмерной поверхности, или звуковой объект, при активизации которого исполняется звук. Значением переменных могут быть также и множественные объекты-списки".

    Для того, чтобы узнать присвоенное ранее значение некоторой переменной expr, следует воспользоваться уже известной нам функцией вызова справки ?expr. На рис. 2.15. представлены примеры задания переменных (In[1]), обращения к ним в процессе расчётов (In[2]) и получения информации о присвоенных значениях (In[3]).

    (рис 2.15) Задание переменных и работа с ними

    В книге В. П. Дьяконова [2, с. 169] даётся понятие идентификаторов переменных: "Имена переменных называют их идентификаторами". — Также оговариваются правила их задания. Так идентификаторы переменных должны быть уникальными: для принципиальной возможности осуществления вычислений они не должны совпадать с именами директив, атрибутов, опций и функций, а также для возможности получения корректных результатов разные переменные должны иметь отличные друг от друга идентификаторы.

    Имена переменных должны начинаться с буквы. Задавать тип переменной заранее ненужно: Mathematica сама это сделает в требующийся момент.

    Переменные в системе Mathematica являются глобальными, то есть, задать и изменить значение переменной можно в любом месте программы. В результате вычисления выражения var=expr переменной var присваивается значение expr. Ниже представлены основные операции по присваиванию переменным значений (В. П. Дьяконов [2, с. 169–170]).

    х = expr — происходит присвоение переменной х вычисленного значения expr;

    х = у = expr — присвоение вычисленного значения expr происходит переменным х и у;

    x:=expr — переменной х присваивается невычисленное значение expr;

    х =. — с переменной х снимается определение.

    На рисунке 2.16 пояснена разница между оператором присваивания " = " и оператором отложенного присваивания " := ". После первоначальных присваиваний b=а и с:=а обе переменные, b и с, имеют значение 10. Однако после присваивания переменной а нового значения (20) переменная b, которой было присвоено вычисленное значение а, остается равной 10, а переменная с, которой было присвоено невычисленное значение а, становится равной 20.

    Крайне важна возможность снятия с переменной определения с помощью оператора " =. " или функции Clear[var]. Это крайне важно, поскольку переменные с одним и тем же именем могут использоваться в совершенно разных целях в разных частях программы. Более того, эти объекты сохраняются даже при работе с другим документом Mathematica. Поэтому рекомендуется всякий раз удалять определения переменных, как только их использование завершается. Во-первых, это уменьшает вероятность получения неадекватных результатов расчётов, и, во-вторых, освобождает память.

    (рис 2.16) Различие между операторами присваивания и отложенного присваивания

    О следующем инструменте системы Mathematica В. П. Дьяконов [2, с. 173] пишет следующее: "Хотя в систему входят сотни встроенных функций (начиная от элементарных и кончая специальными математическими функциями и системными функциями), нередко требуется расширить её вводом новых функций, действие которых задаётся пользователем. Такие функции принято называть функциями пользователя".

    Для задания функции f необходимо воспользоваться следующей конструкцией: f[x_], где выражение в квадратных скобках x_ обозначает переменную, которая будет подставлена в правую часть функции вместо x. Более подробно о пользовательских функциях мы поговорим в лекции, посвящённой функциональному программированию. Здесь приведём пример задания некоторой пользовательской функции и её выполнения для некоторой переменной — см. рис. 2.17.

    (рис 2.17) Работа с пользовательскими функциями.

    2.2.4. Предикаты

    При работе с данными часто возникает необходимость проверить, удовлетворяет ли то или иное выражение некоторому критерию, условию. Для этих целей в Mathematica существуют конструкции, позволяющие тестировать данные на удовлетворение тем или иным условиям. Подобные конструкции называются предикатами. Предикат — функция, возвращающая логическое значение True или False в зависимости от того, удовлетворяет или не удовлетворяет их аргумент условию проверки (П. Веллин и др. [14, с. 45]). Приведём предикаты, наиболее часто используемые в Mathematica.

  • PrimeQ[expr] — проверяет, является ли аргумент expr простым числом,
  • EvenQ[expr] — чётным числом,
  • OddQ[expr] — нечётным числом,
  • IntegerQ[expr] — целым числом;
  • NumericQ[expr] — принимает ли аргумент expr численное значение;
  • AtomQ[expr] — является ли выражение в аргументе expr атомарным,
  • ListQ[expr] — списком,
  • MatrixQ[expr] — вложенным списком второго уровня (матрицей);
  • IntervalMemberQ[Interval[{l,r}],expr] — лежит ли выражение expr в интервале от l до r;
  • PolynomialQ[expr1,expr2] — является ли выражение expr1 полиномом относительно выражения expr2.
  • Примеры, иллюстрирующие действие приведённых выше функций, представлены на рис. 2.18.

    (рис 2.18) Использование предикатов в Mathematica

    2.2.5. Операторы отношений и логические операторы

    Существует ряд предикатов, выделенных в отдельную группу операторов отношений. В. П. Дьяконов [2, с. 183] пишет: "Логическими принято называть операции, отражающие чисто логическое соответствие между данными. В математике (да и в информатике) принято характеризовать логическое соответствие утверждениями True (Верно или Да) и False (Неверно или Нет). Слова True и False являются символьными константами, отражающими результаты логических операций и в системе Mathematica".

    В Mathematica операторы отношений задаются следующим образом:

  • Equal[expr1,expr2] (или expr1==expr2) — равно,
  • Unequal[expr1,expr2] (или expr1!=expr2) — неравно,
  • Greater[expr1,expr2] (или expr1<expr2) — больше,
  • Less[expr1,expr2] (или expr1<expr2</expr2) — меньше,
  • GreaterEqual[expr1,expr2] (или expr1>=expr2) — больше или равно,
  • LessEqual[expr1,expr2] (или expr1<=expr2) — меньше или равно.
  • Несколько примеров использования операторов отношений представлено на рис. 2.19.

    (рис 2.19) Операторы отношений в Mathematica

    Логические операторы (известные также как булевы функции, булевы операторы) определяют правильность выражений, основных на булевой алгебре (П. Веллин и др. [14, с. 47]).

    Логические операторы задаются следующим образом:

  • Not[expr] или !expr — логическое отрицание,
  • And[expr1,expr2,...] или expr1expr2... — логическое умножение, операция "И" ,
  • Or[expr1,expr2,...] или expr1||expr1||... — логическое сложение, операция "ИЛИ"
  • Xor[expr1,expr2,...] или (expr1||expr1)!(expr1expr1) — сложение по модулю 2, операция "исключающее ИЛИ".
  • На рис. 2.20 приведены примеры использования логических операторов.

    (рис 2.20) Логические операторы в Mathematica

    2.3. Списки

    Последним классом данных, которого мы ещё не коснулись, являются списки.

    Список представляет собой удобную форму структурирования данных, по строению представляет собой множество элементов, заключённых в фигурные скобки { } и разделённых запятыми: {expr1,expr2,...}. Все списки относятся к сложным выражениям.

    В качестве элементов списка expr1, expr2,... могут выступать как однотипные (примеры In[1] и In[2] на рис. 2.21), так и разнотипные (пример In[3]) данные. Список может содержать и один элемент: тогда он выглядит как некоторое выражение, обособленное скобками (пример In[4]). Элементы списка сами могут являться списками (пример In[5]). Более подробно со списками мы познакомимся в следующей лекции.

    (рис 2.21) Списки в Mathematica

    2.4. Атрибуты

    Все функции в Mathematica обладают определёнными свойствами, называемыми атрибутами. Атрибуты той или иной функции можно узнать, применив к ней функцию Attributes. Воспользуемся подходом П. Веллина и др. [14, с. 50–51] к рассмотрению некоторых атрибутов на примере функции Plus — см. рис. 2.22.

    (рис 2.22) Атрибуты функции Plus

    Атрибут функции Flat соответствует свойству ассоциативности. В программировании ассоциативностью (или очерёдностью) называют последовательность выполнения действий (или направление вычисления), реализуемое, когда операторы имеют одинаковый приоритет и отсутствует явное (с помощью скобок) указание на очерёдность их выполнения. На примере функции Plus понятие ассоциативности можно сформулировать более простым языком: если необходимо сложить друг с другом три элемента, то не имеет значения, какие два из них будут сложены первыми. Математическим языком это свойство можно представить как $$a+(b+c)=(a+b)+c$$. На примере выражений Mathematica это можно проиллюстрировать, сказав, что выражения Plus[Plus[a,b],c] и Plus[a,Plus[b,c]] эквивалентны одноуровневому выражению Plus[a,b,c]. Если Mathematica определяет ту или иную функцию как ассоциативную, она записывает её в одноуровневой форме — см. рис. 2.23.

    (рис 2.23) Атрибут Flat: свойство ассоциативности

    Атрибут Orderless обозначает свойство коммутативности; это означает, что для обладающей им функции не имеет значения порядок её аргументов. На примере сложения в математике это свойство можно проиллюстрировать как $$a+b=b+a$$. Mathematica сортирует выражения в так называемом каноническом порядке. Выражения, состоящие из букв и слов, сортируются по алфавиту (пример In[1] на рис. 2.24), степенные многочлены сортируются по степени переменной (пример In[2]). Однако, иногда сортировка, которую осуществляет Mathematica, неочевидна и диктуется исключительно нуждами программы (пример In[3]).

    (рис 2.24) Атрибут Orderless: свойство коммутативности

    Когда выражение имеет атрибут Protected, это означает, что пользователь не может каким-либо образом изменять это выражение. Все встроенные функции обладают этим атрибутом.

    Атрибут OneIdentity означает, что повторное применение функции, обладающей этим атрибутом, к одному и тому же аргументу не будет иметь эффекта. Например, в Mathematica выражения Plus[Plus[a,b]] и Plus[a,b] будут эквивалентны друг другу.

    В Mathematica имеется возможность изменять атрибуты функций. И если делать это со встроенными функции кажется нерациональным и бессмысленным, то определять атрибуты для пользовательских функций может оказаться полезным. Например, имеется функция, для которой вы хотите задать атрибут Orderless. Если без этого атрибута функция не изменяет порядок собственных аргументов (см. пример In[1] на рис. 2.25), то с ним она автоматически сортирует аргументы согласно встроенным правилам сортировки (последовательно примеры In[2] и In[3]). Для задания атрибутов выражений используется функция SetAttributes[expr,a], где expr — само выражение, a — задаваемый атрибут. Для задания одновременно нескольких атрибутов функция применяется в виде SetAttributes[expr,{a1,a2,...}], где a1,a2,.. — задаваемые атрибуты.

    (рис 2.25) Задание атрибутов выражения при помощи функции SetAttributes

    Ключевые термины

    Ассоциативность (или очерёдность) — последовательность выполнения действий (или направление вычисления), реализуемое, когда операторы имеют одинаковый приоритет и отсутствует явное (с помощью скобок) указание на очерёдность их выполнения.

    Атрибуты — свойства выражений Mathematica.

    Атомарными называют простейшие выражения Mathematica.

    Вещественные данные — числа, которые в общем случае содержат мантиссу с разделёнными точкой целой и дробной частями и порядок, вводимый как степень числа 10.

    Внутреннее представление или полная форма — это универсальная форма представления выражений, соответствующая структуре h[expr1,expr2,...], содержащей заголовок h и разделённые запятыми аргументы expr1,expr2,... в квадратных скобках

    Выражениями называются любые данные, вводимые пользователем в секции Input и предназначенные для обработки ядром.

    Глубина выражения — максимальный номер уровня в выражении плюс единица.

    Идентификаторами называются имена переменных.

    Именованная константа — выражение, которое рассматривается программой как функция без аргумента, возвращающая заранее заданное значение.

    Коммутативность — свойство функции, которое означает, что наделенная им функция безразлична к порядку ее аргументов.

    Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение.

    Логические операторы (известные также как булевы функции, булевы операторы) — выражения, определяющие правильность выражений, основных на булевой алгебре.

    Оператор отношений — предикат, отражающий логическое соответствие между данными.

    Машинный ноль — наименьшее число, которое воспринимается системой как ноль.

    Переменными в системе Mathematica являются именованные объекты, способные в ходе выполнения документа неоднократно принимать различные значения — как численные, так и символьные.

    Предикат/ — функция, возвращающая логическое значение True или False в зависимости от того, удовлетворяет или не удовлетворяет их аргумент условию проверки.

    Рациональные данные — отношения целых чисел, которые представляются системой без погрешности и ограничения точности.

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

    Список — форма структурирования данных, по строению представляющая собой множество элементов, заключённых в фигурные скобки и разделённых запятыми.

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

    Функция пользователя — набор правил, задаваемых пользователем.

    Целочисленные данные — это целые числа, которые представляются системой без погрешности и ограничения разрядности.

    Краткие итоги

    В данной лекции мы подробно познакомились с двумя классами данных Mathematica — численными и символьными данными, а также получили начальную информацию о третьем классе данных — списках. Мы узнали об основных отличиях при задании пользователем и использовании программой целых, рациональных, вещественных и комплексных чисел. Мы познакомились с ключевым понятием Mathematica — выражением, научились задавать простейшие атомарные выражения и конструировать из них сложные выражения. Мы узнали о "двуличии" выражений Mathematica — о том, что они обладают, по меньшей мере, двумя представлениями: внутренним и внешним. Мы научились обращаться к отдельным элементам сложных выражений. Мы познакомились с такими объектами системы, как константы, переменные и пользовательские функции, и научились пользоваться ключевыми операторами системы — присваиванием и отложенным присваиванием. Мы научились проверять выражения на соответствие тем или иным условиям при помощи предикатов, в том числе, операторов отношений и логических операторов. Мы узнали о возможности придания функциям определённых свойств при помощи атрибутов и познакомились с некоторыми из них.

    Вопросы

  • Что называют выражением в Mathematica? Что такое атомарное выражение?
  • К каким классам данных могут относиться выражения Mathematica?
  • Перечислите типы численных данных, раскройте понятия, приведите примеры.
  • К какому типу численных данных будет принадлежать сумма чисел вещественного и целого; рационального и комплексного; вещественного и комплексного; целого и рационального?
  • Что такое символ в Mathematica? Приведите примеры символьных данных.
  • Что такое строка в Mathematica?
  • Какую структуру имеют выражения в Mathematica?
  • Что такое внутреннее представление или полная форма выражения?
  • Каким образом можно узнать внутреннюю форму произвольного выражения Mathematica?
  • Какие объекты являются в Mathematica константами; переменными?
  • Что такое идентификатор? Какими свойствами должен обладать идентификатор?
  • Приведите примеры основных операций по присваиванию переменным значений.
  • На приме поясните разницу между операциями немедленного присваивания и отложенного присваивания.
  • Какие объекты Mathematica называются предикатами? Приведите примеры используемых в Mathematica предикатов.
  • Для чего используются операторы отношений и логические операторы? Приведите примеры операторов.
  • Что такое список в Mathematica?
  • Что такое атрибуты функций Mathematica? Приведите примеры атрибутов.
  • Упражнения

  • Представьте в полной форме выражения a*x^2+b*x+c, Log[p+q*r], x^y^z.
  • Каково традиционное представление заданных в полной форме выражений Power[Plus[x,Log[Plus[x,y]]],2], Plus[a,Power[b,2],Times[-1,Power[c,3]],Power[d,4]], Plus[x,Times[-1,Power[x,y]],Times[2,x,y]]?
  • При помощи функции Head определите тип следующих выражений: 123, 15.46, sometext, "sometext", I+6, {1,a}.
  • Создайте список, элементами которого являются только символьные данные; только численные данные; только списки.
  • Введите в окно редактирования ваше имя, определите тип введённого выражения. Обособьте имя кавычками " ", определите тип полученного выражения. Создайте список, в качестве элементов которого укажите ваши имя, отчество и фамилию.
  • Выведите на экран надпись "I learn Mathematica", чтобы каждое слово начиналось с новой строки.
  • Проверьте, являются ли числа 27, 91, 127, 417, 523 простыми.
  • Сравните между собой выражения $$5.63-3.$$ и $$7.68-4.23$$, $$12.358*1.23$$ и $$10.5*1.46$$, $$2.1^6$$ и $$3^{4.5}$$.
  • Выясните, какими атрибутами обладают функции ListPlot, Sqrt, Sin, Power.
  • Страницы:

    Цель лекции: познакомиться с синтаксисом языка Mathematica, основными типами данных и принципами работы с ними.

    2.0. Введение

    Как отмечает Е. М. Воробьёв в книге [1, с. 15], в основе работы Mathematica лежат два фундаментальных понятия — выражение и вычисление. Понятие выражениям дают А.Н. Прокопеня и А.В. Чичурин [5, с. 76]: "Любые данные, вводимые пользователем в секции, имеющей тип Input, и предназначенные для обработки ядром, Математика рассматривает как выражения (от слова expression). Простейшими являются так называемые атомарные выражения, т.е. числа, символы и строки".

    Выражения, отличные от атомарных, называют сложными.

    В общем случае Mathematica оперирует выражениями, относящимися к трём классами данных (Е. М. Воробьёв [2, с. 158]). Это

  • численные данные (или числа);
  • символьные данные (символы, тексты, формулы);
  • списки (массивы данных).
  • Познакомимся с каждым классом данных в Mathematica. Формат изложения и основные определения позаимствуем в книге В. П. Дьяконова [2].

    2.1. Численные данные

    Mathematica использует четыре типа чисел: целые, рациональные, вещественные и комплексные, — причём все они относятся к атомарным выражениям.

    Для того чтобы определить, к какому типу относятся численные данные, следует воспользоваться специальной функцией Head — см. рис. 2.1.

    (рис 2.1) Атомарные выражения в Mathematica: числа

    "Целочисленные данные (Integer) – это целые числа, например 1, 2 или 123, которые представляются системой без погрешности и ограничения разрядности. Более того, арифметические операции над целыми числами система выполняет также без погрешностей и без ограничения числа цифр" (В. П. Дьяконов [2, с. 160]).

    Количество цифр, задающих число, ограничено лишь его значением. Другой тип данных — рациональные данные — В. П. Дьяконов [2, с. 160] определяет следующим образом: "Рациональные данные задаются отношением целых чисел, например 123/567, и также представляют результат точно". Mathematica всегда, если это возможно, старается выдать точный результат — в виде целых или рациональных чисел — см. примеры на рис. 2.2.

    Если во входной ячейке задана дробь, числитель и знаменатель которой являются целыми числами, причём числитель нацело делится на знаменатель, то это число является не рациональным, а целым. Так, например, число 30/15 является целым — см. пример In[7] на рис. 2.2.

    (рис 2.2) Операции с целыми и рациональными числами

    Вещественные данные задаются числами, которые в общем случае содержат мантиссу с разделёнными точкой целой и дробной частями и порядок, вводимый как степень числа 10 (В. П. Дьяконов [2, с. 160]). Вещественные числа могут иметь мантиссу с любым, но обязательно конечным числом знаков. Разделять мантиссу и порядок можно как знаком умножения " * ", так и пробелом, причём во втором случае в последних версиях Mathematica пробел автоматически заменяется обозначающим умножение крестиком " x ". Целая часть мантиссы, как отмечено в определении, отделяется от дробной части не запятой, а точкой (В. П. Дьяконов [2, с. 161]). Примеры задания вещественных данных см. на рис. 2.3.

    (рис 2.3) Представление вещественных чисел

    Добавление точки к любому целому числу или к числу в числителе и/или знаменателе рационального числа делает его в понимании Mathematica вещественным. Так, 1 есть целое число, но 1. — уже вещественное (ср. примеры In[1] и In[2] на рис. 2.4). Число 7/5 рассматривается как рациональное, но задание числителя как 7. и/или знаменателя как 5. делает его вещественным (ср. примеры In[3], In[4] и In[5]). Дабы представить некоторое выражение expr как вещественное число, используется функция N[ехрr,n], где n — количество цифр результата (пример In[6]).

    (рис 2.4) Преобразование целых и рациональных чисел в вещественные

    Относительно вещественных чисел В. П. Дьяконов [2, с. 161] пишет следующее: "Вещественные числа всегда имеют некоторую погрешность представления результатов из-за неизбежного округления их и существования так называемого "машинного нуля" – наименьшего числа, которое воспринимается как нуль".

    Одним из основных объектов в математике являются комплексные числа. Не обошли их вниманием и разработчики Mathematica. В Mathematica они задаются в виде z=Re[z]+I*Im[z], где I — мнимая единица (квадратный корень из -1), Re[z] — действительная часть комплексного числа z, а Im[z] — его мнимая часть (см. примеры In[1] и In[2] на рис. 2.5 задания комплексных чисел) (В. П. Дьяконов [2, с. 162]). Умножение мнимой единицы на мнимую часть комплексного числа задаётся явно — символом умножения " * " или пробелом. Выделить действительную и мнимую части заданного или полученного в результате вычислений комплексного числа z можно при помощи функций Re[z] и Im[z] соответственно (примеры In[3] и In[4]).

    (рис 2.5) Представление комплексных чисел

    Если в процессе вычислений выполнялось арифметическое действие с числами разных типов, то тип результата вычислений зависит от типа исходных чисел. Проиллюстрируем эту зависимость на примере сложения. В примерах на рис. 2.6 при помощи Head мы будем определять тип результата сложения разнотипных числовых данных. Так сложение целого и рационального чисел в результате даёт рациональное число (пример In[1]), целого и вещественного — вещественное (пример In[2]), целого и комплексного — комплексное (пример In[3]), рационального и вещественного — вещественное (пример In[4]), рационального и комплексного — комплексное (пример In[5]), вещественного и комплексного — комплексное (пример In[6]). Таким образом, присутствие в вычислениях комплексного числа делает результат любого вычисления комплексным, присутствие в вычислениях вещественного числа (при отсутствии комплексного) делает результат вычисления вещественным. Следует отметить, что даже в таком экзотическом случае, когда к целому числу мы прибавляем вещественное число, а затем вычитаем это же вещественное число, результат вычислений всё равно будет вещественным (пример In[7])

    (рис 2.6) Типы чисел, получающихся в результате сложения разнотипных числовых данных

    2.2. Символьные данные

    2.2.1. Символы и строки

    Символы, как сказано выше, относятся к атомарным выражениям. Символы — это последовательность букв, цифр и знака $, не начинающаяся с цифры (Е. М. Воробьёв [1, с. 15]). Например, и буква с, и слово Conjugate являются символами. Убедиться в этом несложно, воспользовавшись уже известной нам функцией Head — см. рис. 2.7. Кроме того, символами в Mathematica являются именованные или "поименованные константы, которые можно рассматривать как функции без аргумента, возвращающие заранее заданное значение" (В. П. Дьяконов [2, с. 167]). Список некоторых именованных констант Mathematica см. на рис. 2.8.

    Символьные данные В. П. Дьяконов [2, с. 163] описывает следующим образом: "Символьные данные в общем случае могут быть отдельными символами (например, a, b,...,z), строками (strings) и математическими выражениями expr (от expression – выражение), представленными в символьном виде".

    (рис 2.7) Атомарные выражения в Mathematica: символы (рис 2.8) Список именованных констант

    Определение строки в Mathematica даёт Е. М. Воробьёв [1, с. 15]: "Строки — это заключённые в кавычки последовательности букв, цифр и специальных символов". Строки, так же, как числа и символы, относятся к атомарным выражениям. Строки могут также содержать в себе управляющие символы, такие, как \" — кавычки (если они используются не для создания строки, а находятся внутри строки), \n — переход на новую строчку, \t — табуляция и др. Отметим, что "управляющие символы не печатаются принтером и не отображаются дисплеем, а лишь заставляют их выполнять назначенные ими действия" (В. П. Дьяконов [2, с. 163]). Функции Mathematica для работы со строками, которые будут описаны в следующей лекции. Несколько примеров работы со строками см. на рис. 2.9.

    (рис 2.9) Атомарные выражения в Mathematica: символы

    2.2.2. Выражения

    Все выражения, и атомарные, и сложные, имеют одну и ту же многоуровневую структуру h[expr1,expr2,...]. Более полно структура выражений Mathematica обсуждается в книге Е. М. Воробьёва [1, с. 113]. На нулевом уровне этой структуры находится заголовок выражения h, на первом уровне — выражения expr1,expr2..., на втором уровне — элементы выражений expr1,expr2.... Е. М. Воробьёв [1, с. 115] пишет: "Глубина выражения численно равна максимальному номеру уровня в выражении плюс единица и является значением функции Depth".

    Выражениями являются как заголовок функции, так и её элементы. Базовыми структурными элементами, "кирпичиками" для построения всех выражений являются атомарные выражения.

    Если вы не уверены, является выражение перед вами атомарным или сложным, Mathematica позволит легко это проверить при помощи функции AtomQ. Если некоторое выражение expr является атомарным, результат вычисления функции AtomQ[expr] будет True, в ином случае — False.

    Заметим, что используемая нами ранее функция Head для определения типа атомарных выражений применительно к сложным выражениям даёт лишь их заголовок — пример In[1] на рис. 2.10. Для того чтобы увидеть выражение в так называемом внутреннем представлении, следует воспользоваться командой FullForm — примеры In[2] и In[3]. Однако применение функции к атомному выражению даёт на выходе само это выражение — примеры In[4] и In[5]. Внутреннее представление или полная форма — это универсальная форма представления выражений, соответствующая структуре h[expr1,expr2,...], содержащей заголовок h и разделённые запятыми аргументы expr1,expr2,... в квадратных скобках. Именно полная форма непосредственно воспринимается ядром системы. Пользователь же при вводе данных задаёт внешнюю форму: она зачастую может совпадать с внутренней.

    Подробней о внутренней форме выражений см. книгу Е. М. Воробьёва [1, с. 113].

    (рис 2.10) Извлечение информации, определяемой заголовком

    Число элементов в выражении определяет его длину, при этом элементом может являться и атомарное выражение, и сложное выражение, и некоторое сочетание сложных и атомарных выражений. В примере In[2] на рис. 2.11, несмотря на большое количество выражений в истинном для Mathematica смысле (здесь одновременно присутствуют сложение и вычитание, умножение и деление, а также нахождение логарифма), число элементов, определяющих длину основного выражения, равняется всего двум, поскольку одним элементом является извлечение логарифма, а вторым — набор действий в скобках.

    (рис 2.11) Определение длины выражения

    Помимо определения числа элементов выражения Mathematica позволяет отдельно обращаться к каждому из этих элементов. Для этих целей служит функция Part[expr,i], где expr — само выражение, i — номер элемента, к которому необходимо обратиться — примеры In[1], In[2] и In[3] на рис. 2.12. При этом нулевым элементом является заголовок выражения — пример In[4].

    (рис 2.12) Обращение к отдельным элементам выражения

    Атомарные выражения не даром имеют такое название: в их структуре нет составных элементов, поэтому при попытке обратиться к первому или следующему элементам атомарного выражения Mathematica будет выдавать ошибку, а обращение к нулевому элементу даст на выходе тип выражения, так же, как и функция Head — см. рис. 2.13.

    (рис 2.13) Попытка обращения к элементам атомарных выражений

    В примере In[3] рисунка 2.13 продемонстрирован ещё один способ обращения к отдельным элементам выражения: expr[[i]], где expr — само выражение, i — номер элемента, к которому необходимо обратиться.

    Наконец, у пользователя может возникнуть необходимость представить некоторые достаточно громоздкие сложные выражения более наглядно во внутренней форме. В этом поможет функция TreeForm, из названия которой должно быть понятно, что она позволяет представить структуру в виде дерева. П. Веллин и др. [14, с. 37] приводит следующий пример для иллюстрации этой возможности Mathematica: мы задаём выражение TreeForm[a*x^2+b*x+c] и на выходе получаем "дерево" с "корнем" в виде заголовка Plus, тремя ветвями, описывающими выражения c, b*x и a*x^2, последняя из которых, в свою очередь, сама имеет ответвление — возведение в степень, — см. рис. 2.14.

    (рис 2.14) Представление сложного выражения в виде «дерева»

    Е. М. Воробьёв [1, с. 116] выделяет четыре основных способа интерпретации выражений:

  • Заголовок h выражения есть название математической функции, например Log, а элементы выражения — аргументы этой функции.
  • Заголовок понимается как команда, например, Simplify, а элементы — как ее адресаты.
  • Заголовок как оператор (Integrate, Plus), применяемый к операндам.
  • Заголовок как указание на тип данных (List, Integer).
  • 2.2.3. Константы, переменные и функции пользователя

    Одна из ключевых возможностей, один из атрибутов любой среды программирования — возможность определять функции, константы и процедуры. Более подробно мы коснёмся этих вопросов в лекциях настоящего курса, посвящённых программированию, здесь приведём лишь сведения общего характера и простейшие примеры.

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

    Такому объекту, как константы, В. П. Дьяконов [2, с. 167] даёт следующее определение: "Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение". Это значение не меняются по ходу вычисления документа. К численным константам относятся любые числа, непосредственно используемые в выражениях. Так, числа 1 и 2 в выражении 2*Cos[1] являются численными константами. В роли идентификатора численной константы выступает само число. В отличие от численных констант, именованные константы имеют собственные идентификаторы

    В. П. Дьяконов [2, с. 168] пишет, что "переменными в системе Mathematica являются поименованные объекты, которые в ходе выполнения документа могут неоднократно принимать различные значения – как численные, так и символьные. При этом символьные значения переменных, в отличие от обычных языков программирования, могут представлять собой как исполняемые математические выражения expr, так и некоторые обобщенные классы функций и объектов. Например, переменная может представлять графический объект, такой как изображение трехмерной поверхности, или звуковой объект, при активизации которого исполняется звук. Значением переменных могут быть также и множественные объекты-списки".

    Для того, чтобы узнать присвоенное ранее значение некоторой переменной expr, следует воспользоваться уже известной нам функцией вызова справки ?expr. На рис. 2.15. представлены примеры задания переменных (In[1]), обращения к ним в процессе расчётов (In[2]) и получения информации о присвоенных значениях (In[3]).

    (рис 2.15) Задание переменных и работа с ними

    В книге В. П. Дьяконова [2, с. 169] даётся понятие идентификаторов переменных: "Имена переменных называют их идентификаторами". — Также оговариваются правила их задания. Так идентификаторы переменных должны быть уникальными: для принципиальной возможности осуществления вычислений они не должны совпадать с именами директив, атрибутов, опций и функций, а также для возможности получения корректных результатов разные переменные должны иметь отличные друг от друга идентификаторы.

    Имена переменных должны начинаться с буквы. Задавать тип переменной заранее ненужно: Mathematica сама это сделает в требующийся момент.

    Переменные в системе Mathematica являются глобальными, то есть, задать и изменить значение переменной можно в любом месте программы. В результате вычисления выражения var=expr переменной var присваивается значение expr. Ниже представлены основные операции по присваиванию переменным значений (В. П. Дьяконов [2, с. 169–170]).

    х = expr — происходит присвоение переменной х вычисленного значения expr;

    х = у = expr — присвоение вычисленного значения expr происходит переменным х и у;

    x:=expr — переменной х присваивается невычисленное значение expr;

    х =. — с переменной х снимается определение.

    На рисунке 2.16 пояснена разница между оператором присваивания " = " и оператором отложенного присваивания " := ". После первоначальных присваиваний b=а и с:=а обе переменные, b и с, имеют значение 10. Однако после присваивания переменной а нового значения (20) переменная b, которой было присвоено вычисленное значение а, остается равной 10, а переменная с, которой было присвоено невычисленное значение а, становится равной 20.

    Крайне важна возможность снятия с переменной определения с помощью оператора " =. " или функции Clear[var]. Это крайне важно, поскольку переменные с одним и тем же именем могут использоваться в совершенно разных целях в разных частях программы. Более того, эти объекты сохраняются даже при работе с другим документом Mathematica. Поэтому рекомендуется всякий раз удалять определения переменных, как только их использование завершается. Во-первых, это уменьшает вероятность получения неадекватных результатов расчётов, и, во-вторых, освобождает память.

    (рис 2.16) Различие между операторами присваивания и отложенного присваивания

    О следующем инструменте системы Mathematica В. П. Дьяконов [2, с. 173] пишет следующее: "Хотя в систему входят сотни встроенных функций (начиная от элементарных и кончая специальными математическими функциями и системными функциями), нередко требуется расширить её вводом новых функций, действие которых задаётся пользователем. Такие функции принято называть функциями пользователя".

    Для задания функции f необходимо воспользоваться следующей конструкцией: f[x_], где выражение в квадратных скобках x_ обозначает переменную, которая будет подставлена в правую часть функции вместо x. Более подробно о пользовательских функциях мы поговорим в лекции, посвящённой функциональному программированию. Здесь приведём пример задания некоторой пользовательской функции и её выполнения для некоторой переменной — см. рис. 2.17.

    (рис 2.17) Работа с пользовательскими функциями.

    2.2.4. Предикаты

    При работе с данными часто возникает необходимость проверить, удовлетворяет ли то или иное выражение некоторому критерию, условию. Для этих целей в Mathematica существуют конструкции, позволяющие тестировать данные на удовлетворение тем или иным условиям. Подобные конструкции называются предикатами. Предикат — функция, возвращающая логическое значение True или False в зависимости от того, удовлетворяет или не удовлетворяет их аргумент условию проверки (П. Веллин и др. [14, с. 45]). Приведём предикаты, наиболее часто используемые в Mathematica.

  • PrimeQ[expr] — проверяет, является ли аргумент expr простым числом,
  • EvenQ[expr] — чётным числом,
  • OddQ[expr] — нечётным числом,
  • IntegerQ[expr] — целым числом;
  • NumericQ[expr] — принимает ли аргумент expr численное значение;
  • AtomQ[expr] — является ли выражение в аргументе expr атомарным,
  • ListQ[expr] — списком,
  • MatrixQ[expr] — вложенным списком второго уровня (матрицей);
  • IntervalMemberQ[Interval[{l,r}],expr] — лежит ли выражение expr в интервале от l до r;
  • PolynomialQ[expr1,expr2] — является ли выражение expr1 полиномом относительно выражения expr2.
  • Примеры, иллюстрирующие действие приведённых выше функций, представлены на рис. 2.18.

    (рис 2.18) Использование предикатов в Mathematica

    2.2.5. Операторы отношений и логические операторы

    Существует ряд предикатов, выделенных в отдельную группу операторов отношений. В. П. Дьяконов [2, с. 183] пишет: "Логическими принято называть операции, отражающие чисто логическое соответствие между данными. В математике (да и в информатике) принято характеризовать логическое соответствие утверждениями True (Верно или Да) и False (Неверно или Нет). Слова True и False являются символьными константами, отражающими результаты логических операций и в системе Mathematica".

    В Mathematica операторы отношений задаются следующим образом:

  • Equal[expr1,expr2] (или expr1==expr2) — равно,
  • Unequal[expr1,expr2] (или expr1!=expr2) — неравно,
  • Greater[expr1,expr2] (или expr1<expr2) — больше,
  • Less[expr1,expr2] (или expr1<expr2</expr2) — меньше,
  • GreaterEqual[expr1,expr2] (или expr1>=expr2) — больше или равно,
  • LessEqual[expr1,expr2] (или expr1<=expr2) — меньше или равно.
  • Несколько примеров использования операторов отношений представлено на рис. 2.19.

    (рис 2.19) Операторы отношений в Mathematica

    Логические операторы (известные также как булевы функции, булевы операторы) определяют правильность выражений, основных на булевой алгебре (П. Веллин и др. [14, с. 47]).

    Логические операторы задаются следующим образом:

  • Not[expr] или !expr — логическое отрицание,
  • And[expr1,expr2,...] или expr1expr2... — логическое умножение, операция "И" ,
  • Or[expr1,expr2,...] или expr1||expr1||... — логическое сложение, операция "ИЛИ"
  • Xor[expr1,expr2,...] или (expr1||expr1)!(expr1expr1) — сложение по модулю 2, операция "исключающее ИЛИ".
  • На рис. 2.20 приведены примеры использования логических операторов.

    (рис 2.20) Логические операторы в Mathematica

    2.3. Списки

    Последним классом данных, которого мы ещё не коснулись, являются списки.

    Список представляет собой удобную форму структурирования данных, по строению представляет собой множество элементов, заключённых в фигурные скобки { } и разделённых запятыми: {expr1,expr2,...}. Все списки относятся к сложным выражениям.

    В качестве элементов списка expr1, expr2,... могут выступать как однотипные (примеры In[1] и In[2] на рис. 2.21), так и разнотипные (пример In[3]) данные. Список может содержать и один элемент: тогда он выглядит как некоторое выражение, обособленное скобками (пример In[4]). Элементы списка сами могут являться списками (пример In[5]). Более подробно со списками мы познакомимся в следующей лекции.

    (рис 2.21) Списки в Mathematica

    2.4. Атрибуты

    Все функции в Mathematica обладают определёнными свойствами, называемыми атрибутами. Атрибуты той или иной функции можно узнать, применив к ней функцию Attributes. Воспользуемся подходом П. Веллина и др. [14, с. 50–51] к рассмотрению некоторых атрибутов на примере функции Plus — см. рис. 2.22.

    (рис 2.22) Атрибуты функции Plus

    Атрибут функции Flat соответствует свойству ассоциативности. В программировании ассоциативностью (или очерёдностью) называют последовательность выполнения действий (или направление вычисления), реализуемое, когда операторы имеют одинаковый приоритет и отсутствует явное (с помощью скобок) указание на очерёдность их выполнения. На примере функции Plus понятие ассоциативности можно сформулировать более простым языком: если необходимо сложить друг с другом три элемента, то не имеет значения, какие два из них будут сложены первыми. Математическим языком это свойство можно представить как $$a+(b+c)=(a+b)+c$$. На примере выражений Mathematica это можно проиллюстрировать, сказав, что выражения Plus[Plus[a,b],c] и Plus[a,Plus[b,c]] эквивалентны одноуровневому выражению Plus[a,b,c]. Если Mathematica определяет ту или иную функцию как ассоциативную, она записывает её в одноуровневой форме — см. рис. 2.23.

    (рис 2.23) Атрибут Flat: свойство ассоциативности

    Атрибут Orderless обозначает свойство коммутативности; это означает, что для обладающей им функции не имеет значения порядок её аргументов. На примере сложения в математике это свойство можно проиллюстрировать как $$a+b=b+a$$. Mathematica сортирует выражения в так называемом каноническом порядке. Выражения, состоящие из букв и слов, сортируются по алфавиту (пример In[1] на рис. 2.24), степенные многочлены сортируются по степени переменной (пример In[2]). Однако, иногда сортировка, которую осуществляет Mathematica, неочевидна и диктуется исключительно нуждами программы (пример In[3]).

    (рис 2.24) Атрибут Orderless: свойство коммутативности

    Когда выражение имеет атрибут Protected, это означает, что пользователь не может каким-либо образом изменять это выражение. Все встроенные функции обладают этим атрибутом.

    Атрибут OneIdentity означает, что повторное применение функции, обладающей этим атрибутом, к одному и тому же аргументу не будет иметь эффекта. Например, в Mathematica выражения Plus[Plus[a,b]] и Plus[a,b] будут эквивалентны друг другу.

    В Mathematica имеется возможность изменять атрибуты функций. И если делать это со встроенными функции кажется нерациональным и бессмысленным, то определять атрибуты для пользовательских функций может оказаться полезным. Например, имеется функция, для которой вы хотите задать атрибут Orderless. Если без этого атрибута функция не изменяет порядок собственных аргументов (см. пример In[1] на рис. 2.25), то с ним она автоматически сортирует аргументы согласно встроенным правилам сортировки (последовательно примеры In[2] и In[3]). Для задания атрибутов выражений используется функция SetAttributes[expr,a], где expr — само выражение, a — задаваемый атрибут. Для задания одновременно нескольких атрибутов функция применяется в виде SetAttributes[expr,{a1,a2,...}], где a1,a2,.. — задаваемые атрибуты.

    (рис 2.25) Задание атрибутов выражения при помощи функции SetAttributes

    Ключевые термины

    Ассоциативность (или очерёдность) — последовательность выполнения действий (или направление вычисления), реализуемое, когда операторы имеют одинаковый приоритет и отсутствует явное (с помощью скобок) указание на очерёдность их выполнения.

    Атрибуты — свойства выражений Mathematica.

    Атомарными называют простейшие выражения Mathematica.

    Вещественные данные — числа, которые в общем случае содержат мантиссу с разделёнными точкой целой и дробной частями и порядок, вводимый как степень числа 10.

    Внутреннее представление или полная форма — это универсальная форма представления выражений, соответствующая структуре h[expr1,expr2,...], содержащей заголовок h и разделённые запятыми аргументы expr1,expr2,... в квадратных скобках

    Выражениями называются любые данные, вводимые пользователем в секции Input и предназначенные для обработки ядром.

    Глубина выражения — максимальный номер уровня в выражении плюс единица.

    Идентификаторами называются имена переменных.

    Именованная константа — выражение, которое рассматривается программой как функция без аргумента, возвращающая заранее заданное значение.

    Коммутативность — свойство функции, которое означает, что наделенная им функция безразлична к порядку ее аргументов.

    Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение.

    Логические операторы (известные также как булевы функции, булевы операторы) — выражения, определяющие правильность выражений, основных на булевой алгебре.

    Оператор отношений — предикат, отражающий логическое соответствие между данными.

    Машинный ноль — наименьшее число, которое воспринимается системой как ноль.

    Переменными в системе Mathematica являются именованные объекты, способные в ходе выполнения документа неоднократно принимать различные значения — как численные, так и символьные.

    Предикат/ — функция, возвращающая логическое значение True или False в зависимости от того, удовлетворяет или не удовлетворяет их аргумент условию проверки.

    Рациональные данные — отношения целых чисел, которые представляются системой без погрешности и ограничения точности.

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

    Список — форма структурирования данных, по строению представляющая собой множество элементов, заключённых в фигурные скобки и разделённых запятыми.

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

    Функция пользователя — набор правил, задаваемых пользователем.

    Целочисленные данные — это целые числа, которые представляются системой без погрешности и ограничения разрядности.

    Краткие итоги

    В данной лекции мы подробно познакомились с двумя классами данных Mathematica — численными и символьными данными, а также получили начальную информацию о третьем классе данных — списках. Мы узнали об основных отличиях при задании пользователем и использовании программой целых, рациональных, вещественных и комплексных чисел. Мы познакомились с ключевым понятием Mathematica — выражением, научились задавать простейшие атомарные выражения и конструировать из них сложные выражения. Мы узнали о "двуличии" выражений Mathematica — о том, что они обладают, по меньшей мере, двумя представлениями: внутренним и внешним. Мы научились обращаться к отдельным элементам сложных выражений. Мы познакомились с такими объектами системы, как константы, переменные и пользовательские функции, и научились пользоваться ключевыми операторами системы — присваиванием и отложенным присваиванием. Мы научились проверять выражения на соответствие тем или иным условиям при помощи предикатов, в том числе, операторов отношений и логических операторов. Мы узнали о возможности придания функциям определённых свойств при помощи атрибутов и познакомились с некоторыми из них.

    Вопросы

  • Что называют выражением в Mathematica? Что такое атомарное выражение?
  • К каким классам данных могут относиться выражения Mathematica?
  • Перечислите типы численных данных, раскройте понятия, приведите примеры.
  • К какому типу численных данных будет принадлежать сумма чисел вещественного и целого; рационального и комплексного; вещественного и комплексного; целого и рационального?
  • Что такое символ в Mathematica? Приведите примеры символьных данных.
  • Что такое строка в Mathematica?
  • Какую структуру имеют выражения в Mathematica?
  • Что такое внутреннее представление или полная форма выражения?
  • Каким образом можно узнать внутреннюю форму произвольного выражения Mathematica?
  • Какие объекты являются в Mathematica константами; переменными?
  • Что такое идентификатор? Какими свойствами должен обладать идентификатор?
  • Приведите примеры основных операций по присваиванию переменным значений.
  • На приме поясните разницу между операциями немедленного присваивания и отложенного присваивания.
  • Какие объекты Mathematica называются предикатами? Приведите примеры используемых в Mathematica предикатов.
  • Для чего используются операторы отношений и логические операторы? Приведите примеры операторов.
  • Что такое список в Mathematica?
  • Что такое атрибуты функций Mathematica? Приведите примеры атрибутов.
  • Упражнения

  • Представьте в полной форме выражения a*x^2+b*x+c, Log[p+q*r], x^y^z.
  • Каково традиционное представление заданных в полной форме выражений Power[Plus[x,Log[Plus[x,y]]],2], Plus[a,Power[b,2],Times[-1,Power[c,3]],Power[d,4]], Plus[x,Times[-1,Power[x,y]],Times[2,x,y]]?
  • При помощи функции Head определите тип следующих выражений: 123, 15.46, sometext, "sometext", I+6, {1,a}.
  • Создайте список, элементами которого являются только символьные данные; только численные данные; только списки.
  • Введите в окно редактирования ваше имя, определите тип введённого выражения. Обособьте имя кавычками " ", определите тип полученного выражения. Создайте список, в качестве элементов которого укажите ваши имя, отчество и фамилию.
  • Выведите на экран надпись "I learn Mathematica", чтобы каждое слово начиналось с новой строки.
  • Проверьте, являются ли числа 27, 91, 127, 417, 523 простыми.
  • Сравните между собой выражения $$5.63-3.$$ и $$7.68-4.23$$, $$12.358*1.23$$ и $$10.5*1.46$$, $$2.1^6$$ и $$3^{4.5}$$.
  • Выясните, какими атрибутами обладают функции ListPlot, Sqrt, Sin, Power.
  • Вернуться к учебному плану