Всё для Учёбы — студенческий файлообменник
1 монета
doc

Курсовая «Имитация случайных процессов на ЭВМ» по Теории автоматического управления (Горская Н. А.)

Курсовая работа состоит в решении ряда следующих задач:

– разработки программы расчета на ПЭВМ, предназначенной для моделирования некоррелированного скалярного СП, обладающего заданным законом распределения, и проведения оценки качества воспроизведения СП;

– моделирования некоррелированного скалярного СП с заданным законом распределения;

– оценки качества воспроизведения СП;

– исследования зависимости качества моделирования СП от объема выборки , изменяющегося в диапазоне от 100 до 1000 с шагом , равным 300 узлов (значение рекомендуется принимать равным );

– составления курсовой записки.

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

I) Основные теоретические сведения.

1) Постановка задачи и исходные данные для моделирования случайных процессов на ЭВМ.

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

представляющих собой в идеале реализации независимых, равномерно распределенных на интервале (0,1) случайных величин

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

представляет собой повторную выборку из равномерно распределенной на интервале (0,1) генеральной совокупности значений величины .

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

– имитации базовых последовательностей, равномерно распределенных на интервале (0,1)

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

1.1. Моделирование базовых последовательностей

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

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

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

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

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

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

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

mod – операция деления по модулю, т.е. взятие остатка от .

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

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

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

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

где – функция, обратная функции (рис.4).

Рис. 4 Суть моделирования случайного процесса с заданным законом распределения методом обратной функции распределения заключается в том, что каждому значению базисной последовательности , равномерно распределенной в интервале (0,1) , ставится в соответствие значение случайной последовательности, определенное по формуле.

2) Оценка качества имитируемых на ЭВМ псевдослучайных последовательностей.

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

2.1 Определение статистических характеристик полученного процесса.

Математическое ожидание дискретной случайной величины приближенно равно среднему арифметическому всех её значений:

Дисперсия дискретной случайной величины есть математическое ожидание квадрата отклонения случайной величины от её математического ожидания:

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

.

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

2.2 Определение статистических характеристик заданного процесса.

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

2.3 Контроль точности воспроизведения.

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

Контроль ФПВ и ФРВ в этой работе производится субъективно, визуально по графикам.

3) Расчет теоретических характеристик заданного случайного процесса и обратной функции распределения вероятности.

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

Функция плотности вероятности (дифференциальный закон распределения) для закона Рэлея выглядит следующим образом:

Математическое ожидание равно:

Дисперсия равна:

Функция распределения вероятности (интегральный закон распределения):

Обратная функция:

II) Практическая часть.

Для практического исследования качества моделирования случайных процессов на ЭВМ, использована программа Random, написанная в среде Borland C++ Builder 5. В программе используются приведенные в разделе I формулы. Исходный текст программы приведен в приложении 1. Алгоритм работы программы подробно объясняется в комментариях.

1) Результаты моделирования при N=100, Nf=10

а) Имитация базовой последовательности

б) Моделирование закона Рэлея

2) Результаты моделирования при N=400, Nf=40

а) Имитация базовой последовательности

б) Моделирование закона Рэлея

3) Результаты моделирования при N=700, Nf=40

а) Имитация базовой последовательности

б) Моделирование закона Рэлея

4) Результаты моделирования при N=1000, Nf=40

а) Имитация базовой последовательности

б) Моделирование закона Рэлея

б) Моделирование закона Рэлея N=1000, Nf=100

5) Значения рассогласования дисперсии и математического ожидания для закона Рэлея при разных N:

N =>

100 400 700 1000

Рассогласование мат. ожидания, %

-1,73 0,44 -0,30

-0,31

Рассогласование дисперсии

3,39 -0,68 -0,41

-0,61 Выводы:

а) При увеличении числа узлов СП значения рассогласования снижаются только до некоторого значения.

б) Соответствующие цифры в данной работе не приведены, но процессе работы с программой было замечено, что на качество моделируемого процесса оказывает очень большое влияние выбор значений Zm и A.

в) На вид гистограммы оказывает влияние выбор числа интервалов (чем больше размер интервала, тем меньше в гистограмме выбросов).

Приложение 1. Исходный текст программы Random.

Файл кода программы RandomU.cpp Содержит основную логику работы программы.

//---------------------------------------------------------------------------

#include #pragma hdrstop

#include "RandomU.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1; //---------------------------------------------------------------------------

//конструктор класса TForm1. Не делает ничего полезного

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{ } //---------------------------------------------------------------------------

//служебные функции

//читает исходные данные

void TForm1::GetIni(void)

{ TIniFile *IniFile;

IniFile = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ));

N=IniFile->ReadInteger("SMK","N",1000);

Z0=IniFile->ReadInteger("SMK","Z0",12345);

A=IniFile->ReadInteger("SMK","A",3125);

