# Тест по модулю 2 Марков Никита Сергеевич, А-03-23 ## 20 вариант ## 1) Создайте модуль М1, содержащий две функции: -функция 1: аргументы - ряд отсчетов некоторого сигнала и целочисленный параметр N; функция должна рассчитать и возвратить оценки средних значений М1 и М2 и дисперсий С1 и С2 по первым N отсчетам сигнала и по оставшейся его части; -функция 2: аргумент - имя текстового файла с отсчетами сигнала Х; функция должна прочитать данные из указанного файла, передать их в функцию 1, отобразить результаты расчета и по возвращенным данным рассчитать и вернуть 2 статистики t=|M1-M2| /((C1*N+С2*(NN-N))/(NN-2))0.5 F=max(C1,C2)/min(C1,C2) ```py #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. ```py # 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 и отображает в виде графика введенный из файла числовой ряд. ```py #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 Проверьте программу с использованием этих данных. ```py Введите имя текстового файла с сигналом: 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 Сигнал заметно не меняется Разброс сигнала сильно меняется ``` **Результат:**