Добавил:
SuperciliousMe
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба 2 / 21_var
.pyimport 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()