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



def plot_erlang_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')
    plt.title('Функция распределения эрланговского закона')
    plt.grid()

def plot_dependences(theor_param, exper_vars, n_vars, graph: str, fig: int):
    if graph == "Интенсивность":
        plt.figure(fig)
        plt.title('Сравнение интенсивностей потока')
        plt.ylabel('Интенсивность потока')
    if graph == "Вариация":
        plt.figure(fig)
        plt.title('Сравнение коэффициентов вариации')
        plt.ylabel('Коэффициент вариации')
    plt.plot(n_vars, exper_vars, label='Результаты эксперимента')
    plt.plot(n_vars, [theor_param]*len(n_vars), label='Теоретическое значение')
    plt.grid()
    plt.xlabel('Количество заявок')
    plt.legend()

def get_experimental_vars(k, theta, N):
    lmbd_old, nu_old = sys.float_info.max, sys.float_info.max
    lmbd_new, nu_new = 0, 0
    lmbds, nus, Ns = [], [], []
    
    # Пока ошибка больше 0.1%
    while (abs((lmbd_new - lmbd_old)/lmbd_old) > .001) | (abs((nu_new - nu_old)/nu_old) > .001):
        Ns.append(N)
        lmbd_old, nu_old = lmbd_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)
        lmbd_new = 1/m_u
        nu_new = sigma_u/m_u
        lmbds.append(lmbd_new)
        nus.append(nu_new)
        N *= 2
    return lmbds, nus, Ns

if __name__ == "__main__":
    # Базовые параметры 
    k = 4
    theta = 4  
    # Создание функции закона распределения
    plot_erlang_pdf(k, theta, 1)

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

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

    # Построение графиков зависимостей
    plot_dependences(lmbd_theory, lmbd_examples, n, 'Интенсивность', 2)
    plot_dependences(nu_theory, nu_examples, n, 'Вариация', 3)

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