diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..21f7d73 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,17 @@ +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() diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..9098ea3 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,48 @@ +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 diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..14341af --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,41 @@ +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() diff --git a/TEMA9/Res101.txt b/TEMA9/Res101.txt new file mode 100644 index 0000000..8a3904c --- /dev/null +++ b/TEMA9/Res101.txt @@ -0,0 +1,2 @@ +Сигнал заметно не меняется +Разброс сигнала сильно меняется diff --git a/TEMA9/covid.png b/TEMA9/covid.png new file mode 100644 index 0000000..8bdabe5 Binary files /dev/null and b/TEMA9/covid.png differ diff --git a/TEMA9/covid.txt b/TEMA9/covid.txt new file mode 100644 index 0000000..6c70808 --- /dev/null +++ b/TEMA9/covid.txt @@ -0,0 +1 @@ +-440 -131 -456 1419 -167 -322 -416 1695 421 3209 2665 3359 2051 1496 526 2647 4951 10663 7699 5993 diff --git a/TEMA9/test_module.md b/TEMA9/test_module.md new file mode 100644 index 0000000..6c8c2ef --- /dev/null +++ b/TEMA9/test_module.md @@ -0,0 +1,215 @@ +# Тест по модулю 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 +Сигнал заметно не меняется +Разброс сигнала сильно меняется + +``` + +**Результат:** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +