Система моделирования "ИМИТАК"(Y)

Общие положения
Алфавит языка
Структура программы
Описание модели
Уравнения
Переменные. Константы. Литералы
Уровни. Темпы. Дополнительные переменные
Системное время. Алгоритм моделирования
Выражения
Функции
Массивы
Объявление массива. Список размерностей
Массивы необъявленной размерности
Массив в левой части уравнения
Элемент массива. Список индексов
Сечение массива
Элементы и сечения массивов в левой части уравнений
Встроенный цикл векторного уравнения
Перенос уравнений. Комментарии
Ввод исходных данных
Оператор присваивания значений
Присваивание значений системным величинам
Правила записи раздела исходных данных
Запуск модели
Табличный и графический вывод данных

Приложение. Встроенные функции

Общие положения

"ИМИТАК" - "имитационно-аналитический комплекс" - система имитационного моделирования сложных динамических систем с обратной связью. ИМИТАК реализует методологию "системной динамики" (см. Форрестер Дж. Мировая динамика - М. Наука. 1978).

Исследуемая система описывыается на специальном языке, это описание вводится в компьютер и используется для проведения имитационного эксперимента.

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

В ранних версиях "ИМИТАК" ("УПРАЛ", "СИМПО") за основу был взят язык моделирования DYNAMO c незначительными изменениями конструкций и обозначений.

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

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

Настоящая версия, сохраняющая преемственность с прежними реализациями ИМИТАК, разработана в 1998 году Александром Владимировичем Розенвассером для Windows-95 и названа "Y".

Интерпретатор "Y" обеспечивает возможность трансляции и выполнения модели, а также диагностику ошибок на уровне исходного текста.

Алфавит языка

В языке "ИМИТАК" используются следующие символы:

буквы латинского алфавита -

А,В,C,D,E,F,G,Y,I,J,R,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;

русские буквы -

А,Б,В,Г,Д,Е,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я;

арабские цифрры -

0,1,2,3,4;5,6,7,8,9;

разделители -

" ", "(", ")", "=", "-", "+", "*", "/", ",", ".", ":", "#", "[", "]".

Заглавные и строчные буквы не различаются.

Остальные символы являются недопустимыми (за исключением комментариев или специально оговоренных случаев).

Структура программы

Текст на языке "ИМИТАК" включает три раздела:

Все разделы состоят из операторов (предложений языка). Операторы подразделяются на 3 группы, соответствующие разделам:

Каждый оператор начинается с новой строки и занимает одну или несколько строк. Длина строки - 80 сивволов.

Все операторы имеют общую структуру:

Концом текста оператора считается первый встреченный пробел. За пробелом в этой строке можно записать что угодно в качестве комментария - интерпретатор эту информацию игнорирует.

Разделы следуют друг за другом в указанном порядке и разделяются оператором конца раздела;

Е <произвольная информация>

Буква "Е" может использоваться как русская, так и латинская.

Описание модели.

Описание модели - первый раздел текста на языке ИМИТАК. Раздел содержит уравнения, которые задают поведение модели во времени.

Уравнения

Язык "ИМИТАК" - язык уравнений. Изменение каждой характеристики моделируемой системы во времени описывается уравнением одного из трех типов:

Буква, обозначающая тип уравнения ("У", "Т" или "Д"), ставится перед уравнением в первой колонке. За типом следует пробел, а далее записывается текст уравнения, например:

У НАСЕЛ.Н = НАСЕЛ.П + DT*(ТРОЖД.ПН−ТСМЕР.ПН)

В левой части уравнения - перед знаком равенства- указывается моделируемая характеристика, а правая часть описывает зависимость значения этой характеристики от других.

Все уравнения помещаются в первом разделе программы - Описание модели.

Переменные. Константы. Литералы.

Характеристики моделируемой системы, которые фигурируют в уравнениях, называются переменными.

Переменные подразделяются на уровни, темпы и дополнительные переменные.

Для обозначения переменных используются имена.

Имя переменной - это слово из букв и цифр, начинающееся с буквы и длиной не более 5-ти знаков. В именах употребляются буквы как латинского, так и русского алфавита.

Кроме имени в обозначении переменной указывается еще индекс времени. Он задается одной или двумя буквами после имени переменной и отделяется от имени точкой, например:

НАСЕЛ.П ТРОЖД.ПН

ТСМЕР.НБ Индекс времени показывает, за какой момент (или интервал) времени берется значение переменной.

В уравнениях языка "ИМИТАК" встречаются три момента времени:

прошедший - "П";

настоящий - "Н";

будущий -

"Б".

Использование тех или иных индексов времени строго регламентировано для каждого типа переменных и уравнений.

Помимо переменных в правой части уравнения можно использовать константы. Обозначаются они, как и переменные, именами, но индексы времени для констант не указываются, - их значения одинаковы для всех моментов времени. Значения констант задаются перед началом эксперимента и в процессе имитации не изменяются.

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

- константы, заданные непосредственно в виде числа, а не имени. Число записывается обычным образом в десятичном виде; если имеется дробная часть, то она отделяется от целой посредством точки (десятичная точка). ИМИТАК обеспечивает точное представление 6 значащих цифр числа.

Примеры литералов:

99.999

0.25

0.000333

Перед литералом ( как, впрочем, и перед константой или переменной) может стоять знак " - " (минус).

Уровни. Темпы. Дополнительные переменные.

Каждой переменной в языке "ИМИТАК" соответствует одно уравнение. Переменные и соответствующие им уравнения подразделяются на уровни, темпы и дополнительные переменные.

Уровни

соответствуют основным (фазовым) характеристикам моделируемой системы. Как правило, исследователя в первую очередь интересуют закономерности изменения во времени именно уровней. Примером уровня может служить численность населения.

Темпы определяют величины изменения уровней за единицу системного времени. Примерами темпов являются количества родившихся и умерших за год.

Переменные, которые нельзя отнести ни к уровням, ни к темпам, являются дополнительными.

Для уровней разрешается указывать только индексы ".Н" и ".П"; для дополнительных переменных - только ".Н"; для темпов указывается либо индекс ".ПН", либо ".НБ".

В левой части уравнения уровня всегда задается уровень в настоящий момент - ".Н". В правой части допускается тот же самый уровень за прошедший момент - ".П", а также любые темпы с индексом ".ПН", то есть, за интервал от прошедшего до настоящего момента. Примером такого уравнения может служить:

У НАСЕЛ.Н=НАСЕЛ.П+DТ*(ТРОЖД.ПН-ТСМЕР.ПН)

Уравнения для темпов, используемых в правой части, располагаются обязательно ниже уравнения уровня.

В уравнении дополнительной переменной в левой части должна стоять дополнительная переменная с индексом ".Н", а в правой части могут встречаться другие дополнительные переменные или уровни с индексом времени ".Н", а также темпы с индексом времени ".НБ", например:

Д РОЖД.Н=(ТРОЖД.НБ*1000)/НАСЕЛ.Н

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

В левой части уравнения темпа указывается обязательно темп с индексом ".НБ". В правой части этого уравнения допускаются те же переменные, что и для уравнения дополнительной переменной, например:

Т ТСМЕР.НБ=НАСЕЛ.Н*(НЕСЧ.Н+БОЛ.Н+СТАР.Н+СПРОЧ.Н

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

Системное время. Алгоритм моделирования.

Для моделирования реального времени в языке "ИМИТАК" используется специальная переменная с именем "ВРЕМЯ". Переменная "ВРЕМЯ" встроенная - ИМИТАК автоматически изменяет ее в процессе имитации.

Перед началом эксперимента переменной время присваивается начальное значение, заданное пользователем, или нуль. Это значение времени соответствует моменту ".Н".

На этот момент времени для уровней также заданы начальные значения. Остальные переменные - дополнительные и темпы - вычисляются по своим уравнениям, поскольку в правых частях оказываются величины, известные на момент времени ".Н". После этого переменная ВРЕМЯ автоматически увеличивается на величину DT. Именем "DT" обозначается шаг моделирования (элементарный интервал системного времени).

Новое значение времени становится настоящим моментом - ".Н", а предыдущее, соответственно, прошедшим - ".П". Прежние значения уровней приобретают таким образом индексы ".П", а темпов -".ПН". На основе этих значений вычисляются уровни для настоящего момента.

Затем снова расчитываются дополнительные переменные и темпы, системное время увеличивается на DT. Опять вычисляются значения для дополнительных переменных и темпов и так далее.

Этот циклический процесс продолжается до тех пор пока изменение системного времени ( от начального момента) не превысит интервала моделирования, заданного пользователем в системной константе "ДЛИНА".

Системные величины ВРЕМЯ, DT и ДЛИНА можно записывать в правой части любого уравнения наравне с обычными константами.

Выражения.

Правая часть каждого уравнения представляет собой алгебраическое выражение, записываемое в естественной форме с использованием круглых скобок и знаков арифметических действий: "+" - сложение; "-" - вычитание или минус перед членом выражения; "/" деление.

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

Вложенность круглых скобок в выражении ограничивается только максимальной длиной уравнений - 240 символов.

Членами выражения могут служить переменные, константы, литералы и обращения

к функциям (или короче - функции).

Пример выражения:

С.Н-(1-В.Н)/(2.7*(А.Н+МIN(0.ПР.Н))+EXP(-ВРЕМЯ)

Функции.

Функции служат для записи таких зависимостей, которые невозможно или неудобно описывать алгебраически. ИМИТАК имеет широкий набор встроенных функций (см. приложение).

В качестве функций могут также использоваться подпрограммы, написанные пользователем на других языках программирования (см.п.5.3).

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

<Имя функции> (<АРГУМЕНТ 1>,<АРГУМЕНТ 2>,....)

<Имя функции> - имя одной из встроенных функций "ИМИТАК" (см. приложение) или имя подпрограммы пользователя, реализующей необходимую зависимость. Имя функции может состоять только из латинских букв и цифр, начинаться всегда с буквы и иметь длину до 5 знаков. За именем функции в скобках через запятую указываются агрументы функции. Аргументами могут служить переменные, константы, литералы, другие обращения к функциям, а также массивы, элементы массивов и сечения массивов.

Если аргумент надо взять с противоположным знаком, можно указать перед ним знак "-" (минус). Перед массивом минус не допускается (эта оговорка не относится к массивам и сечениям, используемым поэлементно в векторных уравнениях на месте скалярных аргументов).

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

1) Выражение обязательно должно заключаться в круглые скобки;

2) В каждом выражении можно употреблять либо только сложение и вычитание ("+" и "-" ), либо только умножение ("*"), либо только деление ("/");

