Скачиваний:
1
Добавлен:
05.01.2024
Размер:
2.99 Кб
Скачать
import sys
import warnings
import numpy as np
from scipy.stats import erlang
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")

def plot_results(theory_val, exper_vals, n_vals, param_type: bool, fig: int):
    if param_type:
        plt.figure(fig)
        plt.title('Сравнение интенсивностей')
        plt.ylabel('Интенсивность')
    else:
        plt.figure(fig)
        plt.title('Сравнение вариаций')
        plt.ylabel('Коэффициент вариации')
    plt.plot(n_vals, exper_vals, label='Результаты эксперимента')
    plt.plot(n_vals, [theory_val]*len(n_vals), label='Теоретическое значение')
    plt.grid()
    plt.xlabel('Количество заявок')
    plt.legend()

def plot_pdf(k, theta, fig: int):
    x = np.linspace(0, k, 1000)
    y = erlang.pdf(x, k, scale=1/theta)
    plt.figure(fig)
    plt.plot(x, y, 'black', label=rf'$ k = {k}; \ \theta = {theta}$')
    plt.title('Эрланговское распределение')
    plt.legend()
    plt.grid()

def experiment(k, theta, N):
    lambda_old, nu_old = sys.float_info.max, sys.float_info.max
    lambda_new, nu_new = 0, 0
    lambdas, nus, Ns = [], [], []

    # Пока изменение значения > 0.1%
    while (abs((lambda_new - lambda_old)/lambda_old) > .001) | (abs((nu_new - nu_old)/nu_old) > .001):
        Ns.append(N)
        lambda_old, nu_old = lambda_new, nu_new
        u = np.random.gamma(shape=k, scale=1/theta, size=N)
        m_u = np.mean(u)
        sigma_u = np.std(u, ddof=1)
        lambda_new = 1/m_u
        nu_new = sigma_u/m_u
        lambdas.append(lambda_new)
        nus.append(nu_new)
        N *= 2
    return lambdas, nus, Ns


if __name__ == "__main__":
    # Базовые параметры
    k, theta = 1, 21

    # Функция закона распределения
    plot_pdf(k, theta, fig=1)

    # Расчет теоретических параметров потока
    lambda_theory = theta/k
    nu_theory = 1/np.sqrt(k)
    print('\nТеоретические значения:')
    print(f'  --  Интенсивности потока: {lambda_theory}\n  --  Коэффициента вариации: {nu_theory}')

    # Расчет экспериментальных параметров потока
    lambdas_experiment, nus_experiment, ns = experiment(k, theta, 10000)
    print('\nЭкспериментальные значения:')
    print(f'  --  Интенсивности потока: {lambdas_experiment[-1]}\n  --  Коэффициента вариации: {nus_experiment[-1]}')

    # Построение графиков зависимостей
    plot_results(lambda_theory, lambdas_experiment, ns, param_type=True, fig=2)
    plot_results(nu_theory, nus_experiment, ns, param_type=False, fig=3)

    plt.show()
Соседние файлы в папке Лаба 3