Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР1_АлексееваАВ_Тема2_Отчет

.docx
Скачиваний:
6
Добавлен:
25.11.2022
Размер:
251.6 Кб
Скачать

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ

КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ

УТВЕРЖДАЮ

Проректор университета по научной работе

ФИО

"___" ______________ _______г.

Лабораторная работа № 2

«Генерирование случайных процессов»

по предмету: КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ

Преподаватель

А. Ф. Валеева

Исполнитель

А. В. Алексеева

Уфа - 2022

ЗАДАНИЕ

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

Ход работы

  1. Реализуем генерирование однородного пуассоновского процесса.

Функция генерации однородного пуассоновского процесса

Входные данные:

time – время окончания процесса

λ – значение лямбда-параметра

Выходные данные:

events – массив значений времен событий процесса в возрастающем порядке

count – число событий, которые произойдут к моменту времени time

Алгоритм

Задаем значение N - число испытаний.

t –значение времени события процесса

В цикле, количество итераций в котором будет равно числу испытаний, генерируем процесс на промежутках, равных time и с лямбдой (среднее кол-во событий за единицу времени)

Получаем count – число событий, которые произойдут к моменту времени time

Функция генерации однородного пуассоновского процесса

  1. Вводим входные данные

  2. Инициализируем значение начального времени t:

let t = 0

  1. Инициализируем массив значений времен событий процесса:

     const events = []

  1. Генерируем случайное число u на отрезке [0,1]:

     u = Math.random()

  1. Задаем значение начального времени t по формуле:

     t = t –

  1. Если t > time, то:

      1. Заносим t в массив значений времен событий процесса:

     events.push(t)

  1. Иначе возвращаемся к шагу 4.

  2. Считаем число событий, которые произойдут к моменту времени time:

count = events.length

  1. Реализуем генерирование неоднородного пуассоновского процесса.

В этом случае лямбда влияет как на распределение (кол-во переменных на отрезке), так и распределение

Входные данные:

time – время окончания процесса

λ – значение лямбда-параметра

λ(t) – функция интенсивности

Выходные данные:

events – массив значений времен событий процесса в возрастающем порядке

count – число событий, которые произойдут к моменту времени time

Алгоритм

  1. Получим входные данные

  2. Инициализируем значение начального времени t:

let t = 0

  1. Инициализируем массив значений времен событий процесса:

     const events = []

  1. Генерируем равномерную случайную переменную u на отрезке [0,1]:

     u = Math.random()

  1. Задаем значение начального времени t по формуле:

     t = t –

  1. Если t > time, то:

    1. Генерируем равномерную случайную переменную u2 на отрезке [0,1]:

u2 = Math.random()

    1. Если :

      1. Заносим t в массив значений времен событий процесса:

     events.push(t)

  1. Иначе возвращаемся к шагу 4.

  2. Считаем число событий, которые произойдут к моменту времени time:

count = events.length

  1. Далее реализуем проверку по критерию число событий в интервале времени заданного пуассоновского процесса пуассоновскому распределению.

λ(t) - функция интенсивности: 1 + 2/(t+1)

Входные данные:

time – время окончания процесса

λ – значение лямбда-параметра

N – количество испытаний

Выходные данные:

– подсчитанное значение критерия согласия Пирсона

– критическое значение критерия согласия Пирсона при α = 0,05.

Алгоритм проверки:

  1. Вводим входные данные

  2. Инициализируем массив values частот числа событий в интервале времени:

     let values = []

  1. Считаем частоты числа событий на интервале времени длины time:

for (let index = 0; index < N; index++) {

         const count = ПуассоновскийПроцесс(time, lambda).count

         if (values[count]) {

             values[count] += 1

       } else values[count] = 1

     }

  1. Вычисляем число групп выборки s:

const s = values.length

  1. Находим выборочное среднее mean:

const mean = 

  1. Зададим оценку параметра значением выборочного среднего:

= mean 

  1. Инициализируем массив theoryValues теоретических частот числа событий в интервале времени:

const theoryValues = []

  1. Вычисляем теоретические частоты числа событий в интервале времени:

    values.forEach((_, i) => {

        const pi = 

        theoryValues[i] = pi * N

    })

  1. Считаем :

const chi2 = 

  1. Сравним и табличное значение при α = 0.05 и степенью свободы k = s – 2

  1. Если , то гипотеза о принадлежности числа событий на интервале времени длины time заданного пуассоновского процесса пуассоновскому распределению принимается.

  1. Иначе не принимается.

результат работы программы

ЛИСТИНГ ПРОГРАММЫ

/**

 * Алгоритм генерации первых времен однородного Пуассоновского процесса

 * @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()

Вывод

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

Соседние файлы в предмете Компьютерное моделирование