3) Количество членов выражения в скобках не должно превышать 15;

4) В качестве членов выражения можно использовать любые скалярные значения, в том числе и выражения в круглых скобках.

Например:

SIN((X.Н-ВЕТА)), ЕХР(((SIN(X)*COS(X))/(1-SIN((2*X)))))

Каждая функция предъявляет свои требования к количеству и составу аргументов. В любом случае аргументов не должно быть больше 15.

Массивы.

Во многих случаях удобно обозначать одним именем сразу несколько значений, если они имеют сходные закономерности изменения или используются совокупно. Для этого в "ИМИТАК" предусмотрены массивы.

Массивы - это переменные или константы, объединяющие под одним именем более одного значения. В отличии от массивов простые переменные и константы будем называть скалярами.

Отдельные значения внутри массива мы будем называть элементами массива.

Объявление массива. Список размерностей.

Массивы могут быть одно-, дву-, или трехмерными. Размерность массива задается непосредственно в уравнении, где он вычисляется или используется. Размернсти по каждому измерению указываются в скобках через запятую. Этот список размерностей следует за именем массива и отделяется от последнего двоеточием, например:

МАС:(5), А:(100,100), ПОТР:(15,15,10)

Массивом можно объявлять уровни, темпы, дополнительные переменные, а также константы. Если массив является переменной, список размерностей может стоять как до, так и после индекса времени:

НАСЕЛ.Н:(10) или НАСЕЛ:(10).Н

Размерности задаются положительными числами (литералами). Если число не целое, оно округляется до целого.

Общее количество элементов массива не должно превышать 32767.

Размерность массива достаточно задать один раз при первом употреблении имени в уравнении, далее имя массива записывается уже без списка размерностей.

Массивы необъявленной размерности.

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

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

Массивы необъявленной размерности - это единственный тип массивов, допустимый и в первой версии "ИМИТАК". Остальные средства работы с массивами реализованы только во второй и последующих версиях.

Массив в левой части уравнения.

Если массив стоит в левой части уравнения, это значит что правая часть уравнения используется многократно для вычисления каждого элемента этого массива. В правой части такого уравнения членами выражения могут быть как скаляры, так и массивы той же размерности, что и левая часть. Например:

У НАСЕЛ:(10).Н=НАСЕЛ.П+DT*(ТРОЖД:(10).ПН-ТСМЕР:(10).ПН)

При вычислении каждого элемента левой части берутся соответствующие элементы из массивов в правой части.

Элемент массива. Список индексов.

Если необходимо использовать один определенный элемент массива, то задается список индексов элемента. Индексы (номера) элемента записываются в скобках через запятую. Список индексов отделяется от имени массива знаком "#" (номер). Список индексов может стоять до и после индекса времени и списка размерностей. Например:

НАСЕЛ.Н:(10)#(7), ПОТР#(1,1,К.H):(15,15,10)

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

Дополнение. Список индексов может также заключаться в квадратные скобки без знака "#".

Сечение массива.

Имеется возможность в дву- и трехмерных массивах получить сечение - часть массива, образующуюся фиксацией одного или двух индексов. Сечение обозначается также, как и элемент массива, только вместо нефиксированных индексов ставятся звездочки - "*". Например:

ПОТР:(15,15,10)#(12,К.Н,*), ПОТР#(*,1,*), Потр#(*,*,J.Н)

Размерность сечения образуется теми измерениями целого массива, для которых указаны звездочки. Если звездочки заданы во всех индексах, то берется целый массив.

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

Д Х:(10,20).Н=А.Н*МАТ:(3,10,20)#(J.Н,*,*)-МАТ#(К.Н,*,*)
Д НЕСЧ.Н=ТАВLЕ(МСМЕР#(*,20):(25,20),ВРЕМЯ,1)

Элементы и сечения массивов в левой части уравнений.

Обычно элементы и сечения массивов употребляются в правых частях уравнений , а в левой части задается целый массив. Если отдельные части массива вычисляются различным образом, то можно в левой части задать сечение или отдельный элемент массива.

При этом действует дополнительное ограничение: - в списке индексов в левой части допускаются только скалярные переменные и константы, а также литералы; функции и элементы массивов в качестве индексов использовать нельзя, например:

У Х:(2,10)#(1,*).Н=Х.П#(1,*)+DT*(Т1.ПН#(*)-Т3.ПН#(*)
У Х#(2,*).Н=Х#(2,*)+DT*(Т2.ПН#(*)+Т3ПН#(*))
...
Д J.Н=QUANT(МАС,0)      Получить индекс J
Т3.НБ=RAND(0,МАХ3)      Вычмслить все элементы Т3:(10)
Т3.НБ#(J.H)=@MAX(X#(1,*))      Bычислить отдельно Т3#(J.H)

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

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

Встроенный цикл векторного уравнения.

Уравнение, в левой части которого стоит массив млм сечение, (но не элемент), назовем векторным.

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

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

Значения текущих индексов левой части векторного уравнения интерпретатор помещает во встроенные системные переменные I1, I2 и I3. В одномерном уравнении используется только I1 и I2; неиспользованные переменные равны нулю. В скалярном уравнении все три переменные равны нулю.

Переменные I1,I2 и I3 в отличие от всех прочих величин в ИМИТАК могут изменяться (и изменяются) в пределах одного уравнения.

Пользователь может использовать эти переменные только в правых частях векторных уравнений наравне с другими скалярными переменными.

Примеры:

Д В.Н:(10,20)=А.Н:(20,10)#(I2,I1)    транспонировать А
Д D:(5).Н=МАТ#(I1,I2,I3)    выбрать диагональные
Д С.Н:(5)=TABLE(MAC:(7,10)#(I1,*),НАСЕЛ.Н,0,1000)

Замечания.

Указание индексов I1, I2, I3 вовсе не эквивалентно записи звездочек. Звездочки задают сечение массива, а I1, I2, I3 - элемент массива (хотя и различный для каждого элемента левой части). Для I1, I2, I3 не обязательно, чтобы соответствующие размерности массива совпали с размерностью левой части уравнения. Ошибка будет зафиксирована только в том случае, если индекс перерастет соответствующую размерность, а если "не достанет" - ошибки нет. Таким образом можно пересылать элементы из больших массивов в меньшие.

Перенос уравнений. Комментарии.

Текст уравнения располагается, начиная с кол.3 (после типа оператора и следующего за ним пробела) и может продолжаться вплоть до кол. 80. После пробела можно записывать произвольную информацию (номер строки в кол.73-80, текстовый комментарий).

Текст уравнения можно переносить на следующую строку, прерывая его в любом месте. При этом в качестве типа оператора в следующей строке ставится "-" (перенос). Например:

У Х:(10,20,10).Н=Х Иллюстрация возможности переноса уравнения
- .П+D
- T*Т#(*,*,*).ПН

Допускается несколько строк продолжения, но общая длина текста уравнения не должна превышать 240 символов. Во всех строках могут быть комментарии.

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

Если программа начинается оператором комментария, то его содержимое переносится в заголовок страниц.

Ввод исходных данных.

Для проведения имитационного эксперимента необходимо задать значения констант, используемых в разделе описания модели, а также значения уровней в начальный момент времени. Для этой цели служит второй раздел ИМИТАК-программы -"Исходные данные".

Изобразительные средства этого раздела значительно менее разнообразны, чем в разделе описания модели.

Оператор присваивания значений.

Основной оператор раздела исходных данных - оператор присваивания значений.

Тип оператора - "И". Он имеет следующую структуру:

И <ИМЯ >=<ЗНАЧЕНИЕ>|<СПИСОК ЗНАЧЕНИЙ>

<ИМЯ> в операторе присваивания - это имя константы или уровня, которым присваивается значение.

<ЗНАЧЕНИЕ> записывается после знака "=" и представляет собой число в десятичном виде. Перед числом может стоять знак "-" (минус).

Например:

И НАСЕЛ=211000
И К2=-7.544

В операторе присваивания значений для имени не задается ни индекса времени, ни списка размерностей (если массив).

Если значения присваиваются массиву, то перед знаком "=" записывают имя массива, а значения задаются подряд друг за другом и разделяются дробной чертой ("/"). Например:

И МАС=1/2/2.5/3.6/-1.7/100/0
- 77.5

Количество значений должно соответствовать размерности массива.

Для двумерных и трехмерных массивов значения располагают по порядку изменения индексов (см.п.2.6.8).

Некоторые значения можно опускать, например:

И МАС=1/2/3/4/5/6/7/8/12/15/18
И МАС=//////////16/107/88/11/19/28

Разрешается использовать для одного имени несколько операторов присваивания. В этом случае новые значения заменяют прежние. Пропущенные значения не изменяются.

Если значения каким-либо величинам не были присвоены, по умолчанию берутся нулевые значения.

Присваивание значений системным величинам.

Начальное значение системного времени (время), величина элементарного интервала (DT), шага вывода результатов (шаг) интервала моделирования (длина) определяются в операторах присваивания значений аналогично другим величинам.

Разница состоит в том, что по умолчанию для системных величин (кроме "время") принимаются не нулевые значения, а следующие:

И DT=1
И ДЛИНА=20
И ШАГ=DТ

Правила записи раздела исходных данных.

Операторы типа "И" в разделе исходных данных располагаются в произвольном порядке.

Значения, задаваемые для массива, можно переносить на следующую строку. Правило переноса несколько строже, чем в описании модели:

Например:

И ТАБ=1/2/1/3/4
- 5/6/7/2/0
- 4/0/1/1/9
- 9///7/2

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

Предусмотрены также особые операторы для комментариев (тип оператора-"*"). Эти комментарии могут встиавляться в любое место раздела, даже между строками продолжения.

В конце раздела записывается оператор:

Е <произвольная информация>.

Запуск модели.

Разделы "Описание модели" и "Исходные данные" полностью подготавливают модель для проведения имитационного эксперимента. Третий раздел - "Запуск модели"- организует проведение эксперимента и выдачу результатов.

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

Есть также другая форма вывода - все значения за текущий момент времени. Она удобна для выдачи массивов.

Операторы вывода результатов отличаются лаконичностью и простотой языковых средств.

Табличный и графический вывод данных.

Для каждой переменной в ходе имитации расчитывается ряд значений. Первое значение соответствует начальному моменту системного времени, следующий -моментам времени с интервалом DT.

Вывод может выполняться с шагом, равным DT, или кратным ему. По умолчанию шаг вывода равен значению DT. Другое значение шага устанавливается системной константой с именем "шаг". Значение константе шаг присваивается обычным образом в разделе исходных данных, например:

И ШАГ=2.5

Значение константы "шаг" округляется до меньшего кратного DT.

Для организации вывода результатов используются операторы типа "Ч" ( числовой или табличный вывод) и "Г" (графический).

В операторе числового вывода перечисляются через запятую имена величин, которые надо выдать в табличной форме;

Ч <имя>,<имя>,...

<имя> может быть именем скалярной переменной или константы, или элементом массива. Элемент массива задается по правилам, принятым в описании модели (имя массива со списком индексов). В качестве индексов можно использовать только литералы.

Одному оператору "Ч" соответствует одна таблица. Количество перечисляемых имен не должно быть более 10. Если имен не больше 8, то первой графой таблицы служат значения переменной время.

Примеры:

Ч НАСЕЛ,ТРОЖД,ТСМЕР
Ч Х#(1,1),Х#(1,3),Х#(1,5),Х#(1,7),Х#(2,1),Х#(2,3),Х#(2,5)

Для вывода скалярных величин в виде графиков задается оператор "Г", в котором тоже перечисляются имена величин, но, кроме того, для каждого имени можно задать символ, которым должна чертиться соответствующая кривая:

Г <ИМЯ>=<СИМВОЛ>,<ИМЯ>=<СИМВОЛ>,...

<ИМЯ> - так же ,как и в операторе "Ч", А <СИМВОЛ> - любой знак, крорме пробела.

Если задано только имя, то график печатается первой буквой имени.

В одном операторе "Г" допускается до 10 имен.

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

Г КАЖДЫЙ:<ИМЯ>....

Либо использование масштаба первой кривой для всех остальных:

Г ПЕРВЫЙ:ТРОЖД=Р;ТСМЕР=С,НАСЕЛ=Н,Х#(1,1)=*


ПРИЛОЖЕНИЕ.
Встроенные функции

Функция минимума (MIN)
Функция максимума (MAX)
Минимум из элемента массива (@MIN)
Максимум из элемента массива (@MAX)
Сумма элементов массива (ADD)
Произведение элементов массива (MULT)
Функция сравнения двух величин (CLIP)
Функция сравнения с нулем (SWTCH)
Функция ограничения (LIMIT)
Функция выборки по времени (SMPLE)
Импульсная функция (PULSE)
Табличная функция (TABLE)
Табличная функция с нулевыми полями(TABLZ)
Функция работы с дискретным массивом чисел (QUANT)
Функция многократной работы в одном шаге с массивом чисел (QUANM)
Функция равномерно распределенной случайной величины (RAND)
Имитация случайного события ЕVENT
Нормальное распределение GAUSS
Функция задержки DELAY
Функция табличной задержки DELTB
Функция модуля (MOD)
Функция фиксации знака (SIGN)
Функция синуса (SIN)
Функция косинуса (COS)
Функция натурального логарифма (LOGN)
Экспоненциальная зависимость (EXP)
Функция возведения в степень (RANGE)
Функция округления (WHOLE)
Накапливающее суммирование (SUM)
Функция ожидания (WAIT)
Функция очереди (FIFO)
Функция многовходовой очереди (FIFON)
Функция определения текущей длины очереди (LFIFO)
Функция выборки элемента массива (EL).
Функция выбора варианта действий (MENU).
Функция запроса значения (GET).
Функция XXTAB - найти пересечения двух кривых, заданных таблично
Функция TBLX - определить горизонтальную координату по заданному значению табличной функции

Функция минимума МIN

Данная функция позволяет в каждый момент времени моделирования выбирать минимальное из значений аргументов.

Общий вид функции: MIN (A1.A2,...) В функции можно указывать до 15 скалярных аргументов. Функция определена при любых значениях аргументов.

Функция максимума MAX

Данная функция позволяет в каждый момент времени моделирования выбирать максимальное из значений аргументов.

Общий вид функции: MAX (A1,A2,...)

Функция аналогична функции MAX.

Mинимум из элементов массива @MIN

Функция получает один аргумент - массив произвольной размерности или сечение массива: @MIN(M) Из элементов массива (сечения) выбирается наименьший, значение которого и выдается как результат функции.

Максимум из элементов массива @MAX

Функции передается один аргумент - массив или сечение: @MAX(M)

Результат - значение максимального из элементов массива.

Сумма элементов массива ADD

Единственный аргумент функции - массив (сечение): ADD(M)

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

Произведение элементов массива MULT

Аргумент функции - массив или сечение любой размерности. MULT(M)

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

Функция сравнения двух величин (CLIP)

Функция сравнивает между собой значения двух последних аргументов и в зависимости от результата выдает одно из двух указанных значений:

CLIP(A,B,C,D) = | A, если С <= D
| B, если С > D

Функция сравнения с нулем SWTCH

Последний аргумент функции сравнивается с нулем; по результатам сравнения ( равенству или неравенству) выдается одно из двух заданных значений:

SWTCH(A,B,C) = | A, если С = 0
| B, если С # 0

Функция ограничения LIMIT

Функция позволяет ограничить диапазон изменения первого аргументов пределами, заданными вторым и третьим аргументами:

LIMIT(A,B,C) = | B, если A < B
| A, если B <= A <= C
| C, если A > C

Функция выборки по времени SMPLE

Функция SMPLE выдает значение первого аргумента в моменты времени, начиная с указанного, и с заданной периодичностью. В остальные моменты системного времени выдается нуль. Обращение к функции:

SMPLE(A,B,C) = | A, если ВРЕМЯ = В + КС (К=0,1,2 ...)
| 0, если ВРЕМЯ # В + КС

где А - значение, которое должно быть выдано в указанный момент времени; В - первый момент времени, когда выдается значение А; C - интервал времени, через который функция SMPLE снова выдает значение первого аргумента.

Если третий аргумент функции не больше нуля, то функция не определена.

Импульсная функция (PULSE)

Функция PULSE выдает последовательность прямоугольных импульсов единичной амплитуды, начиная с указанного момента системного времени, указанной и периодичностью и длительностью, в остальные моменты выдается нуль:

PULSE(B,C,D) = | 1, если В + КС <= ВРЕМЯ <= B + KC + D
| (К=0,1,2 ...)
| 0, если B + KC + D < ВРЕМЯ < B + KC

Если второй аргуиент (период импульсов) не больше нуля, то функция не определяется.

Табличная функция TABLE

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

Общий вид функции:

TABLE(M,A,K1,K2) = | M(1), если A <= K1
| M(J), если A = K1 + (J−1) × K2
| (M(J+1) − M(J)) (A−(K1 + (J−1)×K2)) / K2 + M(J),
| если (K1 + (J−1)K2) < A < (K1+J×K2),
| M(N) , если A > K1 + (N−1) × K2

где М - массив значений функции М(1), М(2), М(3)... Этот массив обязательно определяется во втором разделе модели-программы оператором:

И М=М(1)/М(2)/М(3)/М(4).../М(N)

A - aргумент табличной функции; шкалу аргумента A, соответствующую заданным точкам функции, определяют аргумент К1 и К2;
К1 - значение аргумента функции, соответствующее начальной точке М(1);
К2 - шаг изменения аргумента между двумя соседними точками (значениями функции).

Табличная функция с нулевыми полями TABLZ

Функция TABLZ аналогична TABLE, но отличается от нее тем, что за пределами таблицы значений она равна не крайним значениям, а нулю. Общий вид функции:

TABLZ(M,A,K1,K2) = | 0, если A < K1
| M(J), если A = K1 + (J−1) × K2
| (M(J+1) − M(J)) (A−(K1 + (J−1)×K2)) / K2 + M(J),
| если (K1 + (J−1)K2) < A < (K1+J×K2),
| 0, если A > K1 + (N−1) × K2

где М - массив значений функции М(1), М(2), М(3)... Этот массив обязательно определяется во втором разделе модели-программы оператором:

И М=М(1)/М(2)/М(3)/М(4).../М(N)

A - aргумент табличной функции; шкалу аргумента A, соответствующую заданным точкам функции, определяют аргумент К1 и К2; К1 - значение аргумента функции, соответствующее начальной точке М(1); К2 - шаг изменения аргумента между двумя соседними точками (значениями функции).

Функция работы с дискретным массивом чисел QUANT

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

QUANT(M,A) = | M(-A), если A < 0 (прямая выборка)
| M(J), если 0 <= A < 1 (последовательная выборка)
| 0, если A >= 1 (нет выборки)

где М - массив чисел, задаваемых в разделе исходных данных:

И М=М(1)/М(2)/...M(N)

A - аргумент функции, работающий как ключ: J - 1,2,..., N номер очередного выбранного элемента массива М.

Прямая выборка выполгяется, если A < 0. Значение A берется с противоположным знаком, округляется до целого и используется как номер выбранного элемента массива. Если этот номер окажется больше количества значений в массиве, произойдет прерывание "функция не определена".

Последовательно-циклическая выборка осуществляется, когда 0 <= A < 1. Выбирается очередной элемент массива, следующий за выбранным прежде прямой или последовательной выборкой. Таким образом, функция всегда "помнит" номер выданного ею значения. Если предыдущее значение было последним, то следующим выбирается первый элемент, как и в случак, когда выборки значений еще не было.

Запрет выборки устанавливается, если A >= 1. При таком вызове QUANT иыдает нуль и остается на том же элементе массива, на котором была. В "ИМИТАК-2" в качестве массива М может использоваться явный массив произвольной размерности. QUANT интерпретирует его как одномерный массив.

Функция многократной работы в одном шаге с массивом чисел QUANM

Функция аналогична функции QUANT, но в отличие от нее все вызовы QUANM, работающие на один и тот же массив, действуют как единая функция, даже если записаны в разных уравнениях.

Функция равномерно распределенной случайной величины (RAND)

Данная функция в каждом шаге моделирования генерирует случайное число внутри заданного интервала, причем множество сгенегированных чисел подчиняется закону равномерного распределения. Общий вид функции:

RAND (A,В)

где A и B задают интервал распределения случайной величины (A < B).

Имитация случайного события ЕVENT

Функция EVENT иммитирует совершение случайного события с известной вероятностью. Вероятность события за единицу времени задается аргументом этлй функции:

EVENT(A)

Значением функции является либо единица (событие произошло), либо нуль. При каждом обращении к функции вероятность выдачи единицы составляет: 1 - (1-A)DT

Нормальное распределение GAUSS

Функция GAUSS(A,B) выдает случайную величину с нормальным законом распределения вероятностей (распределение Гаусса):

GAUSS(A,B)

где A - математическое ожидание; В - среднеквадратическое отклонение.

Функция задержки DELAY

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

См.рис. к функции TABLE.

Функция табличной задержки DELTB

Функция DELTB сочетает в себе свойства функции задержки и табличной функции. Обращение к функции имеет вид:

DELTB(M,A,B),

где M - массив, задающий кусочно-линейную зависимость по типу TABLZ; A - аргумент функции, значение которого будет преобразовано ею в кусочно-линейную зависимость, заданную массивом M; B - величина задержки, которая "растягивает" или "сжимает" кусочно-линейную зависимость таким образом, чтобы ее среднее арифметическое пришлось на момент ВРЕМЯ+B. Величина задержки B может быть переменной.

Значение аргумента A, поступающее на вход функции DELTB в каждом цикле, сразу разворачивается в свою кривую задержки с учетом параметра B, и в последующих циклах эта кривая уже не изменяется, а только суммируется с кривыми задержки, сформированными в предыдущих и последующих циклах.

Функция модуля MOD

Данная встроенная функция позволяет получать абсолютную величину от аргумента:

MOD(A) = | A, если А >= 0
| -A, если А < 0

Функция фиксации знака (SIGN)

SIGN(A) = | 1, если A >= 0
| -1, если A < 0

Функция синуса SIN

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

SIN(A)

Функция косинуса COS

Cтандартная тригонометрическая функция - косинус, аналогична функции SIN. Общий вид функции:

COS(A)

Функция натурального логарифма LOGN

Данная функция позволяет получать натуральный (логарифм по основанию Е) от аргумента разложением в степенной ряд. Общий вид функции:

LOGN(A)

Функция определена только при значении аргумента A > 0 При значениях аргумента, близких к нулю, возможно переполнение.

Экспоненциальная зависимость EXP

Значением функции является число Е в степени,указанной аргументом:

EXP(A) = EА

где Е - основание натурального логарифма.

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

Функция возведения в степень RANGE

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

Общий вид функции

RANGE(A.B) = AВ

Функция RANGE не определена в двух случаях:

Кроме того возможно переполнение при больших значениях аргументов.

Функция округления (WHOLE)

Значение первого аргумента округляется до целого числа в зависимости от значения второго аргумента. Общий вид функции:

WHOLE(A,K)

где A - округляемая величина; К - константа, задающая режим округления. Если К = 1, то значение A округляется до ближайшего целого числа; Если К < 1, то округление происходит в меньшую сторону отбрасыванием дробной части; Если К > 1, то выполняется округление до большего целого. Параметр К может быть опущен, при этом подразумевается 1.

Накапливающее суммирование (SUM)

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

SUM(A)

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

Функция ожидания (WAIT)

Функция ожидания имитирует занятость како-либо объекта в течение заранее известного периода времени. Величина периода занятости в единицах времени задается аргументом:

WAIT(A)

В исходном состоянии WAIT свободна - выдает нуль и ждет нулевого аргумента.

Если величина A больше нуля, то WAIT включает состояние "занято"- выдает единицу и перестает воспринимать аргумент А вплоть до конца указанного периода. В каждом следующем цикле имитации WAIT выдает единицу и игнорирует аргумент.

В последнем цикле интервала занятости WAIT выдает значение, несколько меньшее единицы. Когда интервал занятости кратен DT, выданное значение чуть меньше единицы, а когда не кратен - оно равно дробной части интервала занятости, выраженного в единицах DT. Если в этом цикле величина аргумента больше нуля, то WAIT снова включает состояние "занято", начиная со следующего цикла; если аргумент нулевой, то WAIT освобождается. Складывая значения, выдаваемые функцией WAIT, можно подсчитать суммарное время занятости имитируемого объекта ( в единицах DT). Кроме того, эти значения используются для синхронизации функций FIFO, FIFON и др..

Функция очереди (FIFO)

Иммитирует постановку в очередь неких заявок, их продвижение и выход на обслуживание. Название функции от "FIRST IN - FIRST OUT" ("первым пришел - первым обслужен"). Каждая заявка представлена числовым значением (например, временем последующего обслуживания). Движение заявок в очереди имитируется движением чисел в массиве, порождаемом функцией FIFO. FIFO имет четыре аргумента:

FIFO (A,K1,K2,L)

где A - числовое значение заявки, которая должна быть поставлена в очередь; К1 - ключевой аргумент, управляющий постановкой в очередь; если К1 < 1, заявка А ставится в очередь, если К1 >= 1 - не ставится; К2 - ключевой аргумент, управляющий выходом из очереди; при К2<1 первая заявка из очереди выдается в качестве значения функции, а очередь продвигается на одну позицию; при К2 >=1 выдается нуль, и очередь не продвигается; L - максимальная длина очереди; если количество заявок превышает эту величину, новая заявка в очередь не ставится.

Функция многовходовой очереди (FIFON)

В первой версии ИМИТАК существовали функции FIFO0, FIFO1,...FIFO9, которые позволяли имитировать до десяти многовходовых очередей. В "ИМИТАК-2" для этих целей используется одна функция FIFON, а идентификатор очереди вынесен из функции в пятый аргумент;

FIFON(A,K1,K2,L,K)

Первые четыре аргумента имеют тот же смысл, что и в функции FIFO; пятый аргумент К - положительная константа, которая после округления до целого служит идентификатором очереди. Все FIFON c одинаковым значением К имеют дело с одной и той же очередью. Количество разных значений идентификатора (т.е. количество очередей в модели) не регламентируется.

При К = 0 функция FIFON как и FIFO генерирует отдельную очередь, недоступную для других обращений к FIFON.

Функция определения текущей длины очереди (LFIFO)

Функция LFIFO позволяет получить текущее количество заявок в очереди. Обращение к этой функции - такое же, как к FIFO:

LFIFO(A,K1,K2,L)

Первый аргумент игнорируется, а остальные используются для имитации динамики количества заявок в очереди.

Функция выборки элемента массива (EL).

Функция EL служит для выборки из массива конкретного элемента по указанным индексам. В отличие от обычного обращения к элементу массива, функция EL "прощает" выход индексов за пределы размерности, выдавая в подобном случае либо нуль, либо заданное аргументом значение. Количество аргументов функции зависит от размерности массива. Для одномерного массива:

EL(M,J1) или EL(M,J1,A)

Для двумерного массива:

EL(M,J1,J2) или EL(M,J1,J2,A)

Для трехмерного массива:

EL(M,J1,J2) или EL(M,J1,J2,A)

где М - массив любой размерности; J1,J2,J3 - значения индексов соответственно, по первому второму и третьему измерениям; A - значение, выдаваемое функцией, если любой из индексов выходит за пределы размерности; этот аргумент необязателен, если опущен, принимается нуль. Функция не определена, если количество аргументов не соответствует количеству измерений массива.

Функция выбора варианта действий MENU.

Функция MENU относится к интерактивным средствам языка моделирования. Она позволяет в процессе моделирования запросить у исследователя выбор варианта действий. Возможные варианты должны быть предусмотрены при создании модели.

Обращение к функции имеет вид:

MENU(КОММ,НАЧ,УМОЛЧ)

где КОММ - номер комментария, каждая строка которого интерпретируется как пункт меню; НАЧ - пункт меню, который выделен при выдаче меню на экран; УМОЛЧ - значение, выдаваемое функцией MENU в случае, когда пользователь нажимает Esc. Этот параметр может быть опущен, при этом подразумевается 0.

Функция возвращает либо номер выбранного варианта (строки меню) 1,2,... либо значение УМОЛЧ, если нажата клавиша Esc.

Номер комментария КОММ может быть от 1 до 99. Если указанного комментария не существует, запрос пользователю не выдается, при этом функция возвращает нуль.

Функция запроса значения GET.

Обращение к функции имеет вид:

GET(КОММ,МИН,МАКС,УМОЛЧ,A1,A2,...)

Функция GET приостанавливает имитацию и запрашивает ввод значения, которое она и возвращает в иодель. При этом КОММ указывает номер комментария (1...99), который используется в запросе значения. МИН и МАКС задают допустимый интервал для вводимого значения. Если введено число вне диапазона, программа повторяет запрос. Если МИН больше МАКС, то ввода не происходит; функция GET приостанавливает имитацию, но не открывает поле для ввода значения; возвращается при этом значение УМОЛЧ. Аргументы A1,A2,... не влияют на возвращаемое значение, а только выдаются на экран, чтобы исследователь мог оценить их значения и принять решение по поводу ввода.

Функция XXTAB - найти пересечения двух кривых, заданных таблично.

Обращение к функции:

XXTAB(МАС1,МАС2,К)

Функция XXTAB находит точки пересечения двух кривых, заданных, соответственно, массивами МАС1 и МАС2. Шкалы обеих кривых предполагаются одинаковыми, с началом нуль и интервалом единица. Функция возвращает: при К < 0 - количество точек пересечения; при 0 <= К < 0.5 - координату последней (самой правой) точки пересечения на горизонтальной шкале (с началом нуль и шагом единица); при К>=0.5 - координату точки пересечения номер К. Если точки пересечения нет, то координата равна -1.

Функция TBLX - определить горизонтальную координату по заданному значению табличной функции.

Функция TBLX является обратной к табличной функции, если, конечно, табличная зависимость монотонна. Обращение к функции сходно с обращением к TABLE:

TBLX(МАС,ЗНАЧ,К1,К2),

где МАС - массив значений табличной функции; ЗНАЧ - значение, горизонтальную координату которого требуется определить.

Функция находит точку табличной кривой, значение которой равно ЗНАЧ, и возвращает горизонтальную координату этой точки по шкале начало - К1, шаг- К2. Если точек нет, выдается -1, а если их более одной, выдается координата самой левой точки.

Сайт управляется системой uCoz