diff --git a/TEMA9/Mod0.py b/TEMA9/Mod0.py new file mode 100644 index 0000000..0ed4c4e --- /dev/null +++ b/TEMA9/Mod0.py @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt +from Mod2 import process_signal + +result = process_signal() +if result: + X, X1, anomalies = result + + plt.figure(figsize=(10, 6)) + + plt.subplot(2, 1, 1) + plt.plot(X, 'b-') + if anomalies: + anomaly_values = [X[i] for i in anomalies] + plt.plot(anomalies, anomaly_values, 'ro') + plt.title('Исходный сигнал') + plt.grid(True) + + if X1 is not None: + plt.subplot(2, 1, 2) + plt.plot(X1, 'g-') + plt.title('Исправленный сигнал') + plt.grid(True) + + plt.tight_layout() + plt.show() \ No newline at end of file diff --git a/TEMA9/Mod1.py b/TEMA9/Mod1.py new file mode 100644 index 0000000..a84b67c --- /dev/null +++ b/TEMA9/Mod1.py @@ -0,0 +1,23 @@ +def find_anomalies(X, T1, T2): + anomalies = [] + for i, value in enumerate(X): + if value < T1 or value > T2: + anomalies.append(i) + return anomalies + + +def correct_anomalies(X, anomalies): + if not anomalies: + return X + + X_list = list(X) + n = len(X_list) + avg_value = sum(X_list) / n + + for idx in anomalies: + if idx == 0 or idx == n - 1: + X_list[idx] = avg_value + else: + X_list[idx] = (X_list[idx - 1] + X_list[idx + 1]) / 2 + + return tuple(X_list) \ No newline at end of file diff --git a/TEMA9/Mod2.py b/TEMA9/Mod2.py new file mode 100644 index 0000000..6449db4 --- /dev/null +++ b/TEMA9/Mod2.py @@ -0,0 +1,41 @@ +import os +from Mod1 import find_anomalies, correct_anomalies + + +def process_signal(): + while True: + filename = input("Введите имя файла с данными: ") + if os.path.exists(filename): + break + print(f"Файл '{filename}' не найден.") + + while True: + T1 = float(input("Введите значение T1: ")) + T2 = float(input("Введите значение T2: ")) + if T1 < T2: + break + print("T1 должно быть меньше T2.") + + X = [] + with open(filename, 'r') as f: + for line in f: + line = line.strip() + if line: + X.append(float(line)) + + X_tuple = tuple(X) + + anomalies = find_anomalies(X_tuple, T1, T2) + print(f"Найдено аномальных отсчетов: {len(anomalies)}") + print(f"Индексы: {anomalies}") + + if anomalies: + X1_tuple = correct_anomalies(X_tuple, anomalies) + + with open('Res33.txt', 'w') as f: + f.write(f"X: {X_tuple}\nX1: {X1_tuple}\nИндексы: {anomalies}\nT1={T1}, T2={T2}") + + return X_tuple, X1_tuple, anomalies + else: + print("Аномальные отсчеты отсутствуют.") + return X_tuple, None, anomalies diff --git a/TEMA9/Test.md b/TEMA9/Test.md new file mode 100644 index 0000000..399e5e2 --- /dev/null +++ b/TEMA9/Test.md @@ -0,0 +1,195 @@ +# Индивидуальное контрольное задание по модулю 3 + +Зеленкина Ксения А-02-23 +## Задание +Вариант 8 +1) Создайте модуль М1, содержащий две функции: + +-функция 1: аргументы - кортеж Х с последовательностью отсчетов некоторого сигнала и два числовых параметра Т1 и Т2; в функции должен создаваться список с индексами "аномальных" отсчетов сигнала, удовлетворяющих неравенствам XT2; + +- функция 2: аргументы - кортеж Х с отсчетами сигнала и список "аномальных" значений; в функции должен создаваться новый кортеж Х1, в котором элементы, не являющиеся "аномальными", совпадают с соответствующими элементами из Х, а "аномальные" значения заменяются по правилу: если это первый или последний элемент, то он заменяется на среднее значение по кортежу Х, а остальные - заменяются на полусумму соседних по индексу элементов. + +2) Создайте еще один модуль М2, в котором должны выполняться операции: + +- запрашивается и вводится имя бинарного файла с данными (кортежем); проверяется наличие файла и при отсутствии - повторение запроса; + +- запрашиваются и вводятся граничные значения Т1 и Т2 с проверкой Т1,T2; + +- из указанного файла считывается кортеж Х с сигналом; + +- с применением функции 1 создается список с индексами "аномальных" отсчетов; результат отображается на экране; + +- если список "аномальных отсчетов не пустой, то с применением функции 2 создается кортеж Х1 с "исправленным" сигналом, отображается на экране и записывается в текстовый файл Res33.txt; в ином случае выдается сообщение об отсутствии "аномальных" отсчетов. + +3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика сигналы Х и Х1. + +4) Подготовьте бинарный файл, в который запишите кортеж Х с 50 случайными, нормально распределенными числами с математическим ожиданием 10 и стандартным отклонением 5. Проведите 2 расчета по программе с использованием этого файла: в первом расчете задайте Т1=5, Т2=18, а во втором - Т1=-20, Т2=50. + + + +## Решение +Содердимое Mod0 +_Код:_ +```py +import matplotlib.pyplot as plt +from Mod2 import process_signal + +result = process_signal() +if result: + X, X1, anomalies = result + + plt.figure(figsize=(10, 6)) + + plt.subplot(2, 1, 1) + plt.plot(X, 'b-') + if anomalies: + anomaly_values = [X[i] for i in anomalies] + plt.plot(anomalies, anomaly_values, 'ro') + plt.title('Исходный сигнал') + plt.grid(True) + + if X1 is not None: + plt.subplot(2, 1, 2) + plt.plot(X1, 'g-') + plt.title('Исправленный сигнал') + plt.grid(True) + + plt.tight_layout() + plt.show() +``` + +Содердимое Mod1 +_Код:_ +```py +def find_anomalies(X, T1, T2): + anomalies = [] + for i, value in enumerate(X): + if value < T1 or value > T2: + anomalies.append(i) + return anomalies + + +def correct_anomalies(X, anomalies): + if not anomalies: + return X + + X_list = list(X) + n = len(X_list) + avg_value = sum(X_list) / n + + for idx in anomalies: + if idx == 0 or idx == n - 1: + X_list[idx] = avg_value + else: + X_list[idx] = (X_list[idx - 1] + X_list[idx + 1]) / 2 + + return tuple(X_list) +``` + +Содердимое Mod2 +_Код:_ +```py +import os +from Mod1 import find_anomalies, correct_anomalies + + +def process_signal(): + while True: + filename = input("Введите имя файла с данными: ") + if os.path.exists(filename): + break + print(f"Файл '{filename}' не найден.") + + while True: + T1 = float(input("Введите значение T1: ")) + T2 = float(input("Введите значение T2: ")) + if T1 < T2: + break + print("T1 должно быть меньше T2.") + + X = [] + with open(filename, 'r') as f: + for line in f: + line = line.strip() + if line: + X.append(float(line)) + + X_tuple = tuple(X) + + anomalies = find_anomalies(X_tuple, T1, T2) + print(f"Найдено аномальных отсчетов: {len(anomalies)}") + print(f"Индексы: {anomalies}") + + if anomalies: + X1_tuple = correct_anomalies(X_tuple, anomalies) + + with open('Res33.txt', 'w') as f: + f.write(f"X: {X_tuple}\nX1: {X1_tuple}\nИндексы: {anomalies}\nT1={T1}, T2={T2}") + + return X_tuple, X1_tuple, anomalies + else: + print("Аномальные отсчеты отсутствуют.") + return X_tuple, None, anomalies + +process_signal() +``` + +Содердимое Test +_Код:_ +```py +import numpy as np + + +def create_test_file(filename="signal_data.bin", n=50, mean=10, std=5): + data = np.random.normal(mean, std, n) + + with open(filename, 'w') as f: + for value in data: + f.write(f"{value}\n") + + print(f"Файл '{filename}' создан.") + +create_test_file() +``` + +Запуск Test.py +_Вывод:_ +```py +Файл 'signal_data.bin' создан. +``` + +Запуск Mod0 (T1 = 5, T2 = 18) +_Вывод:_ +```py +Введите имя файла с данными: signal_data.bin +Введите значение T1: 5 +Введите значение T2: 18 +Найдено аномальных отсчетов: 14 +Индексы: [1, 2, 5, 8, 10, 18, 24, 30, 31, 35, 40, 44, 45, 47] +``` + + + +Cписок "аномальных отсчетов не пустой => записываем в текстовый файл Res33.txt +Содержимое Res33: + + +Запуск Mod0 (T1 = -20, T2 = 50) +_Вывод:_ +```py +Введите имя файла с данными: signal_data.bin +Введите значение T1: -20 +Введите значение T2: 50 +Найдено аномальных отсчетов: 0 +Индексы: [] +Аномальные отсчеты отсутствуют. +``` + + +Если в поле "Введите имя файла с данными: " мы ничего не введём. Программа повторит запрос. +_Вывод:_ +```py +Введите имя файла с данными: +Файл '' не найден. +Введите имя файла с данными: +``` \ No newline at end of file diff --git a/TEMA9/Test.py b/TEMA9/Test.py new file mode 100644 index 0000000..2498937 --- /dev/null +++ b/TEMA9/Test.py @@ -0,0 +1,15 @@ +import numpy as np + + +def create_test_file(filename="signal_data.bin", n=50, mean=10, std=5): + data = np.random.normal(mean, std, n) + + with open(filename, 'w') as f: + for value in data: + f.write(f"{value}\n") + + print(f"Файл '{filename}' создан.") + print(f"Первые 10 значений: {data[:10]}") + + +create_test_file() \ No newline at end of file diff --git a/TEMA9/photo2.png b/TEMA9/photo2.png new file mode 100644 index 0000000..1c014c4 Binary files /dev/null and b/TEMA9/photo2.png differ diff --git a/TEMA9/photo3.png b/TEMA9/photo3.png new file mode 100644 index 0000000..69e2927 Binary files /dev/null and b/TEMA9/photo3.png differ diff --git a/TEMA9/photo4.png b/TEMA9/photo4.png new file mode 100644 index 0000000..1e1e768 Binary files /dev/null and b/TEMA9/photo4.png differ