4. Работа с объектами

 

Работа с объектами

 

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

Получение данных об объектах

Различные объекты системы будут более подробно описаны в дальнейшем по мере знакомства с системой. Полный список объектов, заданных в ядре системы, легко получить, используя команду ? * (ниже приведены лишь начало и конец этого списка):


?*

Abort

AbortProtect

Above

Abs

AbsoluteDashing

AbsolutePointSize

$Version

$VersionNumber

Можно также получить список всех определений на заданную букву, используя команду ?S*, где S — любая буква латинского алфавита. Ниже дан пример вывода всех определений ядра на букву U:


?U*

UnAlias Unevaluated Update

Underflow Uninstall UpperCaseQ

Underoverscript Union UpSet

UnderoverscriptBox Unique UpSetDelayed

Underscript Unprotect Upvalues

UnderscriptBox UnsameQ Using

Unequal Unset

Аналогичные возможности предоставляет функция Names ["S"], например, Names ["А*"] дает список всех ключевых слов, начинающихся с символа «А». Наконец, командой ?Name можно вывести справку по любому определению с именем Name. Например, после выполнения команды


?Abs

Abs[z] gives the absolute

value of the real or complex number z.

становится ясно, что идентификатор Abs задает функцию Abs [ z ] для вычисления абсолютного значения комплексного числа.

С помощью выражения ?Name можно проверить, является имя объекта Name уникальным или оно уже использовано в системе:


?sin

Information::notfound : Symbol sin not found.

?Sin

Sin[z] gives the sine of z.

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

Всякий объект перед использованием должен быть определен (задан). Внутренние объекты уже заданы в ядре. Объекты пользователя последний задает в текстах своих документов (notebooks).

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

Оперативная помощь по объекту

Оперативную помощь о назначении какой-либо функции или объекта в ходе работы с системой можно получить, используя следующие обращения:

  • ? Name или Names [ "Name" ] — справка по заданному слову Name;
  • ?? Name — расширенная справка по заданному слову Name;
  • ?Аbс* — перечень всех определений, начинающихся с символов Abc;
  • ©ptions [name] — получение информации об опциях объекта Name.

Примеры получения оперативной справки показаны на рис. 3.5.

Рис. 3.5. Примеры получения оперативной справки

Нетрудно заметить, что есть два уровня комментариев оперативной справки. Так, при обращении ?Sin получено лишь сообщение о назначении функции. Обращение ??Sin дает дополнительную информацию о признаках функции, именуемых ее атрибутами.

Многие встроенные функции защищены от модификации атрибутом Protected. К примеру, нельзя определить новую функцию Sin[x]=x A 2, причем вовсе не потому, что это определение абсурдно (далее мы покажем, что можно снять защиту и переопределить любую функцию даже самым абсурдным образом), а потому, что имя функции защищено указанием атрибута Protected (Защищенное). Позднее мы ознакомимся и с иными атрибутами — под ними подразумеваются определенные свойства объектов.

Средства диагностики и сообщения об ошибках

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


Тип::Метка%Диагностика:Сообщение

Эти сообщения появляются в отдельных неактивных ячейках. Тип указывает на тип ошибки, например, General — ошибка общего вида, Syntax — синтаксическая ошибка, Arg — ошибка задания аргумента и т. д. Метка указывает место ошибки в списке ошибок данного типа, а Диагностика указывает (увы, не всегда...) на ошибочное выражение. Сообщение обычно раскрывает суть ошибки.

Допустим, мы пытаемся вычислить значение экспоненциальной функции, указав ошибочно аргумент 2,3 с разделительной запятой вместо точки. Вот как Mathematica отреагирует на такую попытку (рис. 3.6, первый пример).

Рис. 3.6. Примеры выполнения «ошибочных» операций

Итак, ясно, что произошла ошибка задания аргумента — функция Ехр должна иметь только один аргумент, а число 2,2 система воспринимает как два аргумента, разделенные запятой. Вот еще один пример — вроде бы ошибочно заданы круглые скобки в выражении N (Ехр (2) ). Mathematica 3 в этом случае дала бы два предупреждающих сообщения:


Syntax::bktwrn : "Ехр(2)" should probably be "Ехр[2]".

Syntax::bktwrn : "N(Exp(2)l" should probably be "N[Exp(2)]".

2ExpN

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

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

Включение и выключение сообщений об ошибках

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

Для отключения сообщений об ошибках служит ключ


Off[Function::tag]

Например, отключим сообщение об ошибках у функции Ехр:


Off[Exp::argx]

Ехр[2,2]

Ехр[2,2]

Ехр[2]

Е2

N[Exp[2]]

7.38906

Для включения сообщения об ошибках используется ключ


On[Function::tag]

