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

КМ МО-317 Шакиров А.Р. ЛР2

.docx
Скачиваний:
22
Добавлен:
28.06.2021
Размер:
123.94 Кб
Скачать

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

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

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

УТВЕРЖДАЮ

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

ФИО

"___" ______________ _______г.

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

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

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

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

А. Ф. Валеева

Исполнитель

А. Р. Шакиров

Уфа - 2021

ЗАДАНИЕ

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

Ход работы

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

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

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

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

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

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. Заносим 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()

Вывод

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