Опубликован: 27.12.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Детализация

Символы и контексты (Contexts)

Полное имя каждого объекта состоит из двух частей: контекста ( context ) и короткого имени ( short name ). Полное имя объекта пишется в следующем виде: context'short name. Обратная кавычка ' называется меткой контекста ( context mark ).

In[61] : = abc'x
           abc'x =10 
           abc'х2
Out[6l]=abc'x 
Out[62]=10 
Out[63]=100

Символы с одинаковым именем, но разными контекстами - различны:

In[64]: = х == х
          а'х==b'х
          а'х==а'у
Out[64] =True
Out[65] =а'х==b'х
Out[66] =а'х==а'у

В каждый момент времени фиксирован так называемый текущий контекст, имя которого находится в переменной $Context:

In[67]:=$Context
Out[67]=Global'

Объекты текущего контекста можно называть их короткими именами:

In[68]:=х==Global'х
Out[68]=True

Контексты аналогичны директориям (папкам) с файлами:

  • текущий контекст - текущая папка, к файлам которой можно обращаться по их именам, не указывая полный путь;
  • подобно тому как папки могут содержать другие папки, контексты могут быть сложными:
In[69]:=a'b'x==а'с'х 
Out[69]=а'b'х==а'с'х

Отметим, что в момент запуска Mathematica устанавливается контекст Global'. Пользовательские символы относятся именно к этому контексту. Однако, скажем, Pi имеет контекст System'. Чтобы в этом убедиться, примените к Pi команду Context[]:

In[70]:= Context [x] 
         Context[Pi]
Out[70] = Global'
Out[71] = System'

В Mathematica реализована возможность пользоваться краткими именами объектов, относящихся к разным основным контекстам. Все такие контексты перечислены в списке $ContextPath. Полный список имеющихся контекстов можно получить, выполнив команду Contexts[]:

In[72]:=$ContextPath // InputForm
Out[72] =
   {"PacletManager'", "WebServices'" , "System'", "Global'"}

Если в $ContextPath встречаются два контекста, содержащих один и тот же символ, скажем x, то при обращении к x он интерпретируется в соответствии с тем контекстом, который встречается первым в списке $ContextPath (все остальные одноименные символы "затеняются"):

In[73]:=$ContextPath={"а'","b'"}≈Join≈ $ContextPath 
         {а"х, b"х} 
         Context[x]
Out[73]=
    {a", b', PacletManager', WebServices', System', Global'}
Out[74]={x,b'x] 
Out[75]=a'

Таким образом, здесь x воспринимается как a'x. Если такой x больше не нужен, можно выполнить команду Remove[x] , и символ a'x будет уничтожен. Теперь x будет восприниматься как b'x:

In [76]:=Remove [x] 
         Context[x]
Out[77]=b'
In[78]:=Remove [x] 
        Context[x]
Out[79]=Global'
In[80]:=$ContextPath=Drop[$ContextPath,2]
Out[80]={PacletManager',WebServices',System',Global'}

Пакеты (Packages)

Пакеты - расширения Mathematica, написанные на языке Mathematica и содержащие определения, которые "учат" Mathematica работать в соответствующих областях. Загрузить такой пакет можно командой <<package или Needs[package], где package имеет такой же формат, как context:

In[81]:=<< VectorAnalysis'

Одной из функций, реализованных в этом пакете, является вычисление дивергенции Div[\xi] (в заданной координатной системе) или в координатной системе coorsystem с помощью команды Div[\xi, coorsystem] :

In[82] :=SetCoordinates [Cartesian [x, y, z] ]
             (* задает  текущую  систему координат*)
            Div[{x2,y2,  z2}]
Out[82] = Cartesian [x,  y,   z]
Out[83] =2x+2y+2 z
In[84] :=SetCoordinates [Spherical [r, θ, ϕ] ] 
         Div[{r2, θ2, ϕ2}]
Out[84] = Spherical [r, θ, ϕ]
Out[85]=\frac{Csc[\theta] (2 r \varphi + r \theta^2 Cos [\theta] +4 r^3 Sin [\theta] +2 r \theta Sin [\theta]}{r^2}
In[86]: = CoordinateSystem
           (*выдает название текущей системы координат *) 
          Div [{r2, ϕ2, z2},Cylindrical [r,ϕ, z] ]
Out[86] = Spherical
Out[87]=\frac{3r^2+2rz+2 \varphi}{r}

Текущий список загруженных пакетов присвоен переменной $Packages:

In[88]:=$Packages
Out[88] = {VectorAnalysis ',  JLink',
           PacletManager',  WebServices',  System',  Global'}

Типичная ошибка при использовании пакета - попытка выполнить до его загрузки некоторую функцию f, короткое имя которой имеется у одной из функций пакета. Если такое произошло, то выполняемой функции автоматически присваивается контекст Global'. После загрузки пакета одноименная функция из этого пакета начинает затенять функцию Global 'f, о чем сообщается в диагностике. Если вам не нужна функция из пакета, а нужна определенная вами, выполните команду Remove[f] (см. выше).

Отличие << (или Get ) от Needs: команда Needs загружает пакет только если он еще не был загружен, что определяется по тому, есть ли его имя в списке $Packages или нет.

Светлана Петрова
Светлана Петрова
Украина
Марина Семенова
Марина Семенова
Россия, г. Чебоксары