Zm=IniFile->ReadInteger("SMK","Zm",65032);

Sigma=IniFile->ReadFloat("F3","Sigma",5);

Nf=IniFile->ReadInteger("FPV","Nf",20);

PrintToMemo(

"Исходные данные загружены: N=%i Z0=%i Zm=%i A=%i Sigma=%.3f Nf=%i",

N, Z0, Zm, A, Sigma, Nf);

delete IniFile;

} //---------------------------------------------------------------------------

//печать в Memo

void TForm1::PrintToMemo (char *Format, ...) {

char Str [256];

va_list Args;

va_start (Args, Format);

vsprintf (Str, Format, Args);

va_end (Args);

Memo1->Lines->Add(Str);

} //---------------------------------------------------------------------------

//очищает графики

void TForm1::ChartClear(void){

for (int i=0;iSeries[i]->Clear();

Chart1->Title->Text->Clear();

} //---------------------------------------------------------------------------

//копирование окна в буфер обмена

void __fastcall TForm1::Button5Click(TObject *Sender)

{ Graphics::TBitmap *Bitmap = new Graphics::TBitmap();

TRect FormRect;

FormRect = Form1->ClientRect;

Bitmap->Height=FormRect.bottom;

Bitmap->Width=FormRect.right;

Bitmap->Canvas->BrushCopy(FormRect, Bitmap, FormRect, clWhite);

Bitmap->Canvas->CopyRect(FormRect, Form1->Canvas, FormRect);

Clipboard()->Assign(Bitmap);

delete Bitmap;

} //---------------------------------------------------------------------------

//сортировка последовательности по возрастанию

//используется для вычисления ФПВ (интегральный закон распределения)

//и гистограммы (удобно - вместо того, чтобы контролировать вхождение

//величины в интервал с двух сторон, достаточно контролировать только

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

//используем метод пузырьковой сортировки

void TForm1::SortY(){

if (y==NULL) return;

bool work=true;

float tmp;

while (work){

work=false;

for(int i=0;iy[i+1]){

work=true;

tmp=y[i];

y[i]=y[i+1];

y[i+1]=tmp;

}

} }

} //---------------------------------------------------------------------------

//расчетные функции

//прямая функция для рэлеевского закона плотности вероятности

float TForm1::Y3D(float x){

return(x/pow(Sigma,2)*exp(-0.5*pow(x/Sigma,2)));

} //---------------------------------------------------------------------------

//прямая функция для рэлеевского закона распределения вероятности

float TForm1::Y3I(float x){

return(-exp(-0.5*pow(x/Sigma,2))+1);

} //---------------------------------------------------------------------------

//обратная функция для рэлееевского закона распределения вероятности

float TForm1::F3I (float y){

return(Sigma*sqrt(-2*log(1-y)));

} //---------------------------------------------------------------------------

//вычисляет оценку математического ожидания (среднее арифметическое)

float TForm1::E(void){

float S=0;

for(int i=0;iClear();

GetIni();

if(y!=NULL) delete y;

ChartClear();

Chart1->Title->Text->Add("Реализация СП - базовая последовательность");

y=new float[N];

Zi=Z0;

for(int i=0;iSeries[0]->AddXY(i,y[i],"",clRed);

} PrintToMemo("Имитация базовой последовательности выполнена:");

//считаем математическое ожидание

PrintToMemo("Математическое ожидание");

PrintToMemo("Статистическое Теоретическое Рассогласование");

float a1, a2, a3;

a1=E(); a2=0.5; a3=(a1-a2)/a2*100;

PrintToMemo("%10.4f %25.4f %25.4f",a1,a2,a3);

//считаем дисперсию

PrintToMemo("Дисперсия");

PrintToMemo("Статистическое Теоретическое Рассогласование");

a1=D(); a2=1.0/12; a3=(a1-a2)/a2*100;

PrintToMemo("%10.4f %25.4f %25.4f",a1,a2,a3);

//разрешаем выполнять остальные действия

Button2->Enabled=true;

Button3->Enabled=true;

Button4->Enabled=true;

Button5->Enabled=true;

} //---------------------------------------------------------------------------

//считаем и показаваем ФРВ (интегральный закон распределения)

void __fastcall TForm1::Button3Click(TObject *Sender)

{ ChartClear();

Chart1->Title->Text->Add("Функция распределения вероятности");

//защита, если последовательность пуста

if (y==NULL) return;

//Расчет ФРВ состоит в том, что сначала проведем упорядочивание

//заданной последовательности по возрастанию,тогда количество событий

//благоприятсвующих тому что случайная величина будет меньше

//выбранного значения станет равно порядковому индексу этой

//величины в последовательности. Соответственно вероятность i/N,

//где i - порядковый номер величины. Значит, чтобы построить график,

//достаточно по абциссе откладывать y[i], а по ординате i/N.

SortY();

for(int i=0;iSeries[0]->AddXY(y[i],p,"",clRed);

} //считаем теоретическую ФРВ

float il=y[N-1];float di=il/N;

for(float i=di;iEnabled)

//показываем теоретическую ФРВ для релеевского закона

Chart1->Series[1]->AddXY(i,Y3I(i),"",clGreen);

else //показываем теоретическую ФРВ для равн. закона

Chart1->Series[1]->AddXY(i,i,"",clGreen);

} } //---------------------------------------------------------------------------

