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

6.3 KiB

Тест по модулю 2

Марков Никита Сергеевич, А-03-23

20 вариант

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

-функция 1: аргументы - ряд отсчетов некоторого сигнала и целочисленный параметр N; функция должна рассчитать и возвратить оценки средних значений М1 и М2 и дисперсий С1 и С2 по первым N отсчетам сигнала и по оставшейся его части;

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

t=|M1-M2| /((C1N+С2(NN-N))/(NN-2))0.5

F=max(C1,C2)/min(C1,C2)

#M1.py

import math

def stats_on_signal(x, N):
    NN = len(x)
    if N <= 0 or N >= NN:
        raise ValueError("N должно быть > 0 и < количества отсчётов сигнала")

    part1 = x[:N]
    part2 = x[N:]

    M1 = sum(part1) / len(part1)
    M2 = sum(part2) / len(part2)

    def sample_var(data):
        n = len(data)
        m = sum(data) / n
        return sum((v - m) ** 2 for v in data) / (n - 1)

    C1 = sample_var(part1)
    C2 = sample_var(part2)

    return M1, M2, C1, C2, NN


def process_file(filename, N):
    values = []
    with open(filename, "r", encoding="utf-8") as f:
        for line in f:
            if not line.strip():
                continue
            for token in line.replace(",", " ").split():
                values.append(float(token))

    M1, M2, C1, C2, NN = stats_on_signal(values, N)

    print(f"Число отсчётов NN = {NN}")
    print(f"M1 = {M1}, M2 = {M2}")
    print(f"C1 = {C1}, C2 = {C2}")

    aaa = (C1 * N + C2 * (NN - N)) / (NN - 2)
    t = abs(M1 - M2) / math.sqrt(aaa)

    F = max(C1, C2) / min(C1, C2)

    print(f"t = {t}")
    print(f"F = {F}")

    return values, t, F


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

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

-вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики;

-при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt.

# M2.py
from M1 import process_file

def main():
    import os
    while True:
        filename = input("Введите имя текстового файла с сигналом: ").strip()
        if os.path.isfile(filename):
            break
        print("Файл не найден. Повторите ввод.")

    N_str = input("Введите N (число первых отсчётов для первой части): ").strip()
    N = int(N_str)
    
    values, t, F = process_file(filename, N)

    print("Считанный сигнал (отсчёты):")
    print(" ".join(f"{v}" for v in values))

    if t > 2:
        msg_t = "Сигнал сильно меняется"
    else:
        msg_t = "Сигнал заметно не меняется"

    if F > 4:
        msg_F = "Разброс сигнала сильно меняется"
    else:
        msg_F = "Разброс сигнала заметно не меняется"

    print(msg_t)
    print(msg_F)

    with open("Res101.txt", "w", encoding="utf-8") as f:
        f.write(msg_t + "\n")
        f.write(msg_F + "\n")


    return values, t, F


if __name__ == "__main__":
    main()


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

#Mo.py
from M2 import main as run_M2
import matplotlib.pyplot as plt

def main():
    values, t, F = run_M2()

    x_axis = list(range(1, len(values) + 1))
    plt.figure()
    plt.plot(x_axis, values, marker="o")
    plt.xlabel("Номер дня")
    plt.ylabel("Прирост заболевших")
    plt.title("Сигнал из файла (COVID-19, январь 2022)")
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    main()

4) Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.:

-440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993

Проверьте программу с использованием этих данных.


Введите имя текстового файла с сигналом: covid.txt
Введите N (число первых отсчётов для первой части): 10
Число отсчётов NN = 20
M1 = 481.2, M2 = 4205.0
C1 = 1529922.177777778, C2 = 9855042.0
t = 1.4806648475081259
F = 6.4415315649025455
Считанный сигнал (отсчёты):
-440.0 -131.0 -456.0 1419.0 -167.0 -322.0 -416.0 1695.0 421.0 3209.0 2665.0 3359.0 2051.0 1496.0 526.0 2647.0 4951.0 10663.0 7699.0 5993.0
Сигнал заметно не меняется
Разброс сигнала сильно меняется

Результат: