Скачиваний:
1
Добавлен:
05.01.2024
Размер:
4.71 Кб
Скачать
import numpy as np
import pandas as pd
import warnings
import matplotlib.pyplot as plt
from scipy.integrate import quad
from scipy.stats import uniform

warnings.filterwarnings('ignore')

def uniforms(min, max, N: int = ...):
    returnable_nums = np.random.uniform(size=N)
    return returnable_nums*(max-min) + min

def modeling(need_data_for_histogram: bool = False, need_mean_and_var: bool = False, get_samples_and_dist: bool = False):
    global a
    global b
    selections, returns = [], []
    select_min, select_max, delta, N, intervals = 0, 0, 0, 0, 10
    borders, N_i = np.array([]), [0] * intervals
    if need_mean_and_var:
        mean, var = [], []
    
    while min(N_i) <= 100:
        # Создание случайного число и добавление его к выборке:
        alpha = uniforms(a, b, 1)
        selections.append(alpha[0])
        N = len(selections)

        # Распределение чисел:
        if alpha > select_min and delta != 0 and alpha < select_max:
            k = int(np.floor((alpha - select_min)/delta))
            N_i[k] += 1
        
        # Вероятность ошибки:
        p = (N - np.sum(N_i))/N

        # Изменение размеров:
        if p >= 0.01:
            select_min, select_max = min(selections), max(selections)
            delta = (select_max - select_min)/(intervals)
            borders = np.linspace(select_min, select_max, intervals, True)
            ids = np.searchsorted(borders, selections)
            N_i = [0] * intervals
            for id in ids:
                N_i[id] += 1

        # Расчет мат ожидания и дисперсии выборки:
        if need_mean_and_var:
            mean.append(np.mean(selections))
            var.append(np.var(selections))
    
    # Формирование вектора Y
    x, y = [], [n/(N*delta) for n in N_i]
    x.append(select_min + delta/2)
    for i in range(intervals-1):
        x.append(x[i] + delta)

    if get_samples_and_dist:
        returns.append([selections, N_i])
    if need_mean_and_var:
        returns.append([mean, var])
    if need_data_for_histogram:
        returns.append([x, y, delta, selections])
    
    return returns

def plot_hist(x, y, delta, samples, fig: int):
    global a
    global b
    x_axis = np.linspace(min(samples), max(samples), 100)
    plt.figure(fig)
    plt.bar(x, y, width=delta)
    plt.ylim(0, 0.25)
    plt.xlabel('Диапазон значений')
    plt.ylabel('Вероятность появления чисел')
    plt.plot(x_axis, uniform.pdf(x_axis, loc=a, scale=b-a), color='red')
    plt.title('Гистограмма нормального распределения')

def plot_dependence(arr, depend: str, fig: int):
    sizes = [i for i in range(1, len(arr)+1)]
    global a
    global b
    if depend == "Мат. ожидания":
        num = (a+b)/2
    elif depend == "Дисперсии":
        num = ((b-a)**2)/12
    plt.figure(fig)
    plt.title(f'График зависимости {depend} от количества')
    plt.plot(sizes, arr, label='Экспериментальные значения')
    plt.plot(sizes, [num]*len(sizes), label='Теоретическое значение')
    plt.xlabel('Количество значений в выборке')
    plt.ylabel('Значение параметра')
    plt.legend()

if __name__ == '__main__':
    # Основные параметры
    a, b, N = -10, 10, 100

    # График функции распределения модулируемого закона
    x = np.arange(a-0.1, b+0.1, 0.01)
    plt.figure(1)
    plt.plot(x, uniform.pdf(x, loc=a, scale=b-a))
    plt.ylim(0, 0.25)
    plt.xlabel('Диапазон значений')
    plt.ylabel('Вероятность появления чисел')
    plt.title('Функция распределения моделируемого закона')

    # Табличное представление результатов моделирования
    data = modeling(get_samples_and_dist=True)[0]
    df = pd.DataFrame(data[1])
    print(df.T)

    # Гистограмма выборки
    data = modeling(need_data_for_histogram=True)[0]
    plot_hist(*data, fig=3)

    # Графики зависимости величин от количества
    data = modeling(need_mean_and_var=True)[0]
    plot_dependence(data[0], depend="Мат. ожидания", fig=4)
    plot_dependence(data[1], depend="Дисперсии", fig=5)

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