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

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

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

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

Добавлен: 04.02.2024

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

Скачиваний: 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

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



Активные сегменты дисплея окрашиваются в оранжевый цвет - orange. Не активные в бледно оранжевый цвет - bisque. Нулю соответствуют сегменты 0, 2, 3, 4, 5, 6. Структура кода функции:

//Сброс подсветки дисплея

seg0.setColor(bisque);

seg1.setColor(bisque);

seg2.setColor(bisque);

seg3.setColor(bisque);

seg4.setColor(bisque);

seg5.setColor(bisque);

seg6.setColor(bisque);

if (n==0){

seg0.setColor(orange);

seg2.setColor(orange);

seg3.setColor(orange);

seg4.setColor(orange);

seg5.setColor(orange);

seg6.setColor(orange);

}

if (n==1){

seg0.setColor(orange);

seg2.setColor(orange);

}

if (n==2){

seg0.setColor(orange);

seg1.setColor(orange);

seg3.setColor(orange);

seg4.setColor(orange);

seg6.setColor(orange);

}

if (n==3){



}



if (n==15){



}

return 0;

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

Переменная flowNumber служит для вызова функции:

getNumber(vIn0,vIn1,vIn2,vIn3)

Переменная flowDisplay используется для вызова функции:

setSegment(flowNumber)

Что бы выполнить тестирование созданного элемента создадим новый элемент ToggleSignal. Схема агента класса элемента показана на рисунке 3.4



Рис. 3.4. Структура агента ручного задания двоичного сигнала

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

Код кнопки:

if (vFlag) {

vFlag=false;

text.setText("1");

outY.send(new Integer("1")); }

else {

vFlag=true;

text.setText("0");

outY.send(new Integer("0")); }

Где vFlag – переменная логического типа элемента, значение по умолчанию равно «Истина». Для генерации по умолчанию на выходе порта значения равного нулю нужно использовать простое событие event выполняющееся один раз с кодом:

outY.send(new Integer("0"));

Протестируйте работу дисплея.
Таблица 3.1

Коды цифр

Десятичный

код

Двоичный

код

Шестнадцатеричный

код

0

0000

0

1

0001

1

2

0010

2

3

0011

3

4

0100

4

5

0101

5

6

0110

6

7

0111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

15

1111

F



На рисунках 3.5 и 3.6 показан результат тестирования работы дисплея в соответствии с таблицей кодов 3.1.



Рис. 3.5. Тестирование дисплея, двоичный код равен нулю



Рис. 3.6. Тестирование дисплея, код 11112=1510=F16

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


К элементарным логическим операциям относится три операции. Операция отрицания «НЕ», операция конъюнкция «И» и операция дизъюнкция «ИЛИ».

В таблице показаны условные обозначения этих операций по стандарту ANSI 91 – 1984

Таблица 3.2

Условное обозначение операций

Номер

Операция

Условное обозначение

1

НЕ (NOT)



2

И (AND)



3

ИЛИ (OR)




Каждая логическая операция характеризуется своей таблицей истинности. Операции представляют собой логические вентили, на вход которых подается сигнал или сигналы, а на выходе получается выходной сигнал – результат операции. В качестве входных сигналов поступают сигналы, значение которых бинарное. Сигнал может принимать значение из двух возможных состояний «Истина» или «Ложь». Примем, что сигнал «Ложь» будет кодироваться значением ноль, а сигнал «Истина» будет кодироваться значением один.

Правила преобразование входных сигналов в выходной определяются таблицами истинности. Структура таблицы истинности определяется числом входных сигналов у операции. Число колонок таблицы истинности для операций с двумя входами будет равно трем. Две колонки для комбинации входных сигналов и одна колонка для выходного сигнала. Число строк таблицы равно 2n
. Это число комбинаций входных сигналов. Где n = 2 (число входов).

Операция NOT

Операция отрицания. Такая операция условно обозначается как «НЕ» или NOT. Эта операция инвертирует входной сигнал. На выходе сигнал получает противоположное значение по отношению к входу. Элемент описывается таблицей истинности.

Таблица 3.3

Элемент NOT

X

Y

0

1

1

0



Агент – активный класс элемента обозначим как ElmNot. Структура агента показана на рисунке 3.7.

Входной сигнал поступает в левый порт inX, а выходной сигнал в правый порт outY. Тип входящего и исходящего сообщения целый – int. Названия портов не отображаются.


Рис. 3.7. Элементы агента «Инверсия»

Глобальная переменная модели элемента vX логического типа. Значение по умолчанию false.

Левый порт содержит код, выполняемый при получении сообщения:

if (msg.intValue()==1) {vX=true;}

else {vX=false;}

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

Код функции:

if (vX) {outY.send(new Integer("0"));}

else

{outY.send(new Integer("1"));}

return 0;

Операция OR

Элемент обладает таблицей истинности (таблица 3.4).

Таблица 3.4.

Элемент OR

X1

X2

Y

0

0

0

0

1

1

1

0

1

1

1

1

Операцию смоделируем с помощью агента – активного класса с условным обозначением ElmOR. Структура агента показана на рисунке 3.8.

Модель элемента содержит две глобальные переменные vX1 и vX2 логического типа, значение по умолчанию false.

Элемент содержит два левых входных порта: inX1 и inX2 и правый выходной порт outY. Тип входного и выходного сообщения для портов элемента – целый.

Для входных портов нужно ввести код при получении сообщения в виде:

if (msg.intValue()==1){vX1=true;}

else {vX1=false;}


if (msg.intValue()==1){vX2=true;}

else {vX2=false;}



Рис. 3.8. Элементы агента «Или»

Элемент содержит динамическую переменную flowOutSignal, которая служит для вызова функции получения выходного значения элемента. Функция getSignal(). Функция возвращает значение целого типа.

boolean res = vX1 || vX2;

if (res) {outY.send(new Integer("1"));}

else {outY.send(new Integer("0"));}

return 0;
Операция AND

Таблица истинности элемента (таблица 3.5).

Таблица 3.5

Элемент AND

X1

X2

Y

0

0

0

0

1

0

1

0

0

1

1

1


Активный класс обозначим как элемент ElmAND. Структура активного класса показана на рисунке 3.9.

Структура модели этого элемента аналогична модели элемента OR. Нужно только изменить код функции getSignal:

boolean res = vX1 && vX2;

if (res) {outY.send(new Integer("1"));}

else {outY.send(new Integer("0"));}

return 0;



Рис. 3.9. Элементы агенты «И»

Тестирование операций

Для отображения сигналов создадим элемент DispSignal. Элемент показан на рисунке 3.10.


Рис. 3.10. Дисплей, отображение состояния двоичного сигнала - бита

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

text.setText(">"+msg.intValue());

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



Рис. 3.11. Тестирование операция «Или»