Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ТВЕРСКОЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
(ГОУВПО «ТГТУ»)
Кафедра ЭВМ
Лабораторная работа № 1
Моделирование случайных величин с заданным законом распределения.
Выполнил: Миляр А.А.
ВМКСС 0404
Проверил: Глухов Д.Ю.
г. Тверь, 2007
[1] Оглавление
[2] [3] Теоретическая часть. [3.1] Гиперэкспоненциальное распределение. [3.2] Экспоненциальное распределение. [4] Выполнение. [4.1] Теоретический расчёт числовых характеристик случайных величин Y1, Y2 и Y. [4.2] Экспериментальное определение числовых характеристик. [4.3] Гистограммы плотности и функции распределения для случайных величин Y1, Y2 и Y. [5] Вывод. |
В лабораторной работе рассматриваются вопросы, связанные с моделированием случайной величины Y, которая в общем случае является функцией других случайных величин:
Y=f(Y1, Y2)=Y1+Y2, где
Y1 Гиперэкспонинцеальный закон распрелеления k=4
P1=0.2; a1=1.5;
P2=0.3; a2=0.5;
P3=0.1; a3=1.0;
P4=0.4; a4=2.0;
Y2 Экспонинциальный закон распределения а = 0.5
В отчете по лабораторной работе в качестве результатов моделирования должны быть приведены:
Гиперэкспоненциальным распределением порядка k называется распределение, описывающее случайную величину, которая с вероятностью P1 распределена по экспоненциальному закону с параметром 1, с вероятностью P2 - с параметром 2,…, с вероятностью Pk - с параметром k. При этом параметр k принимает только целочисленные значения, а сумма вероятностей P1, P2, ..., Pk равна единице.
Функция и плотность гиперэкспоненциального распределения порядка k имеют вид:
Fk(x)=1-, x0;
fk(x)=, x0.
Не трудно заметить, что приведенные функция и плотность распре-деления представляют собой взвешенные суммы соответствующих функций и плотностей экспоненциальных распределений, составляющих гиперэкспоненту.
Распределение непрерывной случай-ной величины с функцией распределения
F(x)=1-e-x, x0
называется экспоненциальным распределением. Здесь >0 и называется параметром экспоненциального распределения.
Плотность экспоненциального распределения
f(x)=F/(x)= e-x, x0.
Величина Y1:
Величина Y2:
Величина Y3:
Vvedite kol-vo opitov: 100
Vvedite zakon (1 - Exp, 2 - HyperExp, 3 - Combo): 2
Vvedite poriadok K: 4
Vvedite P0: 0.2
Vvedite lamda0: 1.5
Vvedite P1: 0.3
Vvedite lamda1: 0.5
Vvedite P2: 0.1
Vvedite lamda2: 1.0
Vvedite P3: 0.4
Vvedite lamda3: 2.0
Mat ogidanie: 0.0509495
Dispersia: 0.0161777
0 0.91 0.91
1 0.03 0.94
2 0.01 0.95
3 0 0.95
4 0.02 0.97
5 0 0.97
6 0 0.97
7 0.01 0.98
8 0.01 0.99
9 0.01 1
Для продолжения нажмите любую клавишу . . .
Vvedite kol-vo otrezkov: 10
Vvedite kol-vo opitov: 100
Vvedite zakon (1 - Exp, 2 - HyperExp, 3 - Combo): 1
Vvedite lamda: 0.5
Mat ogidanie: 2.51761
Dispersia: 8.23106
0 0.49 0.49
1 0.24 0.73
2 0.1 0.83
3 0.06 0.89
4 0.03 0.92
5 0.01 0.93
6 0.04 0.97
7 0.01 0.98
8 0.01 0.99
9 0.01 1
Для продолжения нажмите любую клавишу . . .
Vvedite zakon (1 - Exp, 2 - HyperExp, 3 - Combo): 3
Vvedite lamda: 0.5
Vvedite poriadok K: 4
Vvedite P0: 0.2
Vvedite lamda0: 1.5
Vvedite P1: 0.3
Vvedite lamda1: 0.5
Vvedite P2: 0.1
Vvedite lamda2: 1.0
Vvedite P3: 0.4
Vvedite lamda3: 2.0
Mat ogidanie: 1.82435
Dispersia: 2.79444
0 0.31 0.31
1 0.28 0.59
2 0.2 0.79
3 0.12 0.91
4 0.01 0.92
5 0.03 0.95
6 0.02 0.97
7 0.01 0.98
8 0 0.98
9 0.02 1
Для продолжения нажмите любую клавишу . . .
В результате проделанной лабораторной работы были получены численные характеристики всех случайных величин, входящих в сложную случайную величину. Также были получены гистограммы плотности и функции распределения соответствующих случайных величин.
Приложение 1. Листинг программы.
// Laba1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
using namespace std;
//--------------------------------------------------------------------------
double getRandFrom_0_1(void);
double getRandExp(double lamda, double x);
vector<double> getRandExp(int N, double lamda);
vector<double> getRandHyperExp(
int N, int k, vector<double> lamda, vector<double> p
);
vector<double> getCombo(
int N, int k, vector<double> lamda, vector<double> p, double expLamda
);
//--------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("cls");
srand((unsigned)time(NULL));
cout<<"Vvedite kol-vo otrezkov: "; int n; cin>>n;
cout<<"Vvedite kol-vo opitov: "; int N; cin>>N;
vector<int> counters(n);
vector<double> mass_y(N);
cout<<"Vvedite zakon (1 - Exp, 2 - HyperExp, 3 - Combo): ";
int mode; cin>>mode;
double sum=0, sumq=0, maxy;
switch(mode){
case 1: //Моделирование Экспоненты
//Ввод исх данных
cout<<"Vvedite lamda: "; double lamda; cin>>lamda;
//Разыграем N величин
mass_y=getRandExp(N, lamda);
maxy=*max_element(mass_y.begin(),mass_y.end());
break;
case 2:{ //Моделирование Гиперэкспоненты
cout<<"Vvedite poriadok K: "; int k; cin>>k;
//Ввод исх данных
vector<double> lamda(k), p(k);
double tmp;
for (int i=0; i<k; i++){
cout<<"Vvedite P"<<i<<": "; cin>>tmp;
p[i]=tmp;
cout<<"Vvedite lamda"<<i<<": "; cin>>tmp;
lamda[i]=tmp;
}
//Разыграем N величин
mass_y=getRandHyperExp(N, k, lamda, p);
maxy=*max_element(mass_y.begin(),mass_y.end());
}
break;
case 3:{ //Моделирование комбинированного закона
//Ввод от первого закона
cout<<"Vvedite lamda: "; double explamda; cin>>explamda;
//Ввод от второго закона
cout<<"Vvedite poriadok K: "; int k; cin>>k;
double tmp;
vector<double> lamda(k), p(k);
for (int i=0; i<k; i++){
cout<<"Vvedite P"<<i<<": "; cin>>tmp;
p[i]=tmp;
cout<<"Vvedite lamda"<<i<<": "; cin>>tmp;
lamda[i]=tmp;
}
//Разыграем
mass_y=getCombo(N, k, lamda, p, explamda);
maxy=*max_element(mass_y.begin(),mass_y.end());
}
break;
default:
cout<<"Error: Net takogo regima";
}
//Щитаем попадания
int i, j; double tmp;
for (i=0; i < N; i++){
for (j=0, tmp=maxy/n; j < n; j++, tmp+=maxy/n){
if (mass_y[i] <= tmp){
counters[j]++; break;
}
}
sum+=mass_y[i]; sumq+=mass_y[i]*mass_y[i];
}
cout<<"Mat ogidanie: "<<sum/N<<endl;
cout<<"Dispersia: "<<(sumq/N)-((sum*sum)/(N*N))<<endl<<endl;
sum=0;
for (int i=0; i<n; i++){
sum+=(double)counters[i]/N;
cout<<i<<"\t"<<(double)counters[i]/N<<"\t"<<sum<<endl;
}
system("pause");
return 0;
}
//--------------------------------------------------------------------------
double getRandFrom_0_1(void)
{
return (double)rand()/RAND_MAX;
}
//--------------------------------------------------------------------------
double getRandExp(double lamda, double x)
{
return -1/lamda * log(1 - x);
}
//--------------------------------------------------------------------------
vector<double> getRandExp(int N, double lamda)
{
vector<double> mass_y(N);
for (int i=0; i < N; i++)
mass_y[i]=getRandExp(lamda, getRandFrom_0_1());
return mass_y;
}
//--------------------------------------------------------------------------
vector<double> getRandHyperExp(
int N, int k, vector<double> lamda, vector<double> p
)
{
vector<double> mass_y(N);
double randnum, resultlamda, l=p[0], lastl=0;
for (int i=0; i < N; i++){
randnum=getRandFrom_0_1();
for (int j=0; j<k; j++){
if ( randnum > lastl && randnum <= l){
resultlamda=lamda[j];
}
lastl=l;
l+=p[j];
}
mass_y[i]=getRandExp(l, getRandFrom_0_1());
}
return mass_y;
}
//--------------------------------------------------------------------------
vector<double> getCombo(
int N, int k, vector<double> lamda, vector<double> p, double expLamda
)
{
vector<double> mass_y1(N), mass_y2(N);
mass_y1=getRandExp(N, expLamda);
mass_y2=getRandHyperExp(N, k, lamda, p);
for (int i=0; i<N; i++){
mass_y1[i]+=mass_y2[i];
}
return mass_y1;
}
//--------------------------------------------------------------------------