Задание уравнений для массивов

Есть несколько способов задания уравнения (или уравнений), определяющих значения элементов переменных-массивов (будь то накопительпоток или динамическая переменная). 

Задание одного и того же уравнения для всех элементов массива

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

Region = {NORTH, SOUTH} и Gender = { MALE, FEMALE } то уравнение может выглядеть так:

d(Population[Gender, Region])/dt = Births[Gender, Region]-Deaths[Gender, Region]

 Чтобы задать одно и то же уравнение для всех элементов массива

  1. Выделите переменную-массив в графическом редакторе и перейдите в панель Свойства.
  2. Как и в случае системно динамической модели со скалярными переменными, так и в случае модели с массивами, формула, определяющая, как значения элементов накопителя меняются с течением времени, по умолчанию не редактируется - она создается автоматически, в соответствии с потоками, втекающими в накопитель и/или вытекающими из него. Это так называемый классический режим задания уравнения, подробнее можно прочесть здесь. На рисунке ниже вы можете увидеть формулу для накопителя Population из рассматриваемого нами примера. 
  1. Но если вам нужно изменить формулу накопителя, то вы можете выбрать в группе кнопок Режим задания уравнения опцию Произвольный -  тогда вы сможете редактировать формулу, задающую, как меняются значения элементов накопителя.

  1. Введите формулу, вычисляющую значение переменной, в поле d(<имя массива>)/dt = . Если, например, значение переменной Births одинаково и для MALE, и для FEMALE, и различается только по регионам (так, что переменная Births представляет собой массив с одной размерностью Region), то вы можете написать:


Это уравнение внутри AnyLogic будет приведено к следующему простейшему циклу:

for( r : Region )
    for( g : Gender )
        Population[ r, g ] += Births[ r ] – Deaths[ r, g ]

Если интенсивность рождения Births одинакова и во всех регионах, то вы можете использовать в этом уравнении просто скалярную переменную Births:


Задание различных уравнений для различных наборов элементов массива

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

d(Population[Gender, SOUTH])/dt = Births[SOUTH] - Deaths[Gender, SOUTH]

d(Population[Gender, NORTH])/dt = Births[NORTH] - Deaths[Gender, NORTH] – OutMigration

 Чтобы задать различные уравнения для различных подмассивов

  1. Выделите массив в графическом редакторе или в панели Проекты.
  2. Перейдите в панель Свойства.
  3. Задайте список индексов массива, идентифицирующий те элементы массива, значение которых будет вычисляться согласно заданной вами формуле. По умолчанию будут выбраны все размерности массива. Вы должны изменить этот список, указав конкретные элементы (или подразмерности) для тех размерностей, которые представлены в интересующем нас подмассиве лишь частично. Для таких размерностей, нужно будет щелкнуть мышью по ссылке с именем размерности и выбрать имя интересующего нас элемента или подразмерности из появившегося списка.
  4. Чтобы задать первую формулу в случае рассмотренного выше примера, щелкните по размерности и выберите элемент: 

  1. Введите формулу, вычисляющую значение указанного подмассива, в поле  d(<имя массива>)/dt = :

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

  1. Вы можете в любой момент удалить любую из этих формул, щелкнув мышью по кнопке  справа от этой формулы.
Вы можете ссылаться в уравнениях и на определенные наборы элементов одной размерности с помощью подразмерностей. Например, если есть размерность Income = { POOR, MIDDLECLASS, WEALTHY } и ее подразмерность AllButPoor = { MIDDLECLASS, WEALTHY }, то вы можете написать для массива Population с тремя размерностями:

d( Population[ Region, Gender, POOR ] )/dt =
    Births[ Region ] - Deaths[ Region, Gender, POOR ] – OutMigration

d( Population[ Region, Gender, AllButPoor ] )/dt =
    Births[ Region ] - Deaths[ Region, Gender, AllButPoor ]

Ссылки на следующий, предыдущий и другие случайные элементы

Иногда вам может понадобиться сослаться в уравнении на какой-то другой индекс массива. Предположим, вы моделируете цепочку возрастов и ваш накопитель Population представляет собой массив с одной размерностью Age = { 0 .. 99 }. Для всех элементов массива (кроме элемента с индексом 0) значение входящего потока будет равняться значению выходящего потока из элемента с предыдущим индексом. Для элемента с индексом 0 входящий поток будет равен Births. Чтобы реализовать такой случай, вам нужно создать две подразмерности размерности Age: Age0 = { 0 } и AgesAllBut0 = { 1 .. 99 } и написать:

d( Population[ Age0 ] )/dt =
    Births - Deaths[ Age0 ] – Ageing[ Age0 ]

d( Population[ AgesAllBut0 ] )/dt =
    Ageing[ AgesAllBut0 – 1 ] - Deaths[ AgesAllBut0 ] – Ageing[ AgesAllBut0 ]

Чтобы понять, как это работает, рассмотрим циклы, в которые AnyLogic будет преобразовывать эти формулы:

for( a : 0 }
    Population[ a ] += Births - Deaths[ a ] – Ageing[ a ]

for( a : 1..99 }
    Population[ a ] += Ageing[ a-1 ] - Deaths[ a ] – Ageing[ a ]

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


См.также

 Массивы

 Размерности

 Инициализация массива

 Задание уравнений для массивов

           Справочник классов: Класс HyperArray