//моделирование релеевского закона

void __fastcall TForm1::Button2Click(TObject *Sender)

{ Memo1->Lines->Clear();

ChartClear();

Chart1->Title->Text->Add("Реализация СП - рэлеевский закон");

for(int i=0;iSeries[0]->AddXY(i,y[i],"",clRed);

}

PrintToMemo("Моделирование рэлееевского закона выполнено:");

//считаем математическое ожидание

PrintToMemo("Математическое ожидание");

PrintToMemo("Статистическое Теоретическое Рассогласование");

float a1, a2, a3;

a1=E(); a2=sqrt(M_PI/2)*Sigma; a3=(a1-a2)/a2*100;

PrintToMemo("%10.4f %25.4f %25.4f",a1,a2,a3);

//считаем дисперсию

PrintToMemo("Дисперсия");

PrintToMemo("Статистическое Теоретическое Рассогласование");

a1=D(); a2=(2-M_PI/2)*pow(Sigma,2); a3=(a1-a2)/a2*100;

PrintToMemo("%10.4f %25.4f %25.4f",a1,a2,a3);

//запрещаем выполнять преобразование одной и той-же последовательности

//повторно - иначе выйдет непонятно что

Button2->Enabled=false;

} //---------------------------------------------------------------------------

//считаем и показываем ФПВ (гистограмма)

void __fastcall TForm1::Button4Click(TObject *Sender)

{ SortY();

ChartClear();

Chart1->Title->Text->Add("Функция плотности вероятности");

//считаем размер интервала как разницу между наибольшим и

//и наименьшим значениями случайной величины, поделенную

//на число интервалов

float r=(y[N-1]-y[0])/Nf;

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

//то в первый интервал попадут числа 0>=y[i]>r, во второй

//r>y[i]>2*r и т.д. Т.к. последовательность предварительно

//отсортирована, нет необходимости каждый раз проходить её

//всю, а также сравнивать с двух сторон

float comp=r;

//число узлов, попавших в интервал

int n=0;

for(int i=0;icomp){

//n/N - вероятность попадания случайной величины в интервал

//r - размер интервала

float p=n;p=p/N/r;

Chart1->Series[2]->AddXY(comp-r/2,p,"",clRed);

n=0; comp+=r;

}

n++; }

//показываем теоретическую ФПВ

float il=y[N-1];float di=il/N;

for(float i=di;iEnabled)

//показываем теоретическую ФРВ для релеевского закона

Chart1->Series[1]->AddXY(i,Y3D(i),"",clGreen);

else //показываем теоретическую ФПВ для равн. закона

Chart1->Series[1]->AddXY(i,1,"",clGreen);

} } //---------------------------------------------------------------------------

Заголовочный файл RandomU.h Содержит Объявления глобальных переменных и функций класса TForm1.

//---------------------------------------------------------------------------

#ifndef RandomUH

#define RandomUH

//---------------------------------------------------------------------------

#include #include

#include

#include #include

#include #include

#include #include

#include

#include #include

#include //---------------------------------------------------------------------------

class TForm1 : public TForm

{ __published: // IDE-managed Components

TChart *Chart1;

TMemo *Memo1;

TButton *Button1;

TButton *Button2;

TButton *Button3;

TLineSeries *Series1;

TLineSeries *Series2;

TButton *Button4;

TBarSeries *Series3;

TButton *Button5;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

private: // User declarations

int N, Z0, A, Zm, Nf;

float *y, Sigma;

void PrintToMemo (char *Format, ...);

void GetIni(void);

void SortY();

void ChartClear(void);

float Y3D(float x);

float Y3I(float x);

float F3I(float y);

float E(void);

float D(void);

public: // User declarations

__fastcall TForm1(TComponent* Owner);

}; //---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif Файл Random.ini Содержит исходные данные

[SMK] N=1000 Z0=1

Zm=1041 A=2137

[F3]

Sigma=100 [FPV]

Nf=20 Остальные файлы проекта:

Random.bpr - Файл проекта, содержит сведения для компилятора и линковщика

Random.cpp - Главный файл кода программы. Содержит функцию WinMain()

Random.res - Файл ресурсов. По умолчанию содержит изображение значка

RandomU.dfm - Файл формы. Содержит описание формы

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

Показать полностью…
Похожие документы в приложении