Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Evaluate Expressions inside Dynamic or Manipulate - Wolfram Mathematica

Вычисление выражений внутри функций Dynamic или Manipulate

Функции Dynamic и Manipulate обладают удерживающими атрибутами, жизненно важными для их правильной работы. Однако, эти удерживающий атрибуты могут создавать помехи другим структурным операциям, которые вам может потребоваться выполнить. Это руководство содержит некоторые полезные приемы для работы с функциями Dynamic, Manipulate, а также другими удерживающими конструкциями.

Обратите внимание, что в связи с природой этих примеров, некоторые из получаемых результатов не сохраняются в файлах. Эти примеры будут обретать смысл лишь по мере вычисления ячеек ввода.

Начнем с создания переменной, чье значение задано списком чисел:

In[2]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_1.gif

In[5]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_2.gif

Out[5]=

EvaluateExpressionsInsideDynamicOrManipulateRU_3.gif

Следующая ячейка ввода создает список "ползунков", первый из которых динамически изменяет значение первого элемента списка чисел, второй меняет значение второго элемента списка чисел, и так далее:

In[1]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_4.gif

Возможно, Вам захочется создать список ползунков более простым способом, например с помощью функции Table. Однако, HoldFirst - атрибут функции Dynamic становится этому помехой, препятствуя проникновению значений переменной функции Table внутрь выражения. Поэтому следующая наивная попытка терпит неудачу, и мы на самом деле лицезреем numbers[[i]] вместо numbers[[1]], numbers[[2]] и так далее. Обратите внимание на синтаксическое выделение переменной i, предупреждающее об этой опасности:

In[8]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_5.gif

Out[8]//InputForm=

{Slider[Dynamic[numbers[[i]]]], Slider[Dynamic[numbers[[i]]]],
Slider[Dynamic[numbers[[i]]]], Slider[Dynamic[numbers[[i]]]],
Slider[Dynamic[numbers[[i]]]]}

Чтобы преодолеть это, можно применить контекстную конструкцию With, для немедленной замены всех частных случаев локальной переменной i со соответствующими значениями:

In[9]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_6.gif

Out[9]//InputForm=

{Slider[Dynamic[numbers[[1]]]], Slider[Dynamic[numbers[[2]]]],
Slider[Dynamic[numbers[[3]]]], Slider[Dynamic[numbers[[4]]]],
Slider[Dynamic[numbers[[5]]]]}

Избавившись от оболочки InputForm, мы получим отформатированные ползунки:

In[5]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_7.gif

In[4]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_8.gif

Out[4]=

EvaluateExpressionsInsideDynamicOrManipulateRU_9.gif

    

Такой же самый подход можно использовать для функции Manipulate, при построении набора элементов управления. Ниже приводится интерактивная модель, созданная функцией Manipulate, чей первый ползунок задает количество других ползунков, выводимых на экран. Эти другие слайдеры заключены в оболочку Panel для лучшей наглядности. Обратите еще раз внимание на применение конструкции With в функции Table, которая используется для создания ползунков:

In[8]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_10.gif

Out[8]=

Здесь рассмотрен похожий случай, где количество полей для флажков, связанное с переменной, изменяется вслед за значением другого элемента управления интерактивной модели:

In[9]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_12.gif

Out[9]=

    

Построим, с помощью функции Manipulate, интерактивную модель с пронумерованными элементами управления:

In[10]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_14.gif

Out[10]=

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

In[11]:=

EvaluateExpressionsInsideDynamicOrManipulateRU_16.gif

Out[11]=