Добавил:
Периодически делаю учебные работы по предметам ЛЭТИ и выгружаю их сюда для пополнения базы, с которой можно будет свериться. Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
11.01.2026
Размер:
1.91 Кб
Скачать
import matplotlib.pyplot as plt
import numpy as np
import random
import time


class RandomFib:
    def __init__(self, m, debug=False):
        self.m = m
        if debug:
            random.seed(0)
            self.seed = [random.randint(0, 2**m) for _ in range(55)]
        else:
            random.seed(time.time())
            self.seed = [random.randint(0, 2**m) for _ in range(55)]

    def next(self):
        x = (self.seed[-55] + self.seed[-24]) % 2**self.m
        self.seed.pop(0)
        self.seed.append(x)
        return x / 2**self.m


class RandomValue:
    def __init__(self, xj, pj):
        self.Pj = [sum(pj[:i+1]) for i in range(len(pj))]
        self.xj = xj
        self.pj = pj
        self.z = RandomFib(16)

    def next(self):
        z = self.z.next()
        for p in range(len(self.Pj)):
            if z <= self.Pj[p]:
                return self.xj[p]


x = np.array([-88.0, -66.5, -26.2, -4.5, -0.3, 65.0, 65.8])
p = [0.186, 0.246, 0.139, 0.157, 0.207, 0.015, 0.050]
rv = RandomValue(x, p)

RV = []
N = 500
for i in range(N):
    RV.append(rv.next())

print("Первые 30 значений:")
for i in range(30):
    print(RV[i])
M = sum(RV) / N
D = sum([x ** 2 for x in RV]) / N - M ** 2
print(f"Эмпирические: M = {M:.5f}, D = {D:.5f}")

M_exp = sum([p[j] * x[j] for j in range(len(p))])
D_exp = sum([p[j] * x[j] ** 2 for j in range(len(p))]) - M_exp ** 2
print(f"Теоретические: M = {M_exp:.5f}, D = {D_exp:.5f}")
edges = (x[:-1] + x[1:]) / 2
bins = np.concatenate(
    ([x[0] - (edges[0] - x[0])], edges, [x[-1] + (x[-1] - edges[-1])]))

plt.hist([RV, x], bins=bins,
         weights=[np.ones_like(RV) / len(RV), np.ones_like(x) * p],
         label=['Эмпирическое', 'Теоретическое'])
plt.legend(loc='upper left')
plt.savefig("Vasilisa/ms2.svg")
plt.show()
Соседние файлы в папке Вариант 12