Имитационная система с детерминированными процессами
Позволяет оценить степень соответствия гистограммы и теоретической плотности распределения с точки зрения проверки статистической гипотезы об их идентичности. При использовании критерия согласия Колмогорова по гистограмме на графике теоретической функции распределения строится кусочно-непрерывная статистическая функция распределения. Для критерия Пирсона используется гистограмма распределения… Читать ещё >
Имитационная система с детерминированными процессами (реферат, курсовая, диплом, контрольная)
- Введение
- 1. Построение имитационной модели системы массового обслуживания
- 1.1 Список и содержание активностей СМО
- 1.2 Блок-схема алгоритма моделирования и текст процедуры
- 1.3 Протокол моделирования
- 2. Моделирование случайных независимых величин
- 2.1Аналитическая запись заданных законовраспределения случайных величин
- 2.2 Блок-схемы алгоритмов моделирования случайных величин и тексты процедур
- 2.3 Результаты тестирования процедур моделированияслучайных величин
- 2.4 Протокол моделирования СМО в условиях случайных изменений параметров
- 3. Моделирование случайных процессов
- 3.1 Корреляционная функция стационарного случайного процесса
- 3.2 Решение системы уравнений
- 3.3 Блок-схема реализуюшая метод скользящего суммирования и текст процедур
- 3.4 Тестирование генератора стационарного случайного процесса
- 3.5 Протокол моделирования в условиях воздействия возмущающих случайных процессов
- 4. Оптимизация системы массового обслуживания
- 4.1 Постановочная часть задачи
- 4.2 Блок-схема и текст процедуры реализующая Парето-оптимизацию
- 4.3 Результаты Парето-оптимизации
- Заключение
- Приложение
Полное и всестороннее исследование АСУ на всех этапах разработки, начиная с составления технического задания на проектирование по результатам обследования объектов управления и заканчивая внедрением АСУ в эксплуатацию, невозможно без использования методов моделирования на ЭВМ.
Реальные сложные системы, к числу которых относятся и современные АСУ, можно исследовать с помощью двух типов моделей: аналитических и имитационных. В аналитических моделях поведение сложных систем записывается в виде некоторых функциональных отношений или логических условий.
Когда явления в сложных системах настолько сложны и многообразны, что аналитическая модель становится слишком грубым приближением к действительности, то исследователь должен использовать имитационное моделирование. В имитационной модели поведение компонент сложной системы описывается набором алгоритмов, которые затем реализуют ситуации, возникающие в реальной системе.
Не смотря на то, что разработка хорошей имитационной модели часто обходится дороже создания аналитической модели и требует больше временных затрат, ее построение как правило себя оправдывает. Это объясняется тем, что такая модель позволяет гораздо точнее отразить протекание процессов в реальной сложной системе и описать поведение компонент сложной системы на высоком уровне детализации; исследовать динамику взаимодействия компонент во времени и пространстве параметров системы; изучить новые явления в системе, поведение которой имитируется.
Таким образом, имитационное моделирование является одним из наиболее широко используемых методов при решении задач анализа и синтеза сложных систем.
Постановка задачи.
Для обеспечения надежности АСУ ТП в ней используется две ЭВМ. Первая ЭВМ выполняет обработку данных о технологическом процессе и выработку управляющих сигналов, а вторая находится в «горячем резерве». Данные в ЭВМ поступают через t1 (сек.), обрабатываются в течении t2 (сек.), затем посылается управляющий сигнал, поддерживающий заданный темп процесса. Если к моменту посылки следующего набора данных не получен управляющий сигнал, то интенсивность выполнения технологического процесса уменьшается вдвое и данные посылаются через 2t1 (сек.). Основная ЭВМ каждые t3 (сек.) посылает резервной ЭВМ сигнал о работоспособности. Отсутствие сигнала означает необходимость включения резервной ЭВМ вместо основной. Характеристики обеих ЭВМ одинаковы. Подключение резервной ЭВМ занимает t4 (сек.), после чего она заменяет основную довосстановления, а процесс возвращается к нормальному темпу. Отказы основной ЭВМ происходят через T (сек.). Восстановление работоспособности занимает t5 (сек.). Резервная ЭВМ абсолютно надежна. Смоделировать работу системы в течение 1 часа.
Данные для детерминированной модели СМО: t1=10, t2=8,t3 =30, t4=5, t5=100, T =300.
Данные для имитационной модели СМО: интервалы t1, t2, t3, t4, t5 распределены по нормальному закону с параметрами m1=10, m2=8,m3=30, m4=5, m5= 100, у1=2, у2=2, у3=10,у4=1, у5=5; период отказа основной ЭВМ T является стационарным случайным процессом с нормальным законом распределения и интервалом разброса [200.400].
Варьируемые параметры: m1, m3.
Показатели работы: время нахождения технологического процесса в замедленном состоянии, число пропущенных из-за отказа данных.
имитационная система массового обслуживания
1. Построение имитационной модели системы массового обслуживания
Цель работы по разделу: построение имитационной модели системы массового обслуживания, параметры которой являются детерминированными величинами
Графическая схема СМО
Рис. 1.1 Графическая схема СМО АСУ ТП
1.1 Список и содержание активностей СМО
Функциональные действия:
1. Поступление данных в ЭВМ
2. Замедленное поступление данных в ЭВМ
3. Отправка сигнала о работоспособности
4. Отказ основного ЭВМ
5. Подключение резервной ЭВМ№ 2
6. Восстановление ЭВМ
7. Обработка данных
Активности, условия запуска, алгоритм:
· А1-активность поступления данных в ЭВМ при нормальном/ замедленном режиме темпе функционирования;
УЗ: (tпос. данных<=t0)
Ал: еслиFlagпост. сигнала=1, то tпос. данных=t0+t1иначе tпос. данных=t0+2t1
Flagпост. сигнала=0
· А3-активность сигнала о работоспособности;
УЗ: (tраб<=t0) ^ (ЭВМ работает)
АЛ: Основная ЭВМ работает; tраб=t0+t3
· А4-активность отказа основной ЭВМ;
УЗ: (T<=t0) ^ (ЭВМ работает)
АЛ: Основная ЭВМ не работает; T=T+1
· А51-активность подключения резервной ЭВМ;
УЗ: (ЭВМ не работает) ^ (резервная ЭВМ не работает)
АЛ: tзр=t0+t4; резервная ЭВМ в режиме подключения;
· А52 — конец подключения резервной ЭВМ;
УЗ: (tзр<=t0) ^ (резервная ЭВМ в режиме подключения)
АЛ: Резервная ЭВМ работает;
· А61-активность начала восстановления основной ЭВМ;
УЗ: (tвосст<=t0) ^ (ЭВМ не работает)
АЛ: tвосст=t0+t5; FLAGвосст=1;
· А62-конец восстановления основной ЭВМ;
УЗ: FLAGвосст=1
АЛ: tвщсст=t0+t5; FLAGвосст=0;
· А71-активность начала обработки данных;
УЗ: (Счетчик сообщений>0) ^ (tоб. д<=t0)
АЛ: FLAGоб. д=1;
· А72-конец обработки данных обработки данных;
УЗ: FLAGоб. д=1;
АЛ: FLAGоб. д=0; Flagупр. сигнал=1
1.2 Блок-схема алгоритма моделирования и текст процедуры
Рис. 1.2 Алгоритм реализации моделирования предоставленной системы
procedureMyTimerCallBackProg (uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
var time_t1,time_t2,time_t3,time_t4,time_t5,time_T: real;
begin
inc (count); // Счетчик срабатывания мультимедиа таймера
time: = (h*count);
time_T: = (T*count_T);
time_t3: = (t3*count_t3);
if start_t1 then // Если начался отсчет передачи данных в ЭВМ1
begin
status_DATA: =0; // данные передаются
time_t1: =time — now_time_t1;
end;
if ON_PC1 thenstatus_PC1: = 1;
if ON_PC2 thenstatus_PC2: = 1;
if start_t2 then // если запущен отсчет обработки данных в ЭВМ1
begin
status_DATA: = 3;
time_t2: = time — now_time_t2;
end;
if start_t2 and process_PC1 then
begin
start_fail_time: = time;
control_signal: =false;
end;
ifstart_t4 then // Если начался отсчет включенияЭВМ2
time_t4: = time — now_time_t4;
if start_t5 then // если начался отсчет восстановления ЭВМ1
time_t5: = time — now_time_t5;
// Имитируем включениеЭВМ2
if (time_t4>t4) and (start_t4) then
inclusion_PC2 ();
// имитируем обработку данных
if ((time_t2) >=t2) and (start_t2) then // прошла обработка данных
Data_Process ();
// имитируем поступление данных
if ((time_t1) >=t1) and (start_t1) then // Если данные закончили свое поступление
Data_Received ();
// имитируем посылку резервного сигнала от ЭВМ1 к ЭВМ2
if ((time-time_t3) >=t3) then // проверяем в работе ли у нас ЭВМ1
Reserve_signal ();
// Имитируем восстановление ЭВМ1
if (time_t5>t5) and (start_t5) then // Если прошло время восстановления ЭВМ1
Recovery_PC1 ();
// имитируем отказЭВМ1
if ((time-time_T) >=T) then
failure_PC1 ();
// иммитируем конец работы АСУ ТП
if time=3600 then
timeKillEvent (fm_Main. MMtimer); // Разрушаем таймер при закрытии
Output_Info ();
end;
1.3 Протокол моделирования
Протокол моделирования — таблица, где при различных величинах модельного времени выводятся текущие значения параметров системы, по которым можно судить о ее функционировании: длины очередей перед приборами, состояние приборов (занят, свободен), поступление и уничтожение заявок и. т.д. Фрагмент протокола моделирования для детерминированной модели приведен на рис. 1.3.
Рис. 1.3 Протокол моделирования
2. Моделирование случайных независимых величин
Цель работы по разделу: Уточнение имитационной модели СМО посредством моделирования случайных величин, характеризующих параметры заявок и режимы функционирования устройств их обработки в реальной сложной системе.
2.1Аналитическая запись заданных законовраспределения случайных величин
Программная реализация случайной величины с законом распределения, отличным от равномерного, производится методом обратной функции. Если — это последовательность, равномерно распределенная на интервале [0.1], а — это последовательность, имеющая плотность распределения вероятности
то .
Для показательного распределения:
откуда .
Для нормального распределения с плотностью распределения
где и — это две независимые последовательности, равномерно распределенные на интервале [0.1].
Таким образом, любой генератор последовательности случайных чисел, распределенных по некоторому закону, отличному от равномерного, в основе своей содержит минимум один генератор базовой последовательности, равномерно распределенной на интервале [0.1].
Для каждой случайной величины были разработаны генераторы, отличающиеся методом генерации базовой последовательности: метод серединных квадратов, метод иррационального числа и конгруэнтный метод.
2.2 Блок-схемы алгоритмов моделирования случайных величин и тексты процедур
Рис. 2.1 Метод серединных квадратов
Рис. 2.2 Метод иррационального числа
Рис. 2.3 Блок-схема функции Random, которая реализует конгруэнтный метод
Реализация конгруэнтного метода функцией Random является встроенной в язык программирования Pascal, на котором основана среда разработки Delphi, использованная при моделировании. Полный алгоритм метода здесь не рассматривается ввиду его сложности.
functionmedian_of_squares_method (init: extended): Tmas;
var
i: integer;
begin
setlength (result, 0);
result: = nil;
setlength (result, 1);
result [0]: = init;
fori: = 1 to N-1 do
begin
setlength (result, i + 1);
result [i]: = next_median_of_squares (result [i-1]);
end;
end;
functionnext_median_of_squares (x: extended): extended;
const r=12;
vars, new_s: string;
i: integer;
k: byte;
begin
x: = sqr (x);
k: = length (s) — 2;
k: = k div 2;
new_s: = '0,'+copy (s, 3+k div 2, k);
x: = StrToFloat (new_s);
result: = x;
end;
function irrational_number_method (init: extended): Tmas;
var i: integer; s: string;
begin
setlength (result, 0);
result: = nil;
fori: = 1 to N do
begin
setlength (result, i);
result [i — 1]: = Frac (i * init);
end;
end;
functioncongruential_method (init: integer): Tmas;
var i: integer;
begin
setlength (result, 0);
result: = nil;
randSeed: = init;
fori: = 0 to N — 1 do
begin
setlength (result, i + 1);
result [i]: = random;
end;
end;
2.3 Результаты тестирования процедур моделированияслучайных величин
Любой программный генератор выдает последовательность не случайных, а псевдослучайных чисел, поэтому для достоверности получаемых при моделировании результатов необходимо: во-первых, использовать в генераторах разных случайных величин независимые базовые генераторы, во-вторых, все генераторы случайных чисел должны пройти предварительное тестирование, которое заключается в следующем.
Тестирование по гистограмме
Гистограмма — это кусочно-непрерывная функция плотности распределения статистического ряда. На рис. 2.4 изображены гистограммы тестирования случайных независимой величин с нормальным распределением с использованием метода серединных квадратов, метода иррационального числа и конгруэнтного метода, числе испытаний 40 000.
Рис. 2.4 Метод серединных квадратов
Рис. 2.5 Метод иррационального числа
Рис. 2.6 Конгруэнтный метод
Гистограмма плотности распределения статистического ряда должна максимально приближаться к теоретической кривой плотности распределения. Степень рассогласования можно оценить по среднеквадратичному отклонению графиков (СКО).
Тестирование по критериям согласия
Позволяет оценить степень соответствия гистограммы и теоретической плотности распределения с точки зрения проверки статистической гипотезы об их идентичности. При использовании критерия согласия Колмогорова по гистограмме на графике теоретической функции распределения строится кусочно-непрерывная статистическая функция распределения. Для критерия Пирсона используется гистограмма распределения вероятностей.
В таблице 2 приведены данные тестирования независимых случайных величин с нормальным законом распределения.
Таблица 2 Результаты тестирования независимых случайных величин
m | у | число точек дискретизации | xmin | xmax | Критерий Колмогорова | Критерий Пирсона | |
P | P | ||||||
Метод серединных квадратов | |||||||
8,48 | 8,3 | 0,00 | |||||
Метод иррационально числа | |||||||
8,55 | 7,78 | 0,6 | |||||
Конгруэнтный метод | |||||||
8,16 | 10,23 | 0,7 | |||||
На Основании данных таблицы можно судить, что наиболее лучшим является генератор на основе конгруэнтного метода.
Тестирование по корреляционному моменту Позволяет проверить независимость элементов случайной последовательности. Это необходимо, поскольку программный генератор случайных чисел может «зацикливаться» с некоторым интервалом апериодичности.
В результате тестирования по корреляционному моменту было замечено, что pxy=0 во всех трех методат. Отсюда следует что генерируемые случайные величины независимы с вероятностью не менее чем 1.
Таким образом, на основании результата тестирования генераторов случайных независимых величин можно заключить, что наиболее приемлемым является генератор, в котором для генерирования равномерно распределенной случайной величины используется конгруэнтный метод. Этот вид генератора будет в дальнейшем использован в имитационной модели.
2.4 Протокол моделирования СМО в условиях случайных изменений параметров
Рис. 2.7 Протокол моделирования в условиях случайных изменений параметров
3. Моделирование случайных процессов
Цель работы по разделу: Уточнение имитационной модели СМО посредством моделирования возмущающих воздействий, действующих на реальную сложную систему.
3.1 Корреляционная функция стационарного случайного процесса
Для моделирования случайного стационарного процесса надо, прежде всего, задать корреляционную функцию процесса, которая отражает степень статистической зависимости между сечениями стационарного случайного процесса, отстоящими друг от друга во времени на величину ф. Пусть корреляционная функция имеет вид, где a, b — параметры, которые определяются исходя из условия задания:
Выбираем параметры из постановки задачи Ymax=400 и Ymin=200. Дt примем равным приращению модельного времени — 5 сек. Исходя из этого получим что a= 1111,11; b= 0,299 573.
Корреляционная функция для таких параметров имеет вид, приведенный на рис. 3.1.
Рис. 3.1 Корреляционная функция стационарного случайного процесса
Получив аналитически корреляционную функцию, описывающую стационарный случайный процесс, воспользуемся для его моделирования методом скользящего суммирования.
3.2 Решение системы уравнений
Для вычисления значения возмущения на очередном шаге моделирования необходимо найти константы C0, C1, C2,… Cm, которые определяются из системы уравнений (m+1) — го порядка:
Для упрощения примем, что сечения случайного процесса, отстоящие друг от друга во времени более, чем на три шага моделирования, считаются некоррелированными, т. е. m=3. Тогда:
Далее, согласно методу скользящего суммирования, значения стационарного случайного процесса Y (t) с заданной корреляционной функцией KY (ф) находятся по формулам:
где y (iДt) — значения значение возмущения на очередном i-ом шаге моделирования, qi — случайные нормально распределенные величины с нулевым математическим ожиданием и единичной дисперсией, — математическое ожидание стационарного случайного процесса, C0, C1, C2,… Cm — константы, найденные выше.
В рассматриваемой задачи имеется возмущение является отказом ЭВМ1 с интервалом разброса [200.400]. В результате вычисления коэффициентов С необходимых для вычисления случайных величин по методу скользящего суммирования были получены следующие результаты.
Отказ ЭВМ 1 с интервалом разброса [200.400]: ,
3.3 Блок-схема реализуюшая метод скользящего суммирования и текст процедур
procedurestationary_process (q, C: Tmas; varx, y: Tmas);
var i: integer;
j: Integer;
My: real;
begin
My: = (Ymax — Ymin) / 2;
setlength (x, N div 2);
setlength (y, N div 2);
fori: = 0 to N-1 do
begin
if (i mod 2) =0 then
x [i]: = C *q [i] +C *q [i+1] +C *q [i+2] +C *q [i+3] +My
else
y [i]: = C *q [i] +C *q [i+1] +C *q [i+2] +C *q [i+3] +My;
end;
end;
Рис. 3.2 Блок-схема метода скользящего суммирования
3.4 Тестирование генератора стационарного случайного процесса
Для оценки качества работы генератора стационарного случайного процесса используются критерии согласия Смирнова, Фишера и Стьюдента. Результаты тестов приведены ниже.
Как видно из рисунка, результаты теста приемлемы. По критерию Стьюдента статистическая гипотеза верна с вероятностью не менее 0,7. Поэтому добавим генератор стационарного случайного процесса к существующей уже модели, тем самым сделав время отказа ЭВМ1 случайным стационарным процессом.
Рис. 3.3 Результаты генерирования случайного стационарного процесса
3.5 Протокол моделирования в условиях воздействия возмущающих случайных процессов
4. Оптимизация системы массового обслуживания
Цель работы по разделу: пользуясь разработанной имитационной моделью, произвести оптимизацию системы массового обслуживания.
4.1 Постановочная часть задачи
Варьируя параметры модели, можно оптимизировать показатели работы моделируемой системы массового обслуживания.
Процессы в сложных системах можно достаточно полно оценить только совокупностью различных показателей качества, поэтому для их оптимизации необходимо выбирать несколько частных критериев качества функционирования системы.
Для решения задачи рассматривается критерием оптимальности
где — частный критерий оптимальности.
По заданию, варьируемым параметрам являются m1 и m3 — математическое ожидание времени передачи данных и период отправки резервного сигнала от ЭВМ1 к ЭВМ2. Таким образом, нельзя представить критерии оптимальности в виде обобщенного показателя, несмотря на то что они не являются противоречивыми, но, тем не менее, они имеют различную «природу». Для решения оптимизационной задачи воспользуемся методом Парето-оптимизации.
При расчете будем изменять m1, m3 в диапазоне [0.100].
4.2 Блок-схема и текст процедуры реализующая Парето-оптимизацию
procedureTfm_Main. sbOptimClick (Sender: TObject);
varOptimMas: Tmaszap;
j, i: Integer;
k, m: Integer;
begin
OptimMas: =read_file_data;
count: = length (OptimMas) — 1;
j: =0;
while j
begin
k: = 0;
while k
begin
if (k<>j) and
(OptimMas [k]. count_fail
(OptimMas [k]. time_fail
then
begin
for m: = k to (count — 1) do
OptimMas [M]: = OptimMas [M+1];
dec (count);
dec (k);
if (j > k) then
dec (j);
end;
inc (k);
end;
inc (j);
end;
OutPutOptimMas (OptimMas, count);
end;
4.3 Результаты Парето-оптимизации
Заключение
В результате проделанной работы курсовой работы были приобретены как теоретические, так и практические навыки в области построения систем массового обслуживания, генерирования случайных процессов на эту систему и возмущающих воздействий на эту систему. В первой части данной работы была имитирована система с детерминированными процессами, т. е. все данные имеют постоянный характер. Программа позволяет видеть состояние каждой ЭВМ на каждом шаге, а также в конце обработки выводятся показатели качества: время которое система находилась в замедленной работе, а также число утерянных сообщений. Во втором разделе данной работы были разработаны различного вида генераторы, которые в дальнейшем были проанализированы и был выбран лучший из генераторов, который был использован для моделирования теперь уже случайных функций параметров системы массового обслуживания. В третьем разделе был реализован случайный стационарный процесс в виде времени отказа ЭВМ. В 4 разделе была проведена Паррето оптимизация системы, где параметрами изменения были m1, m3. В итоге проделанной работы создана имитационная модель. Полученная модель является абстрактной математической моделью. Моделирование системы осуществлялось в среде разработки приложений Borland Delphi. Результатом является программа в виде exe файла, имитирующая работу вычислительного центра.
Приложение
Программаная реализация
Раздел 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons, ActnMan, ActnColorMaps, XPMan, mmsystem, StdCtrls,
Grids;
type
Tfm_Main = class (TForm)
im_PC1: TImage;
im_PC2: TImage;
sb_Run: TSpeedButton;
ed_t1: TEdit;
ed_t2: TEdit;
ed_t3: TEdit;
ed_t4: TEdit;
ed_t5: TEdit;
ed_T: TEdit;
lb_t1: TLabel;
lb_t2: TLabel;
lb_t3: TLabel;
lb_t4: TLabel;
lb_t5: TLabel;
lb_T: TLabel;
ed_h: TEdit;
lb_h: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
sg_Info: TStringGrid;
lb_Protocol: TLabel;
sb_Stop: TSpeedButton;
sb_Continue: TSpeedButton;
Label8: TLabel;
ed_scale: TEdit;
lb_fail_time: TLabel;
lb_fail_data: TLabel;
procedureFormDestroy (Sender: TObject);
proceduresb_RunClick (Sender: TObject);
procedureFormCreate (Sender: TObject);
procedure ed_t1KeyPress (Sender: TObject; var Key: Char);
procedure ed_t2KeyPress (Sender: TObject; var Key: Char);
procedure ed_t3KeyPress (Sender: TObject; var Key: Char);
procedure ed_t4KeyPress (Sender: TObject; var Key: Char);
procedure ed_t5KeyPress (Sender: TObject; var Key: Char);
procedureed_TKeyPress (Sender: TObject; var Key: Char);
proceduresb_StopClick (Sender: TObject);
proceduresb_ContinueClick (Sender: TObject);
private
{ Private declarations }
public
MMtimer: integer;
{ Public declarations }
end;
var
fm_Main: Tfm_Main;
count, count_T, count_t3: integer;
t1,t2,t3,t4,t5,T: real;
fail_time, start_fail_time: real;
h, fail_DATA: integer;
time, now_time_t1,now_time_t2,now_time_t4,now_time_t5: real;
process_PC1,process_PC2,ON_PC1,ON_PC2,control_signal, start_t1: boolean;
start_t2,start_t4,start_t5,recovery: boolean;
status_PC1,status_PC2,status_DATA: byte;
implementation
{$R *. dfm}
procedureKeyEnter (varkey: char);
begin
if not (key in ['0'. '9',#8]) then key: =#0;
end;
functionCalH (t1,t2,t3,t4,t5,T: real): real;
const Low =1; High =6;
typeCountParam = Low. High;
Tmas = array [CountParam] of real;
varmas: Tmas;
i: CountParam;
min: real;
begin
mas [1]: = t1;
mas [2]: = t2;
mas [3]: = t3;
mas [4]: = t4;
mas [5]: = t5;
mas [6]: = T;
min: = mas [Low];
fori: = Low+1 to High do
begin
if mas [i]
min: = mas [i];
end;
CalH: = min;
end;
procedure GO_PC (num: integer);
begin
ifnum = 1 then
begin
process_PC1: = true; // данныепоступиливЭВМ2
status_PC1: = 2;
end
else if num = 2 then
begin
process_PC2: = true; // данные поступили в ЭВМ2
status_PC2: = 2;
end;
start_t2: =true;
now_time_t2: = time; // для этого запоминаем текущее время
status_DATA: = 2;
end;
procedureData_Received ();
begin
now_time_t1: = time;
if (ON_PC2) andnot (ON_PC1) then // Если данные пришли на ЭВМ2 и ЭВМ1 еще не восстановилось
if not (process_PC2) then // еслиЭВМ2 незанята
GO_PC (2);
if not (control_signal)
and not (status_DATA=2) then // Еслинетуправляющегосигнала
begin
start_fail_time: =time;
t1: = 2*t1; // но нет управляющего сигнала, то уменьшаем интенсивность процесса
end;
if (ON_PC1 and not (process_PC1)) then // ЕслиЭВМ 1 невотказе
GO_PC (1) // и не в процессе обработки
else if (not (status_DATA=2)) then // походуданныепотеряны.
begin
status_DATA: = 4;
inc (fail_DATA);
start_t2: = false;
end;
end;
Procedure Change_PC;
begin
status_PC2: = 0;
on_PC2: = false; // выключимЭВМ2
status_PC1: = 1;
on_PC1: = true; // включимЭВМ1
start_t1: = true; // запускаем передачу данных в ЭВМ1
now_time_t1: = time; // запоминаем текущее время
if not (start_fail_time=0) then
fail_time: = fail_time + time — start_fail_time;
start_fail_time: = 0;
control_signal: =true;
end;
procedureData_Process ();
begin
if process_PC1 then // еслибылиданныенаобработкеЭВМ1
begin
status_DATA: =3;
status_PC1: = 3;
process_PC1: = false; // останавливаемобработку
control_signal: = true; // запускаемуправляющийсигнал
start_t2: = false; // останавливаем отсчет обработки данных
now_time_t2: = 0; // обнуляемвремя
end
else if process_PC2 then
begin
status_DATA: =3;
status_PC2: = 3;
process_PC2: = false;
start_t2: = false;
now_time_t2: = 0;
if (recovery) then // если мы обработали данные, но ЭВМ1 уже готова
begin // кработе
recovery: =false;
Change_PC;
end;
end;
end;
procedureReserve_Signal ();
begin
inc (count_t3);
if not (ON_PC1) and not (ON_PC2) then // ЕслиЭВМ1 вотказенеобходимоподключатьЭВМ2
begin
start_t4: = true; // запускаем отсчет включения ЭВМ2
now_time_t4: = time; // и запоминаем текущее время
end;
end;
procedure inclusion_PC2 ();
begin
start_t4: = false; // выключаем отсчет включения ЭВМ2
now_time_t4: = 0; // обнуляем время
t1: = t½; // возвращаем интенсивность процесса
start_t1: = true; // запускаем передачу данных в ЭВМ2
now_time_t1: = time; // запоминаем текущее время
on_PC2: =true;
end;
procedure Recovery_PC1 ();
begin
start_t5: = false;
if (on_PC2) and (process_PC2) then
recovery: =true // завершим передачу если ЭВМ2 была в работе
else
Change_PC;
end;
procedure failure_PC1 ();
begin
inc (count_T);
ON_PC1: = false; // отказЭВМ
process_PC1: = false;
status_PC1: = 4;
if process_PC1 then // если ЭВМ1 был в обработке
status_DATA: =4;
start_t5: = true; // запускам восстановление ЭВМ1
now_time_t5: = time; // запоминаем время отказа ЭВМ1
control_signal: = false; // сигнала с ЭВМ1 от работе нет
end;
procedureOutput_Info ();
var s1, s2,s3: string;
begin
fm_Main. sg_Info. RowCount: = count+1;
fm_Main. sg_Info. Cells [0,count]: = FloatToStr (time);
case status_PC1 of
0: s1: = 'ЭВМ1 выключена';
1: s1: = 'ЭВМ1 включена';
2: s1: = 'ЭВМ1 приняла данные';
3: s1: = 'ЭВМ1 закончила обработку';
4: s1: = 'ЭВМ1 в отказе';
end;
case status_PC2 of
0: s2: = 'ЭВМ2 выключена';
1: s2: = 'ЭВМ2 включена';
2: s2: = 'ЭВМ2 приняла данные';
3: s2: = 'ЭВМ2 закончила обработку';
end;
casestatus_DATA of
0: s3: = 'Данныепередаются';
1: s3: = 'Данные закончили передачу';
2: s3: = 'Данные в обработке';
3: s3: = 'Данные обработаны';
4: s3: = 'Данные утеряны';
end;
fm_Main. sg_Info. Cells [1,count]: = s1;
fm_Main. sg_Info. Cells [2,count]: = s2;
fm_Main. sg_Info. Cells [3,count]: = s3;
fm_Main. lb_fail_time. Caption: ='Время нахождения процесса в замедленном состоянии = '+
FloatToStr (fail_time);
fm_Main. lb_fail_data. Caption: ='Числоутерянныхданных = '+ IntToStr (fail_DATA);
end;
procedureMyTimerCallBackProg (uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
var time_t1,time_t2,time_t3,time_t4,time_t5,time_T: real;
begin
inc (count); // Счетчик срабатывания мультимедиа таймера
time: = (h*count);
time_T: = (T*count_T);
time_t3: = (t3*count_t3);
if start_t1 then // Если начался отсчет передачи данных в ЭВМ1
begin
status_DATA: =0; // данныепередаются
time_t1: =time — now_time_t1;
end;
if ON_PC1 then
status_PC1: = 1;
if ON_PC2 then
status_PC2: = 1;
if start_t2 then // если запущен отсчет обработки данных в ЭВМ1
begin
status_DATA: = 3;
time_t2: = time — now_time_t2;
end;
if start_t2 and process_PC1 then
begin
start_fail_time: = time;
control_signal: =false;
end;
ifstart_t4 then // ЕслиначалсяотсчетвключенияЭВМ2
time_t4: = time — now_time_t4;
if start_t5 then // если начался отсчет восставноления ЭВМ1
time_t5: = time — now_time_t5;
// ИмитируемвключениеЭВМ2
if (time_t4>t4) and (start_t4) then
inclusion_PC2 ();
// имитируемобработкуданных
if ((time_t2) >=t2) and (start_t2) then // прошлаобработкаданных
Data_Process ();
// имитируем поступление данных
if ((time_t1) >=t1) and (start_t1) then // Если данные закончили свое поступление
Data_Received ();
// имитируем посылку резервного сигнала от ЭВМ1 к ЭВМ2
if ((time-time_t3) >=t3) then // проверяем в работе ли у нас ЭВМ1
Reserve_signal ();
// Имитируем восстановление ЭВМ1
if (time_t5>t5) and (start_t5) then // Если прошло время восставноления ЭВМ1
Recovery_PC1 ();
// имитируемотказЭВМ1
if ((time-time_T) >=T) then
failure_PC1 ();
// имиитируем конец работы АСУ ТП
if time=3600 then
timeKillEvent (fm_Main. MMtimer); // Разрушаемтаймерпризакрытии
Output_Info ();
end;
procedure Tfm_Main. ed_t1KeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedure Tfm_Main. ed_t2KeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedure Tfm_Main. ed_t3KeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedure Tfm_Main. ed_t4KeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedure Tfm_Main. ed_t5KeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedureTfm_Main. ed_TKeyPress (Sender: TObject; var Key: Char);
begin
KeyEnter (key);
end;
procedureInit;
begin
timeKillEvent (fm_Main. MMTimer); // Разрушаемтаймерпризакрытии
fail_DATA: = 0;
fail_time: = 0;
status_PC1: = 0;
status_PC2: = 0;
status_DATA: = 0;
t1: = 10; // Исходные параметры системы
t2: = 8;
t3: = 80;
t4: = 5;
t5: = 100;
T: = 300;
count: = 0;
count_T: = 0;
count_t3: = 0;
process_PC1: = false;
process_PC2: = false;
control_signal: = false;
start_t1: = false;
start_t2: = false;
start_t4: = false;
start_t5: = false;
on_PC1: = false;
on_PC2: = false;
now_time_t1: =0;
now_time_t2: =0;
now_time_t4: =0;
now_time_t5: =0;
recovery: =false;
end;
procedureTfm_Main. FormCreate (Sender: TObject);
begin
Init ();
fm_Main. ed_t1. Text: = FloatToStr (t1);
fm_Main. ed_t2. Text: = FloatToStr (t2);
fm_Main. ed_t3. Text: = FloatToStr (t3);
fm_Main. ed_t4. Text: = FloatToStr (t4);
fm_Main. ed_t5. Text: = FloatToStr (t5);
fm_Main. ed_T. Text: = FloatToStr (T);
fm_Main. ed_scale. Text: = '1000';
fm_Main. sg_Info. Cells [0,0]: = 'Модельноевремя';
fm_Main. sg_Info. Cells [1,0]: = 'ЭВМ1';
fm_Main. sg_Info. Cells [2,0]: = 'ЭВМ2';
fm_Main. sg_Info. Cells [3,0]: = 'Данные';
end;
procedureTfm_Main. FormDestroy (Sender: TObject);
begin
timeKillEvent (MMTimer); // Разрушаемтаймерпризакрытии
end;
procedureTfm_Main. sb_ContinueClick (Sender: TObject);
begin
MMtimer: =timeSetEvent (h, 1,@MyTimerCallBackProg, 100, TIME_PERIODIC);
end;
procedureTfm_Main. sb_RunClick (Sender: TObject);
varscale: integer;
buf_h: real;
begin
Init ();
t1: = StrToInt (ed_t1. Text); // Исходныепараметрысистемы
t2: = StrToInt (ed_t2. Text);
t3: = StrToInt (ed_t3. Text);
t4: = StrToInt (ed_t4. Text);
t5: = StrToInt (ed_t5. Text);
T: =StrToInt (ed_T. Text);
buf_h: = CalH (t1,t2,t3,t4,t5,T);
scale: = StrToInt (ed_scale. Text);
t1: = t1/scale *1000;
t2: = t2/scale *1000;
t3: = t3/scale *1000;
t4: = t4/scale *1000;
t5: = t5/scale *1000;
T: = T / scale *1000;
buf_h: = buf_h / scale;
h: =round (buf_h*1000);
ed_h. Text: = FloatToStr (buf_h/1000);
start_t1: = true;
now_time_t1: = 0;
on_PC1: = true;
control_signal: = true;
status_PC1: = 1;
MMtimer: =timeSetEvent (h, 1,@MyTimerCallBackProg, 100, TIME_PERIODIC);
end;
procedureTfm_Main. sb_StopClick (Sender: TObject);
begin
timeKillEvent (MMTimer); // Разрушаемтаймерпризакрытии
end;
end.
Раздел2
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, TeEngine, ExtCtrls, TeeProcs, Chart, Series;
const
m1 = 10; sigma1 = 2;
m2 = 8; sigma2 = 2;
m3 = 30; sigma3 = 10;
m4 = 5; sigma4 = 1;
m5 = 100; sigma5 = 5;
type
TMas = array of Extended;
Tfm_Main = class (TForm)
cb_method: TComboBox;
sb_Generate: TSpeedButton;
mm_Output: TMemo;
cb_data: TComboBox;
Chart1: TChart;
Series1: TLineSeries;
Series2: TBarSeries;
Chart2: TChart;
Series3: TLineSeries;
Series4: TBarSeries;
Chart3: TChart;
Series5: TLineSeries;
procedure FormCreate (Sender: TObject);
procedure sb_GenerateClick (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fm_Main: Tfm_Main;
m, N: integer;
mat: integer;
sigma: integer;
laplas: array [0.400] of real;
implementation
{$R *. dfm}
function next_median_of_squares (x: extended): extended;
const r=12;
var s, new_s: string;
i: integer;
k: byte;
begin
x: = sqr (x);
while (length (s) — 2)
s: = s + IntToStr (random (9));
k: = length (s) — 2;
k: = k div 2;
new_s: = '0,'+copy (s, 3+k div 2, k);
x: = StrToFloat (new_s);
result: = x;
end;
function median_of_squares_method (init: extended): Tmas;
var
i: integer;
begin
setlength (result, 0);
result: = nil;
setlength (result, 1);
result [0]: = init;
for i: = 1 to N-1 do
begin
setlength (result, i + 1);
result [i]: = next_median_of_squares (result [i-1]);
end;
end;
function irrational_number_method (init: extended): Tmas;
var i: integer; s: string;
begin
setlength (result, 0);
result: = nil;
for i: = 1 to N do
begin
setlength (result, i);
result [i — 1]: = Frac (i * init);
end;
end;
function congruential_method (init: integer): Tmas;
var i: integer;
begin
setlength (result, 0);
result: = nil;
randSeed: = init;
for i: = 0 to N — 1 do
begin
setlength (result, i + 1);
result [i]: = random;
end;
end;
procedure Tfm_Main. FormCreate (Sender: TObject);
begin
randomize;
N: = 40 000;
m: = 40;
end;
function normal_distribution (x, x1: Tmas): Tmas;
var i: integer;
begin
setlength (result, 0);
result: = nil;
for i: = 0 to N — 1 do
begin
Setlength (Result, i + 1);
Result [i]: = sigma * cos (2 * pi * x [i]) * sqrt (-2 * ln (x1 [i])) + mat;
end;
end;
function base_sequence (type_method: byte; seq: byte): TMas;
var
init_val: extended;
init_val_k: integer;
Begin
init_val: = 0;
init_val_k: = 0;
Setlength (Result, 0);
Result: = nil;
case type_method of
0:
begin
case seq of
0:
init_val: = 0.219 616 161 809;
1:
init_val: = 0.991 876 981 515;
end;
Result: = median_of_squares_method (init_val);
end;
1:
begin
case seq of
0:
init_val: = exp (1);
1:
init_val: = pi;
end;
Result: = irrational_number_method (init_val);
end;
2:
Begin
case seq of
0:
init_val_k: = 5 091 809 506;
1:
init_val_k: = 7 109 878 198;
end;
Result: = congruential_method (init_val_k);
End;
end;
End;
procedure Gistrogramma (y: TMas; var Pmas, Fmas, interval_mas: TMas);
var
Xmax, Xmin, delta: Extended;
i, j: integer;
count: array of int64;
Begin
Setlength (Pmas, 0);
Pmas: = nil;
setlength (interval_mas, 0);
interval_mas: = nil;
Setlength (count, 0);
count: = nil;
Xmax: = y [0];
Xmin: = y [0];
for i: = 0 to N — 1 do
begin
if Y [i] <= Xmin then
Xmin: = Y [i];
if Y [i] >= Xmax then
begin
Xmax: = Y [i];
end;
end;
delta: = (Xmax — Xmin) / m;
Setlength (interval_mas, 1);
interval_mas [0]: = Xmin;
for i: = 1 to m do
begin
Setlength (interval_mas, i + 1);
interval_mas [i]: = interval_mas [i — 1] + delta;
end;
for i: = 0 to m — 1 do
begin
Setlength (count, i + 1);
for j: = 0 to N — 1 do
if ((Y [j] >= interval_mas [i]) and (Y [j] <= interval_mas [i + 1])) then
begin
inc (count [i]);
end;
end;
for i: = 0 to m — 1 do
begin
Setlength (Pmas, i + 1);
Pmas [i]: = count [i] / N;
end;
for i: = 0 to m — 1 do
begin
Setlength (Fmas, i + 1);
for j: = 0 to i do
begin
Fmas [i]: = Fmas [i] + Pmas [j];
end;
end;
end;
function correlation_coefficient (y: Tmas): Tmas;
var
j, tau: integer;
a, b: real;
s1, s2, s3, s4, s5, s6, s7: Extended;
Kxy, Dx, Dy: TMas;
begin
Setlength (Result, 0);
Result: = nil;
Setlength (Kxy, 0);
Kxy: = nil;
Setlength (Dx, 0);
Dx: = nil;
Setlength (Dy, 0);
Dy: = nil;
for tau: = 0 to N — 2 do
Begin
s1: = 0;
s2: = 0;
s3: = 0;
s4: = 0;
s6: = 0;
for j: = 0 to N — tau — 1 do
begin
s1: = s1 + y [j] * y [j + tau];
s2: = s2 + y [j];
s3: = s3 + y [j + tau];
s4: = s4 + sqr (y [j]);
s6: = s6 + sqr (y [j + tau]);
end;
s5: = sqr (s2);
s7: = sqr (s3);
a: = 1/ (N — tau);
b: = 1/ (sqr (N — tau));
// Kxy
Setlength (Kxy, tau + 1);
Kxy [tau]: = (a) * s1 — (b) * s2 * s3;
// Dx
Setlength (Dx, tau + 1);
Dx [tau]: = (a) * s4 + (b) * s5;
// Dy
Setlength (Dy, tau + 1);
Dy [tau]: = (a) * s6 + (b) * s7;
Setlength (Result, tau + 1);
Result [tau]: = Kxy [tau] / (sqrt (Dx [tau] * Dy [tau]));
End;
end;
procedure paint_theory_probability_density;
var
i: integer;
begin
fm_Main. Chart1. Series. Clear;
for i: = round (mat — 3 * sigma) * 100 to round (mat + 3 * sigma) * 100 do
begin
fm_Main. Chart1. Series. AddXY (i * 0.01, (1/ (sigma * sqrt (2 * pi))) *
exp ((-1) * ((sqr (0.01 * i — mat)) / (2 * sqr (sigma)))), '', 0);
end;
end;
procedure paint_stat_probability_density (Pmas, interval_mas: TMas);
var
i: integer;
buf: TMas;
delta: Extended;
begin
setlength (buf, 0);
buf: = nil;
fm_Main. Chart1. Series. Clear;
delta: = interval_mas — interval_mas [0];
for i: = 0 to m — 1 do
begin
setlength (buf, i + 1);
buf [i]: = Pmas [i] / delta;
end;
for i: = 0 to m do
fm_Main. Chart1. Series. AddXY (interval_mas [i], buf [i], '', clgreen);
end;
function FuncNormRaspred (x, m, sigma: real): Extended;
begin
X: = (X — m) / sigma;
if X >= 0 then
begin
if X >= 4 then
Result: = 1
else
result: = laplas [round (x * 100)] + 0.5;
end
else
Begin
if X <= - 4 then
Result: = 0
else
result: = - laplas [abs (round (x * 100))] + 0.5;
End;
end;
procedure paint_theory_distribution_function;
var
i: integer;
begin
fm_Main. Chart2. Series. Clear;
for i: = round (mat — 3 * sigma) * 100 to round (mat + 3 * sigma) * 100 do
fm_Main. Chart2. Series. AddXY (i * 0.01, FuncNormRaspred (i * 0.01, mat, sigma),'', clred);
end;
procedure paint_stat_distribution_function (Fmas, interval_mas: Tmas);
var
i, c: integer;
begin
c: = 1;
for i: = 0 to m — c do
fm_Main. Chart2. Series. AddXY (interval_mas [i], Fmas [i], '', clTeal);
end;
procedure paint_coeff_corr (coeff_corr_mas: Tmas);
var i: integer;
begin
fm_Main. Chart3. Series. Clear;
for i: = 0 to N — 2 do
begin
fm_Main. Chart3. Series. AddXY (i, coeff_corr_mas [i], '', 0);
end;
end;
function correlation_time (coeff_corr_mas: Tmas): extended;
var
tau: integer;
p: real;
flag: boolean;
begin
flag: = true;
p: = 0;
repeat
p: = p + 0.01;
for tau: = 0 to N — 2 do
begin
if abs (coeff_corr_mas [tau]) > (1 — p) * sqrt (1/N) then
Begin
flag: = false;
break;
End;
end;
if not (flag) then
Begin
p: = (p — 0.01) * 100;
break;
End;
until p > 1;
if flag then
p: = (p — 0.01) * 100;
result: = p;
end;
function TestPirson (Pmas, interval_mas: TMas): extended;
var
i: integer;
h: Extended;
mas: Tmas;
begin
h: = 0;
Setlength (mas, 0);
mas: = nil;
for i: = 0 to m — 1 do
begin
setlength (mas, i + 1);
mas [i]: = FuncNormRaspred (interval_mas [i + 1], mat, sigma) ;
FuncNormRaspred (interval_mas [i], mat, sigma);
if mas [i] <> 0 then
h: = h + sqr (Pmas [i] - mas [i]) / mas [i];
end;
result: = h * N;
end;
function TestKolmogorov (Fmas, interval_mas: Tmas): extended;
var
i: integer; x: real;
D, buf, lamda: Extended;
mas: Tmas; k: longint;
begin
D: = 0;
setlength (mas, 0);
mas: = nil;
for i: = 0 to m — 1 do
begin
setlength (mas, i + 1);
mas [i]: = FuncNormRaspred (interval_mas [i], mat, sigma);
buf: = Fmas [i] - mas [i];
if buf > D then
D: = buf;
end;
x: =N;
lamda: = D * sqrt (x);
result: = lamda;
end;
procedure Tfm_Main. sb_GenerateClick (Sender: TObject);
var x, x1, y, Pmas, Fmas, interval_mas, coeff_corr_mas: Tmas;
Kolmogorov: Tmas;
begin
case cb_data. ItemIndex of
0: begin
m: = m1;
sigma: = sigma1;
end;
1: begin
m: = m2;
sigma: = sigma2;
end;
2: begin
m: = m3;
sigma: = sigma3;
end;
3: begin
m: = m4;
sigma: = sigma4;
end;
4: begin
m: = m5;
sigma: = sigma5;
end;
end;
x: = base_sequence (cb_method. ItemIndex, 0);
x1: = base_sequence (cb_method. ItemIndex, 1);
y: = normal_distribution (x, x1);
Gistrogramma (y, Pmas, Fmas, interval_mas);
coeff_corr_mas: = correlation_coefficient (y);
paint_theory_probability_density; // плотность вероятности теоретическая
paint_stat_probability_density (Pmas, interval_mas); // плотность вероятности статическая
paint_theory_distribution_function; // теоретическая функция распределения
paint_stat_distribution_function (Fmas, interval_mas); // статическая функция распределения
paint_coeff_corr (coeff_corr_mas); // рисуем график коэффициента корреляции
mm_Output. Lines. Add (#13);
mm_Output. Lines. Add (cb_data. Text+' '+cb_method. Text+#13);
mm_Output. Lines. Add ('Тестирование по Корреляционному Моменту: ' +
FloatToStrF (correlation_time (coeff_corr_mas), ffFixed, 8,2));
mm_Output. Lines. Add ('Тестирование по Пирсону: ' + 'xi2=' + FloatToStrF (TestPirson (Pmas,
interval_mas), ffFixed, 8,2));
mm_Output. Lines. Add ('Тестирование по Колмогорову: lamda=' +
FloatToStrF (TestKolmogorov (Fmas, interval_mas), ffFixed, 8,2));
end;
end.