Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

7.0 KiB

Индивидуальное контрольное задание по теме 9

Бушманов А.С. А-01-23

Задание: Вариант 14

M3_14

Создайте модуль М1, содержащий две функции:

функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке списка с наименьшим и наибольшим значениями, размахом (разность наибольшего и наименьшего значений), оценкой стандартного отклонения и отношением размаха к стандартному отклонению;

функция 2: аргументы - список или кортеж с выборкой и целочисленный параметр m; функция должна обратиться к функции 1 и затем определить границы m непересекающихся интервалов в диапазоне величины между наибольшим и наименьшим значениями по выборке, содержащих примерно одинаковое число элементов выборки; функция должна вернуть 2 списка: со значениями границ интервалов и с числами элементов в интервалах.

Создайте еще один модуль М2, в котором должны выполняться следующие операции:

запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;

выборка вводится из файла и записывается в список (в строках файла может быть разное число значений, разделенных пробелами);

запрашиваются у пользователя число интервалов разбиения;

с помощью функций 1 и 2 производится определение границ интервалов и чисел элементов в них.

отображается столбиковая диаграмма с интервалами и числами элементов выборки в них.

Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.

Проведите расчеты при 2-х разных файлах с выборками

Решение:

Модуль 1: M1

import math
def stats(sample):
    x = list(sample)
    n = len(x)
    mn = min(x)
    mx = max(x)
    razmah = mx - mn
    mean = sum(x) / n
    if n > 1:
        s = math.sqrt(sum((xi - mean) ** 2 for xi in x) / (n - 1))
    else:
        s = 0.0
    if s == 0:
        ratio = None
    else:
        ratio = razmah / s
    return mn, mx, razmah, s, ratio
def intervals(sample, m):
    mn, mx, razmah, s, ratio = stats(sample)
    x = sorted(sample)
    n = len(x)
    borders = [mn]
    for k in range(1, m):
        idx = int(k * n / m)
        borders.append(x[idx])
    borders.append(mx)
    counts = [0] * m
    for v in sample:
        placed = False
        for i in range(m - 1):
            if borders[i] <= v < borders[i + 1]:
                counts[i] += 1
                placed = True
                break
        if not placed:
            if borders[m - 1] <= v <= borders[m]:
                counts[m - 1] += 1
    return borders, counts

Модуль 2: M2

import os
import M1
import matplotlib.pyplot as plt
def read_sample(filename):
    data = []
    with open(filename, "r", encoding="utf-8") as f:
        for line in f:
            for t in line.split():
                data.append(float(t))
    return data
def run():
    while True:
        fname = input("Введите имя файла с выборкой: ").strip()
        if os.path.exists(fname):
            break
        print("Файл не найден. Попробуйте ещё раз.")
    sample = read_sample(fname)
    print("Размер выборки:", len(sample))
    m = int(input("Введите число интервалов m: "))
    mn, mx, razmah, s, ratio = M1.stats(sample)
    borders, counts = M1.intervals(sample, m)
    print("\n--- Статистики ---")
    print("min =", mn)
    print("max =", mx)
    print("размах =", razmah)
    print("std =", s)
    print("размах/std =", ratio)
    print("\n--- Интервалы ---")
    for i in range(m):
        left = borders[i]
        right = borders[i+1]
        print(f"[{left}; {right}) -> {counts[i]}" if i < m-1 else f"[{left}; {right}] -> {counts[i]}")
    labels = []
    for i in range(m):
        a = borders[i]
        b = borders[i+1]
        if i < m-1:
            labels.append(f"[{a:.2f};{b:.2f})")
        else:
            labels.append(f"[{a:.2f};{b:.2f}]")

    plt.bar(labels, counts)
    plt.xticks(rotation=45, ha="right")
    plt.title("Распределение элементов по интервалам")
    plt.xlabel("Интервалы")
    plt.ylabel("Число элементов")
    plt.tight_layout()
    plt.show()
    return mn, mx, razmah, s, ratio, borders, counts

Модуль 3: M0

import M2
result = M2.run()
print("\nГотово. Результаты получены.")

Ответ c sampe1.txt:

import M0
Введите имя файла с выборкой: sample1
Файл не найден. Попробуйте ещё раз.
Введите имя файла с выборкой: sample1.txt
Файл не найден. Попробуйте ещё раз.
Введите имя файла с выборкой: sample1.txt
Размер выборки: 20
Введите число интервалов m: 5

--- Статистики ---
min = 1.0
max = 12.0
размах = 11.0
std = 3.216323497738569
размах/std = 3.4200539864022432

--- Интервалы ---
[1.0; 3.0) -> 4
[3.0; 4.0) -> 3
[4.0; 6.0) -> 5
[6.0; 9.0) -> 4
[9.0; 12.0] -> 4

Готово. Результаты получены.

!test_figure_1.png

Ответ c sampe2.txt:

import M0
Введите имя файла с выборкой: sample2.txt
Размер выборки: 18
Введите число интервалов m: 8

--- Статистики ---
min = -5.0
max = 34.0
размах = 39.0
std = 9.751319669363612
размах/std = 3.9994586704534942

--- Интервалы ---
[-5.0; -3.0) -> 2
[-3.0; -1.0) -> 2
[-1.0; 0.0) -> 1
[0.0; 1.0) -> 3
[1.0; 2.0) -> 2
[2.0; 5.0) -> 3
[5.0; 13.0) -> 2
[13.0; 34.0] -> 3

Готово. Результаты получены.

!test_figure_2.png

Файл sample1.txt:

1 2 3 4 5 6
2 2 3 3 4 4
5 6 7 8 9
10 11 12

Файл sample2.txt:

-5 -4 -3 -2 -1 0
0 0 1 1 2 2
3 5 8 13 21
34