Например, для возобновления выдачи ошибок у функции Ехр надо исполнить команду


On[Exp::argx]

К сожалению, диагностика ошибок не способна опознать ошибки, имеющие формально правильный синтаксис. Чаще всего эти ошибки связаны с неверным описанием алгоритма вычислений. Например, если пользователь в математическом выражении вместо Sin [х] записал Cos [х], то эта грубая ошибка никак не будет распознана системой, поскольку синтаксически вызов функции Cos [х] записан безупречно. Часто пользователи путают идентификаторы переменных. Естественно, что ответственность за такие ситуации целиком лежит на пользователе — программисте.

Защита от модификации и ее отмена

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

  • Protect [s1, s2,...] — устанавливает атрибут защиты от модификации Protected для перечисленных объектов si;
  • Protect ["forml", "form2",...] — устанавливает атрибут защиты от модификации для всех объектов, имена которых сопоставимы с любым из указанных строковых шаблонов formi;
  • Unprotect [s1, s2,...] — удаляет атрибут защиты от модификации Protected для объектов si, что делает возможной их модификацию;
  • Unprotect ["form1", "form2",...] — снимает защиту всех объектов, имена которых текстуально (по буквам) сопоставимы с любым из указанных шаблонов formi.

Приведем наглядный пример модификации встроенной функции логарифма:


Log[7]=2

Set::write : Tag Log in Log[7] is Protected.

2

Итак, здесь предпринята попытка приписать логарифму числа 7 вовсе не свойственное ему значение 2. В ответ система выдала сообщение, что символ Log имеет атрибут Protected, то есть защищен от модификации. С помощью директивы Unprotect снимем защиту:


Unprotect[Log]

{Log}

Теперь выражение Log [ 7 ] можно модифицировать:


Log[7] =2

2

и использовать его уже в новом значении:


Log[7]=2

2

Log[7]+Log[3]

2 + Log[3]

Для отмены произведенной модификации и защиты символа Log от изменений выполните следующие действия:


Log[7]=.

Protect[Log]

{Log}

Теперь можно проверить, что присваивание Log [7] =2 не действует и функция Log работает как положено, возвращая значение In (7) =1. 94591:


Log[7]

Log[7]

N[Log[7]]

1.94591

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

Подстановки

Важное значение в числовых и символьных преобразованиях имеют операции подстановки (rules). Их смысл заключается в замене одного объекта или его части другим объектом или частью другого объекта. Например, часто возникает необходимость вычислить значение математического выражения при замене некоторой переменной ее конкретным численным значением. Для этого достаточно вместо этой переменной подставить нужное численное значение.

Куда менее тривиальной является замена переменной ее символьным значением в виде математического выражения. При этом исходное выражение может в ходе решения задачи превратиться в совершенно новое выражение, поскольку после подстановки система может провести над исходным выражением достаточно сложные математические преобразования. Говорят, что в этом случае ячейка, содержащая выражение (а точнее — само выражение), оценивается и изменяется по ходу решения задачи. Операции подстановки обычно вводятся с помощью комбинации символов «/ .»:

  • ехрг / . х -> value — в выражение ехрг вместо переменной х подставляется ее значение value;
  • ехрг /. {х -> xvalue,. у -> yvalue} — в выражение ехрг вместо переменных х и у подставляются их значения xvalue и yvalue.

Примеры:


l+x^3/.x->l+z

1 + (1+ z)3

х^2+2*х+3/.х->2

11

Обратите внимание на то, что в результате подстановки в первом примере вместо переменной х оказалось математическое выражение (1 + z). Второй пример иллюстрирует подстановку на место переменной х ее численного значения.

В целом для операций подстановок используют следующие обозначения:

  • Ihs -> rhs — прямая подстановка Ihs в rhs;
  • Ihs :> rhs — отложенная подстановка (RuleDelayed), которая преобразует Ihs в rhs, вычисляя rhs не сразу, а только при использовании правила подстановки.

Ниже приведены еще два примера на использование операций подстановки:


р:=1+х^2+3*х^3

р/.х->1+у

1+ (1 + у)2+3 (1 + у)3

{f[1],f[2],f[3]}/.f[n_]->n^2

{1, 4, 9}

f[n_]:=n^2

f[4]+f[y]+f[x+y]

16+y2+(x+y)2

В первом примере подстановка произведена в математическое выражение, а во втором — в список.

Подстановки — мощный и необычайно гибкий инструмент системы Mothematica. С их помощью можно задать даже новые математические закономерности и произвольные соотношения (к примеру, можно задать абсурдное правило, что 2 + 2 = 5). Эти необычные возможности мы рассмотрим в дальнейшем.

 

gl3-5.jpg

Изображение: 

gl3-6.jpg

Изображение: