Файл: Практикум Моделирование систем в среде AnyLogic 8.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 383

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

Введение

1. Событийное моделирование

1.1. Моделирование колебательного процесса

1.2. Контрольные задания

1.3. Модель «Жизнь»

1.4. Контрольное задание «Фигуры»

1.5. Анимация поведения агента

Контрольные вопросы

2. Реагирующие системы

2.1. Модель светофора для управления движением

2.2. Модель пешеходного перехода

2.3. Контрольное задание “Переход, управляемый пешеходом”

2.4. Контрольное задание “Модель кодового замка”

2.5 Модель трех разрядного счетчика

2.6. Контрольное задание «Запуск события при получении контрольного значения»

Контрольные вопросы

3. Моделирование элементов цифровых систем управления

3.1. Семи сегментный дисплей.

3.2. Модели элементарных логических операций

3.3. Полный сумматор

Контрольные вопросы

4. Системная динамика

4.1. Модель реализации продукта по Бассу

4.2. Контрольное задание «Учет повторных покупок»

4.3. Контрольное задание «Модель распространения эпидемии»

4.4. Взаимодействие активных классов

4.5. Контрольное задание «Визуализация модели динамики численности населения»

Контрольные вопросы

5. Агентное моделирование

5.1. Популяция агентов

5.2. Поведение агентов

5.3. Учет влияния общения между потребителями

Контрольные вопросы

6. Задания для самостоятельной работы

Приложение

Основные сведения о языке программирования Java

Классы Java

Типы данных Java

Присваивание значений в выражениях В общем виде оператор присваивания имеет вид:v=результат_выражения;v – переменная определенного типа.При выполнении присваивания нужно учитывать правила приведения типов. Если тип переменной в левой части и тип результата выражения совместны, то происходит автоматическое преобразование типов. Такое преобразование возможно, если выполнено два условия:два типа совместимы;тип, к которому выполняется приведение, обладает большей разрядностью, чем исходный. При выполнении этих условий говорят расширяющем преобразовании. Например, к типу int (разрядность 32) возможно преобразование типа byte (8 разрядов).В языке Java определены следующие правила расширения:если операнды в выражении относятся к типам byte и short то они автоматически расширяются до типа int перед проведением вычислений; если один операнд имеет тип long, тип целого выражения расширяется до long; если один операнд – типа float, то тип всего вы­ражения расширяется до float;если тип любого из операндов – double, то тип результата – также double.Результат деления целых чисел дает вещественное значение.При преобразовании переменных несовместимых типов используется явное приведение типов:v=(type) результат_выражения;Где: type тип переменной в левой части оператора присваивания.Преобразование такого типа бывает:Сужающим – когда выполняется приведение от типа с большей разрядностью к типу с меньшей разрядностью.Усеченным – когда вещественный тип преобразуется к целому при этом дробная часть числа отбрасывается. Операции Java Основные арифметические операции сведены в таблицу 2.Таблица 2 Арифметические операции Операция Назначение + Сложение - Вычитание * Умножение / Деление % Получение остатка от деления ++ Инкремент += Присваивание со сложением -= Присваивание с вычитанием *= Присваивание с умножением /= Присваивание с делением %= Присваивание с модулем(остаток от деления) -- Декремент Кроме арифметических операций в языке Java определены битовые – поразрядные операции. Они применимы к переменным типа long, int, byte, char, short (см. таблицу 3).Таблица 3. Поразрядные операции Операция Назначение Отрицание & Конъюнкция (И) | Дизъюнкция (ИЛИ) ^ Исключающее ИЛИ >> Правый сдвиг >>> Сдвиг в право с заполнением старшего бита нулем << Левый сдвиг &= Присваивание И |= Присваивание ИЛИ ^= Присваивание с исключающим ИЛИ >>= Присваивание с правым сдвигом >>>= Присваивание со сдвигом вправо, старший бит заполняется нулем <<= Присваивание со сдвигом влево При составлении условий используются логические операции из таблицы 4.Таблица 4Операции отношения Операция Назначение == Сравнение != Не равно > Больше < Меньше >= Больше, либо равно <= Меньше, либо равно Результат логической операции – значение типа boolean. Результаты выполнения логических операций можно использовать в логических выражениях. Такие выражения составляют с помощью булевых операций таблицы 5.Таблица 5Булевы операции Операция Назначение ! Отрицание && Логическая операция И || Логическая операция ИЛИ ^ Логическая операция исключающее ИЛИ 1   ...   11   12   13   14   15   16   17   18   19

Приоритет в выражениях Операции в выражениях выполняются в соответствии с определенным приоритетом таблицы 6.Таблица 6 Приоритеты Приоритет Операции 1 ++,--,,! 2 *,/,% 3 +,- 4 >>,>>>,<< 5 >,>=,<,<= 6 ==,!= 7 & 8 ^ 9 | 10 && 11 || Для изменения приоритета в выражениях используются круглые скобки. Управляющие операторы Условный оператор.if (условие) {//Операторы при условии = true}else {//Операторы при условии = false}условие – логическое выражение. Допускается не использовать ветку else «иначе». Многозвенный оператор ветвления.if(условие){}else if (условие1) {}else if (условие2) {}else {}Операторы if выполняются последовательно сверху вниз. Как только одно из условий становится равным true, то выполняется оператор, связанный с этим if, а остальные проверки условий пропускаются. Если ни одно из условий не даст значение true, то будет выполнен последний оператор else. Заключительная часть else действует как условие по умолчанию, если все другие условные проверки не успешны. Оператор селектор.switch (условие) {case значение_1:{//операторыbreak}case значение_2:{//операторыbreak}…Default:{//операторы}}Здесь условие – селектор переменная или выражение, которое должно возвращать значение типа byte, int, short, char. Выполняется та часть блока case, где значение совпадет с селектором, оператор break, завершает работу оператора switch. Если совпадений нет, то выполняются операторы блока default. Этот блок может отсутствовать.Оператор цикла while:while (условие) {//операторы}Выполняется до тех пор, пока условие равно true.Оператор цикла do while.do {//операторы}while (условие);Такой цикл выполняется всегда один раз.Цикл типа for.for (exp1;exp2;exp3){//операторы}Используется для выполнения тела цикла определенное число раз.Где:exp1 – начальное значение счетчика цикла;exp2 – условие выхода из циклы;exp3 – выражение для изменения счетчика цикла.Для управления работой циклов используются операторы: break и continue.Первый оператор позволяет прервать работу цикла. Для передачи управления на заданный оператор используется формат оператора с меткой break метка_оператора; Метка оператора должна заканчиваться двоеточием. Второй оператор служит для перехода к следующему шагу – итерации цикла. Все операторы лежащие «ниже» его в теле цикла пропускаются. В циклах while и do while выполнение оператора приводит к передаче управления условию, а в цикле for выражению, которое изменяет счетчик цикла. Оператор может быть использован с меткой. Метка должна помечать оператор цикла, которому передается управление. Такая форма используется при создании вложенных циклов.Оператор break используется также для завершения работы оператора ветвления с передачей управления на определенный помеченный оператор.Оператор return. Оператор используется для принудительного завершения работы метода класса. Если метод возвращает значение, то оператор должен содержать аргумент, тип которого совпадает с типом возвращаемого значения: return аргумент; В языке Java нет оператора goto.1   ...   11   12   13   14   15   16   17   18   19

Массивы и их задание

Обработка строк

Класс Math. Математические функции

Обработка исключительных ситуаций

Цвет и его кодирование

Элементы управления и фигуры презентации

Текстовое поле

Элемент слайдер

Командная кнопка

Элемент «Текст»

Элемент «Прямоугольник»

Ординарные события AnyLogic

Динамические события AnyLogic

Список литературы


Рис. 2.14. Ввод неверного кода





Рис. 2.15. Код верный

Методические указания:

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



Рис. 2.16. Стейтчарт кодового замка.

Состояния кодового замка:

stateBlink – задает мерцание сигнала дисплея;

stateControl – проверка кода введенного пользователем;

stateOK – вывод сообщение о том, что код верный;

stateError – вывод сообщения о неверном коде.

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

Чтобы обслуживать текстовый дисплей замка используйте методы текстового поля:

setText(String s) – запись в поле строки;

String getText() – чтение строки из поля.

2.5 Модель трех разрядного счетчика


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

Создайте новую модель ModelCounter. Разместите в нее агент Gen (генератор тактовых импульсов). Структура класса показана на рисунке 2.17.

Поместите в поле агента скругленный прямоугольник из палитры «Презентация» и активизируйте его свойство «Значок». На прямоугольник поместите элемент «Текст» и введите строку текста ГТИ (генератор тактовых импульсов). Для текста активизируйте свойство «Значок».

Расположите порт на контуре прямоугольника, так как это показано на рисунке 2.17. Для этого используйте элемент «Порт» палитры «Агент».



Рис. 2.17. Значок активного класса

Порт позволяет принимать и отсылать сообщения. Присвойте порту имя tick. Настройте свойства порт таким образом, что бы тип входящего и исходящего сообщения был Object – абстрактное сообщение. Проверьте наличие секции «Действия при обработки сообщений». Если ее нет, то используйте команду меню AnyLogic «Инструменты», выберите команду «Настройки» и установите в активное состояние режим «Режим разработчика библиотек» (рисунок 2.18). Порты образуют интерфейс агента.



Рис. 2.18. Настройка параметров

Разместите в поле класса параметр t0. Этот параметр определяет частоту срабатывания генератора. Тип параметра double. Значение по умолчанию равно 0.

Разместите элемент «Событие» и настройте его свойства так, как это показано на рисунке 2.19.



Рис. 2.19. Настройка события

В поле действие события следует ввести оператор Java для обращения к методу send порта генератора импульсов. Методу передается экземпляр абстрактного объекта.

Свойство порта «Отображается на верхнем уровне» должно быть активным. Свойство «Отображать имя» сделайте не активным.

Создайте агент Counter (разряд счетчика). Структура активного класса показана на рисунке 2.20.



Рис. 2.20. Активный класс разряда счетчика

Создайте интерфейс агента. Для создания интерфейса используйте скругленный прямоугольник, прямоугольник – значок агента. Расположите на значке порты так, как это показано на рисунке 2.20. Поместите на значок агента статический текст «0» с помощью элемента «Текст» палитры «Презентация». У статического текста свойство «Значок» должно быть активным.

На контур прямоугольника разместите два порта. Правый порт «in», левый порт «out». Порты должны быть настроены на прием и отсылку сигнала типа «Object». У портов сделайте свойства «Отображать имя» и на «На верхнем уровне» активными.

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

Порт out. Наличие сообщения в этом порте говорит о переполнении числа единиц в разряде счетчика.

Порт in. Принимает сообщение. В свойстве «Действие при получении» следует ввести код Java:

if (n == 9) {

n = 0;

out.send(new Object());

} else{

n++;

}

text.setText(n);

В коде запрограммирован подсчет числа единиц. Если число единиц равно 9, нужно вызвать метод send порта out и поместить в него абстрактное сообщение, что является сигналом переполнения.

Откройте корневой агент модели Main и разместите в него экземпляр агента Gen и три экземпляра агента Counter. Для соединения экземпляров по портам используйте элемент «Соединитель»

из палитры «Агент». При правильном соединении точки соединения помечаются зеленым цветом. Разместите в поле агента Main три временных графика для отображения значений разрядов счетчика.

Вид поля агента Main показан на рисунке 2.21. Чтобы названия экземпляров агентов не выводились в поле агента нужно установить значение свойства экземпляра «Отображать имя» в неактивное состояние.



Рис. 2.21. Корневой агент Main

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

имя_экземпляра_счетчика.n

Настройте эксперимент Simulation, граничное время моделирование не задано. Запустите модель. Перед запуском модели следует задать значение t0 для генератора тактовых импульсов. Для этого выделите агент ГТИ в поле модели и задайте период срабатывания равным одной единице модельного времени (рисунок 2.22).



Рис. 2.22. Задание значения параметра

Вид модели должен соответствовать рисунку 2.23.



Рис. 2.23. Модель трехразрядного счетчика

2.6. Контрольное задание «Запуск события при получении контрольного значения»


Постройте модель с трех разрядным счетчиком. Когда счетчик выдает показание равное 100 единицам, срабатывает генератор случайных чисел имеющих равномерное распределение в диапазоне от 0 до 1. Отсчет счетчиком прекращается. Для вывода показаний счетчика и случайных чисел используйте текстовые поля. Вывод случайных чисел производится в текстовое поле с округлением до третьего знака после запятой. Вид работающей модели показан на рисунке 2.24. Генератор случайных чисел активен.



Рис. 2.24. Вид работающей модели

Методические указания:

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



Где counter – младший разряд счетчика, n – цифра разряда.

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

Второе событие выполняет генерацию случайного числа в текстовое поле. Режим запуска события «Ручной».

Период работы событий один или две единицы модельного времени.

Контрольные вопросы


  1. Как представляется конечный автомат в нотации UML?

  2. Как показывается событие в конечном автомате UML?

  3. Дайте классификацию переходов UML.

  4. Что такое композитное состояние UML?

  5. Объясните особенности исторических состояний UML.

  6. Как строятся конечные автоматы с параллельными вложенными конечными автоматами?

  7. Для чего используется псевдо состояние синхронизации в UML?

  8. Как виды переходов определены в UML для конечных автоматов?

  9. Дайте классификацию состояний стейтчарта AnyLogic?

  10. Как выполняется управление переходами в стейтчарте AnyLogic?

  11. Как строятся стейтчарты с альтернативным выбором переходов в AnyLogic?

  12. Как в AnyLogic строятся стейтчарты с поверхностным историческим состояниями?

  13. Как в AnyLogic строятся стейтчарты с глубокими историческими состояниями?

  14. Как выполняется обмен сообщениями между стейтчартами AnyLogic?

  15. Как строится взаимодействие между экземплярами классов агентов с помощью портов?

  16. Как настраивается порт агента?

3. Моделирование элементов цифровых систем управления

3.1. Семи сегментный дисплей.


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

Сегменты дисплея создаются с помощью элемента «Линия». Идентификатор каждого элемента задается в виде segi где i номер сегмента. Нумерация сегментов показана на рисунке 3.1. Для создания контура элемента используется элемент «Прямоугольник» (рисунок 3.2).



Рис. 3.1. Нумерация сегментов дисплея



Рис. 3.2. Агент «Дисплей»

На контур пиктограммы дисплея следует разместить порты. Порты семи сегментного дисплея нумеруются с права на лево начиная с нулевого разряда отображаемого двоичного числа. Условные обозначения портов: inAi, где i={0,1,2,3}. Порты настроены на прием и отправку сигнала целого типа.

Для приема кодов из портов в состав агента – активного класса следует разместить четыре переменных vIni типа double. Где i – номер переменной. Нумерация переменных соответствует нумерации портов.

При получении согнала в порт должен исполняться код:

vIni=(double)msg.intValue();

Где i – номер переменной.

Что бы преобразовать двоичный код в шестнадцатеричный код нужно создать две функции.

Функция getNumber. Возвращает значение типа double преобразованного двоичного сигнала в десятичный код. Аргументы функции – четыре формальные параметра a0, a1, a2, a3. Тип формальных параметров double. Это двоичные разряды сигнала подлежащего преобразованию.

Код функции:

double v0,v1,v2,v3;

v0=0;v1=0;v2=0;v3=0;

if (a0==1) {v0=1;}

if (a1==1) {v1=2;}

if (a2==1) {v2=4;}

if (a3==1) {v3=8;}

double s=v0+v1+v2+v3;

return s;



Рис. 3.3. Кодирование шестнадцатеричных цифр

Вторая функция setSegment служит для «показа» на дисплее изображения шестнадцатеричный цифры в соответствии с принятой схемой кодирования, показанной на рисунке 3.3. Функция возвращает значение типа double. Аргумент функции – формальный параметр n. Это код в десятичной системе подлежащий отображению.