ЛР1_АлексееваАВ_Тема2_Отчет
.docxУФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
|
|
|
||
|
УТВЕРЖДАЮ Проректор университета по научной работе ФИО |
|||
|
|
|
||
|
"___" ______________ _______г. |
|||
|
|
|
||
Лабораторная работа № 2
«Генерирование случайных процессов» |
||||
|
||||
по предмету: КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ |
||||
Преподаватель |
|
А. Ф. Валеева |
||
|
|
|
||
|
|
|
||
|
|
|
||
Исполнитель |
|
А. В. Алексеева |
||
|
|
|
||
Уфа - 2022 |
ЗАДАНИЕ
Реализовать два алгоритма генерации случайных процессов: пуассоновский однородный и пуассоновский неоднородный. Проверить каждый на основе полученных данные по критерию согласия К. Пирсона принадлежность исследуемой случайной переменной пуассоновскому закону распределения.
Ход работы
Реализуем генерирование однородного пуассоновского процесса.
Функция генерации однородного пуассоновского процесса
Входные данные:
time – время окончания процесса
λ – значение лямбда-параметра
Выходные данные:
events – массив значений времен событий процесса в возрастающем порядке
count – число событий, которые произойдут к моменту времени time
Алгоритм
Задаем значение N - число испытаний.
t –значение времени события процесса
В цикле, количество итераций в котором будет равно числу испытаний, генерируем процесс на промежутках, равных time и с лямбдой (среднее кол-во событий за единицу времени)
Получаем count – число событий, которые произойдут к моменту времени time
Функция генерации однородного пуассоновского процесса
Вводим входные данные
Инициализируем значение начального времени t:
let t = 0
Инициализируем массив значений времен событий процесса:
const events = []
Генерируем случайное число u на отрезке [0,1]:
u = Math.random()
Задаем значение начального времени t по формуле:
t = t –
Если t > time, то:
Заносим t в массив значений времен событий процесса:
events.push(t)
Иначе возвращаемся к шагу 4.
Считаем число событий, которые произойдут к моменту времени time:
count = events.length
Реализуем генерирование неоднородного пуассоновского процесса.
В этом случае лямбда влияет как на распределение (кол-во переменных на отрезке), так и распределение
Входные данные:
time – время окончания процесса
λ – значение лямбда-параметра
λ(t) – функция интенсивности
Выходные данные:
events – массив значений времен событий процесса в возрастающем порядке
count – число событий, которые произойдут к моменту времени time
Алгоритм
Получим входные данные
Инициализируем значение начального времени t:
let t = 0
Инициализируем массив значений времен событий процесса:
const events = []
Генерируем равномерную случайную переменную u на отрезке [0,1]:
u = Math.random()
Задаем значение начального времени t по формуле:
t = t –
Если t > time, то:
Генерируем равномерную случайную переменную u2 на отрезке [0,1]:
u2 = Math.random()
Если :
Заносим t в массив значений времен событий процесса:
events.push(t)
Иначе возвращаемся к шагу 4.
Считаем число событий, которые произойдут к моменту времени time:
count = events.length
Далее реализуем проверку по критерию число событий в интервале времени заданного пуассоновского процесса пуассоновскому распределению.
λ(t) - функция интенсивности: 1 + 2/(t+1)
Входные данные:
time – время окончания процесса
λ – значение лямбда-параметра
N – количество испытаний
Выходные данные:
– подсчитанное значение критерия согласия Пирсона
– критическое значение критерия согласия Пирсона при α = 0,05.
Алгоритм проверки:
Вводим входные данные
Инициализируем массив values частот числа событий в интервале времени:
let values = []
Считаем частоты числа событий на интервале времени длины time:
for (let index = 0; index < N; index++) {
const count = ПуассоновскийПроцесс(time, lambda).count
if (values[count]) {
values[count] += 1
} else values[count] = 1
}
Вычисляем число групп выборки s:
const s = values.length
Находим выборочное среднее mean:
const mean =
Зададим оценку параметра значением выборочного среднего:
= mean
Инициализируем массив theoryValues теоретических частот числа событий в интервале времени:
const theoryValues = []
Вычисляем теоретические частоты числа событий в интервале времени:
values.forEach((_, i) => {
const pi =
theoryValues[i] = pi * N
})
Считаем :
const chi2 =
Сравним и табличное значение при α = 0.05 и степенью свободы k = s – 2
Если , то гипотеза о принадлежности числа событий на интервале времени длины time заданного пуассоновского процесса пуассоновскому распределению принимается.
Иначе не принимается.
результат работы программы
ЛИСТИНГ ПРОГРАММЫ
/**
* Алгоритм генерации первых времен однородного Пуассоновского процесса
* @param {number} T - единиц времени, время окончания процесса
*/
function poissonProcessUniform(T, lambda = 1) {
let t = 0
const events = []
let u = Math.random()
t = t - 1 / lambda * Math.log(u)
while (!(t > T)) {
events.push(t)
u = Math.random()
t = t - 1 / lambda * Math.log(u)
}
return { events, count: events.length }
}
function poissonProcessNonuniform(T, lambda = 1, functionIntensity) {
let t = 0
const events = []
let u = Math.random()
t = t - 1 / lambda * Math.log(u)
while (!(t > T)) {
const u2 = Math.random()
if (u2 <= (functionIntensity(t) / lambda)) {
events.push(t)
}
u = Math.random()
t = t - 1 / lambda * Math.log(u)
}
return { events, count: events.length }
}
function functionIntensity(t) {
return 1 + 2/(t+1)
}
function factorial(n) {
if (n < 2) {
return 1
}
let result = 1
for (let i = 1; i <= n; i++) {
result *= i
}
return result
}
function checkPoisson(values, N) {
const chi2Criticals = [
3.8,
6,
7.8,
9.5,
11.1,
12.6,
14.1,
15.5,
16.9,
18.3,
19.7,
21,
22.4,
23.7,
25,
26.3,
27.6,
28.9,
30.1,
31.4
]
// разбитие, число значений
const s = values.length
// выборочное среднее
const mean = 1 / N * values.reduce((acc, value, i) => acc + (value * i), 0)
const expectedLambda = mean
const theoryValues = []
values.forEach((_, i) => {
const fact = factorial(i)
const pi = Math.exp(-expectedLambda) * (expectedLambda**i) / fact
theoryValues[i] = pi * N
})
// критерий согласия Пирсона (хи квадрат)
const chi2 = values.reduce((acc, _, i) => acc + ((values[i] - theoryValues[i])**2 / theoryValues[i]), 0)
// степени свободы
const k = s - 2
// хи квадрат критическое при заданном k
const chi2Critical = chi2Criticals[k-1]
const result = {}
values.forEach((value, i) => {
result[i] = {
"число событий": i,
"частота": value,
"частота теоретическая": theoryValues[i]
}
})
console.table(result)
console.log(`Степень свободы k = ${k}`)
console.log(`Уровень значимости alpha = 0.05`)
console.log(`Хи квадрат наблюдаемое = ${chi2}`)
console.log(`Хи квадрат критическое = ${chi2Critical}`)
console.log(`Хи2 наблюдаемое ${chi2 < chi2Critical ? '<' : '>='} Хи2 критическое => исследуемая случайная переменная ${chi2 < chi2Critical ? '' : 'не '}принадлежит закону распределения`)
}
function main() {
const lambda = 2.01
const time = 1
const N = 2000
console.log(`время = ${time}, lambda = ${lambda}, испытаний = ${N}:`)
console.log(`Однородный Пуассоновский процесс:`);
let values = []
for (let index = 0; index < N; index++) {
const x = poissonProcessUniform(time, lambda).count
if (values[x]) {
values[x] += 1
} else {
values[x] = 1
}
}
checkPoisson(values, N)
console.log()
console.log(`Неоднородный Пуассоновский процесс:`);
values = []
for (let index = 0; index < N; index++) {
const x = poissonProcessNonuniform(time, lambda, functionIntensity).count
if (values[x]) {
values[x] += 1
} else {
values[x] = 1
}
}
checkPoisson(values, N)
}
main()
Вывод
В ходе лабораторной работы были получены навыки генерации однородных и неоднородных пуассоновских процессов. Также были получены навыки проверки по критерию согласия принадлежность числа событий на интервале времени пуассоновского процесса пуассоновскому закону распределения.