Скачиваний:
0
Добавлен:
08.07.2024
Размер:
3.76 Кб
Скачать
from math import *
import numpy as np
import random
from scipy.stats import uniform
import matplotlib.pyplot as plt
import time

def main():
    start_time = time.time()
    a, b = 10, 25
    mass = []
    mean, sd = (b+a)/2, ((b-a)**2)/12 # мат.ожидание и дисперсия
    n = 0
    delta = 0
    x_min, x_max = 0, 0
    grafic = np.zeros(10)
    M = []
    D = []
    N = []

    while min(grafic) < 1000:
        n += 1
        x = random.uniform(0.0, 1.0)
        alph = x * (b-a) + a
        mass.append(alph)
        P = (n - sum(grafic)) / n # вероятность попадания случайной величины за границы данного интервала

        if len(mass) >= 2:
            if P >= 0.01: # Пересчет всех Ni
                grafic = [0] * 10
                x_min = np.amin(mass)
                x_max = np.amax(mass)
                delta = (x_max - x_min) / 10
                for i in mass: # подсчет количества вхождений элементов в интервалы
                    k = floor((i - x_min)/delta)
                    if k == 10:
                        k = 9
                    if 9 >= k >= 0:
                        grafic[k] += 1
                print(grafic)
            else: # нахождение номера интервала последнего сгенерированного числа в массиве
                k = floor((mass[-1] - x_min) / delta)
                if k == 10:
                    k = 9
                if 9 >= k >= 0:
                    grafic[k] += 1
                print(grafic)

        if n % 100 == 0:
            M.append(np.mean(mass)) # мат ожидание на каждом сотом шаге
            D.append(np.var(mass)) # дисперсия на каждом сотом шаге
            N.append(n) # количество элементов

    print('Количество чисел:', n)
    print('Количество вхождений в интервалы', grafic)
    print('Минимальное число:', x_min, 'Максимальное число:', x_max)
    print('Время работы программы:', time.time() - start_time)


    x = [] # значения интервалов (по середине)
    y = [] # кол-во попаданий в эти интервалы
    x.append(x_min + delta/2)

    for i in range(9):
        x.append(x[i] + delta)

    for i in range(0, 10):
        y.append(grafic[i] / ((n)*delta))

    print(x)
    print(y)


    # график гистограммы и плотности распределения
    plt.xlabel('Интервалы')
    plt.ylabel('Количество вхождений в интервалы')
    line = np.linspace(x_min, x_max, 100)
    plt.plot(line, uniform.pdf(line,  loc=a, scale=b-a), lw=5, alpha=0.6, color='r')
    plt.bar(x, y, width=delta)
    plt.title('Гистограмма сформированной выборки')
    plt.show()

    # график мат ожидания
    x = np.arange(0, len(N), 1)
    plt.figure(3)
    plt.plot(x, M)
    plt.plot(range(0, len(x)), [mean for i in range(0, len(x))])
    plt.title("Мат ожидание")
    plt.xlabel('размер выборки')
    plt.ylabel('мат. ожидание')
    plt.show()

    # график дисперсии
    plt.figure(4)
    plt.plot(x, D)
    plt.plot(range(0, len(x)), [sd for i in range(0, len(x))])
    plt.title("Дисперсия")
    plt.xlabel('размер выборки')
    plt.ylabel('дисперсия')
    plt.show()

main()
Соседние файлы в папке ЛР 2