Рубрики
Программирование Стиль программирования

Моделирование случайных процессов

UPD: Краткое содержание:
Генерирование последовательности случайных величин по методам (теория для программирования):

Методы проверки гипотезы о распределении (теория для программирования):

Описание программы:

Привет! Первая статья. Постараюсь рассказать доступно, но рассчитываю на Ваши базовые знания области.

На четвертом курсе универа задали мне (и ещё двум ребятам) непростую для меня тему для курсовой работы: «Моделирование случайных процессов». Задача стояла в моделировании различных случайных процессов (последовательности случайных величин) с заданным законом распределения программно разными методами.

Решение было реализовано на я/п C# и технологии WinForms. Попутно была поставлена и успешно выполнена задача построения множества графиков с помощью библиотеки ZedGraph (реализация, гистограмма, функциональное распределение, корреляционная функция), производится проверка гипотезы о распределении.

Я расскажу что это за умные слова и как это запрограммировать, точнее дам код, в котором совсем несложно запрограммированы описанные ниже формулы. Основной целью статьи является донесение скромных знаний по теме моделирования случайных процессов на Вашем ЭВМ:)

Для тех, кому не терпится, вот исходники;)
Решение в MS Visual Studio 2010: Скачать ProcessModeling-vs2010 (7096)
Решение в MS Visual Studio 2008: Скачать ProcessModeling-vs2008 (1411)

Теория

Метод нелинейного преобразования

В работе рассмотрен один метод моделирования случайного процесса с заданным законом распределения — метод нелинейного преобразования. Не берусь приводить здесь полных математических выкладок, но кратко объясню.

Имеем (генерируем) белый шум — последовательность случайных величин, «покрывающих» весь диапазон (у нас 0..1). Подвергаем наш белый шум нелинейным преобразованиям, по формуле

, где x-исходная случайная величина, y-полученная случайная величина.

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

Типовые законы распределения представлены в следующей таблице (таблица рисунком, иначе очень-очень сложно):

етод рекурсивной фильтрации

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

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

Вот как выглядит схема рекурсивного фильтра, приведу для ясности:

А вот формула, которую нужно запрограммировать:

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

Практика

Расскажу об архитектуре решения (громкое слово!), а описание всех относящиеся к вводу/выводу методов MS .NET опустим — о них можно узнать из целевых источников.

Диаграмма классов

На следующем рисунке показана диаграмма классов (щелчок — открытие большого изображения в новой вкладке браузера):

Самый верхний класс иерархии — абстрактный класс SProcess. Он содержит основные свойства и методы, присущие любому случайному процессу в проекте. Его наследуют абстрактные классы ReverseMethodProcess — процесс, сгенерированный по методу нелинейного преобразования (обратной функции) и RecursiveFilterProcess — процесс, сгенерированный по методу рекурсивной фильтрации. Далее в иерархии идут в нижней строке рисунка, соответственно, классы процессов по законам распределения Симсона, равномерному, экспоненциальному, нормальному и классы процессов с колебательной и затухающей корреляционными функциями. Эти классы содержат методы для получения гистограмм распределения, функционального распределения и расчета параметров случайного процесса.

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

Думаю, стоит рассказать немного о методах проверки гипотезы о распределении. Если коротко, то они позволяют убедиться (или разувериться), что полученный случайных процесс имеет заданное распределение. Реализовано два метода: критерий «Хи квадрат» Пирсона и критерий Колмогорова. Методы строятся по похожему принципу: вычисляется значение по разности между теоретическим (расчетным) и полученным функциональным распределением случайного процесса. Далее полученное значение сравнивается со значением из заранее известных таблиц. При превышении вычисленного значения теоретическое гипотеза о распределении отвергается, наоборот — принимается (к всеобщей радости). Точный алгоритм запрограммирован в программе, а полные таблицы приведены по ссылкам: таблица значений для Хи квадраттаблица коэффициентов для критерия Колмогорова.

Оговорюсь, что писал программу давно. И сейчас, просматривая код, замечаю, что в ней есть милые программистские глупости, вроде public полей классов. Так что, доверяй, но проверяй:)

Заключение

Большое спасибо Прохорову Сергею Антоновичу за книгу Математическое описание и моделирование случайных процессов и студентам СГАУ (для меня они неизвестные герои), выпустившимся раньше меня, за не самую полную, но программу по представленной теме на Делфи.

Удачи в применении знаний и кода!

Исходники на C# .NET:

Решение в MS Visual Studio 2010: Скачать ProcessModeling-vs2010 (7096)
Решение в MS Visual Studio 2008: Скачать ProcessModeling-vs2008 (1411)