Есть несколько способов задания уравнения (или уравнений), определяющих значения элементов переменных-массивов (будь то накопитель, поток или вспомогательная переменная).
В простейшем случае для всех элементов массива задается одно и то же уравнение,
возможно, ссылающееся на размерности
массива. Например, если накопитель
Population является массивом с
размерностями:
Region = {NORTH, SOUTH} и Gender = { MALE, FEMALE } то уравнение может выглядеть так:
d(Population[Gender, Region])/dt = Births[Gender, Region]-Deaths[Gender, Region]
Чтобы задать одно и
то же уравнение для всех элементов массива

Если, например, значение переменной 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
Чтобы задать
различные уравнения для различных подмассивов



справа от этой формулы.Иногда Вам может понадобиться сослаться в уравнении на какой-то
другой индекс массива. Предположим, Вы моделируете цепочку возрастов и
Ваш накопитель
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 ]
Как Вы можете увидеть, имена размерностей просто заменяются в
уравнениях на индексы циклов. Это обеспечивает высокий уровень гибкости
при задании уравнений. Вы можете задать зависимость элемента с
определенным индексом от
элемента этого же или другого массива, имеющим произвольный
индекс.