diff --git a/TEMA9/-20and50.png b/TEMA9/-20and50.png new file mode 100644 index 0000000..84cd585 Binary files /dev/null and b/TEMA9/-20and50.png differ diff --git a/TEMA9/-2and5.png b/TEMA9/-2and5.png new file mode 100644 index 0000000..c3caffe Binary files /dev/null and b/TEMA9/-2and5.png differ diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..ba87d48 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,27 @@ +import pylab +from M2 import run_M2 + +def main(): + X, X1 = run_M2() + + # Построение графиков + pylab.figure(figsize=(10, 5)) + pylab.subplot(1, 2, 1) + pylab.plot(X, label='Исходный сигнал') + pylab.title("Исходный сигнал") + pylab.xlabel("Отсчёты") + pylab.ylabel("Значение") + pylab.grid(True) + + pylab.subplot(1, 2, 2) + pylab.plot(X1, label='Исправленный сигнал', color='orange') + pylab.title("Исправленный сигнал") + pylab.xlabel("Отсчёты") + pylab.ylabel("Значение") + pylab.grid(True) + + pylab.tight_layout() + pylab.show() + +if __name__ == "__main__": + main() diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..911b2e7 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,19 @@ +def find_anomalous_indices(X, M1, M2): + + indices = [] + for i in range(1, len(X)): + diff = X[i] - X[i-1] + if diff < M1 or diff > M2: + indices.append(i) + return tuple(indices) + + +def correct_anomalies(X, K): + + X1 = X.copy() + for idx in K: + if idx == len(X) - 1: + X1[idx] = X1[idx - 1] + else: + X1[idx] = 0.5 * (X1[idx - 1] + X1[idx + 1]) + return X1 diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..8df8033 --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,51 @@ +# M2.py +import os +import sys +import pickle + +def run_M2(): + + while True: + filename = input("Введите имя текстового файла с сигналом: ").strip() + if os.path.isfile(filename): + break + + + + X = [] + with open(filename, 'r') as f: + for line in f: + parts = line.strip().split() + for p in parts: + X.append(float(p)) + + + while True: + + M1 = float(input("Введите M1 (нижняя граница разности): ")) + M2 = float(input("Введите M2 (верхняя граница разности, M2 > M1): ")) + if M1 < M2: + break + else: + print("M1 должно быть меньше M2.") + + + from M1 import find_anomalous_indices, correct_anomalies + + + K = find_anomalous_indices(X, M1, M2) + print(f"Аномальные индексы: {K}") + + + if K: + X1 = correct_anomalies(X, K) + print("Исправленный сигнал:", X1) + + + with open("Res44.bin", "wb") as f: + pickle.dump(X1, f) + print("Результат записан в Res44.bin") + else: + print("Аномальных отсчётов не обнаружено.") + + return X, X1 if K else X diff --git a/TEMA9/Res44.bin b/TEMA9/Res44.bin new file mode 100644 index 0000000..1dd2577 Binary files /dev/null and b/TEMA9/Res44.bin differ diff --git a/TEMA9/signal.txt b/TEMA9/signal.txt new file mode 100644 index 0000000..0780700 --- /dev/null +++ b/TEMA9/signal.txt @@ -0,0 +1,10 @@ +4.263134009624702 4.067283548723314 4.874920842655541 4.834128754109237 10.405920382638437 +11.61359628853662 7.593559339199566 8.905524284214025 8.186641831318802 8.638222773625724 +10.700010550793879 5.937964750303343 14.858886989589493 4.480521770666802 10.21863100240053 +8.09653182808412 10.833705848935924 9.862509524620615 11.252167038027647 8.640348799010265 +13.592229845972096 4.883380805635669 7.553625615588027 13.512737353500533 6.7138113007856965 +11.906386758613547 9.718459182587361 3.71492974457289 4.942941008501308 10.223575151953712 +12.950645342438829 5.157741827157216 10.346955136422984 12.96777573030182 13.306115816113852 +8.834837767997525 0.12078079724976654 9.788832403588085 11.490264634495386 5.082665741299458 +2.17738781613307 8.375021265815336 13.383241973998315 4.689091929318712 15.563525674193436 +6.592656956033435 23.556310839847484 4.384188136721545 7.622389260732377 11.17003135779134 diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..c71a0d1 --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,196 @@ +# Индивидуальное контрольное задание по теме 9 + +Голощапов Д.Е., А-01-23 + +## Задание + +M3_9 +1) Создайте модуль М1, содержащий две функции: + +- функция 1: аргументы - список Х с последовательностью отсчетов некоторого сигнала и два числовых параметра:М1 и М2; в функции должен создаваться кортеж К с индексами "аномальных" отсчетов сигнала, для которых выполняются неравенства: X[i]-X[i-1]M2. + +- функция 2: аргументы - список Х с отсчетами сигнала и кортеж К с индексами "аномальных" отсчетов; в функции должен создаваться новый список Х1, в котором элементы совпадают с элементами из Х, если те не являются "аномальными", а элементы из списка К заменяются на X[i]=0.5*(X[i-1]+X[i+1]), а если "аномальным" окажется последний элемент, то его значение заменяется на значение предпоследнего элемента. + +2) Создайте еще один модуль М2, в котором должны выполняться операции: + +- запрашивается и вводится имя текстового файла со значениями сигнала; проверяется наличие файла и при отсутствии - повторение запроса; + +- из указанного файла считывается список Х с сигналом, причем в строках файла может быть разное число отсчетов сигнала; + +- запрашиваются и вводятся граничные значения М1 и М2 (с проверкой: М1 M2: + indices.append(i) + return tuple(indices) + + +def correct_anomalies(X, K): + + X1 = X.copy() + for idx in K: + if idx == len(X) - 1: + X1[idx] = X1[idx - 1] + else: + X1[idx] = 0.5 * (X1[idx - 1] + X1[idx + 1]) + return X1 +``` + +### Модуль 2 + +``` + +import os +import sys +import pickle + +def run_M2(): + + while True: + filename = input("Введите имя текстового файла с сигналом: ").strip() + if os.path.isfile(filename): + break + else: + print('Файл не найден, повторите ввод') + + + X = [] + with open(filename, 'r') as f: + for line in f: + parts = line.strip().split() + for p in parts: + X.append(float(p)) + + + while True: + + M1 = float(input("Введите M1 (нижняя граница разности): ")) + M2 = float(input("Введите M2 (верхняя граница разности, M2 > M1): ")) + if M1 < M2: + break + else: + print("M1 должно быть меньше M2.") + + + from M1 import find_anomalous_indices, correct_anomalies + + + K = find_anomalous_indices(X, M1, M2) + print(f"Аномальные индексы: {K}") + + + if K: + X1 = correct_anomalies(X, K) + print("Исправленный сигнал:", X1) + + + with open("Res44.bin", "wb") as f: + pickle.dump(X1, f) + print("Результат записан в Res44.bin") + else: + print("Аномальных отсчётов не обнаружено.") + + return X, X1 if K else X + +``` + +### Модуль 0 + +``` +import pylab +from M2 import run_M2 + +def main(): + X, X1 = run_M2() + + pylab.figure(figsize=(10, 5)) + pylab.subplot(1, 2, 1) + pylab.plot(X, label='Исходный сигнал') + pylab.title("Исходный сигнал") + pylab.xlabel("Отсчёты") + pylab.ylabel("Значение") + pylab.grid(True) + + pylab.subplot(1, 2, 2) + pylab.plot(X1, label='Исправленный сигнал', color='orange') + pylab.title("Исправленный сигнал") + pylab.xlabel("Отсчёты") + pylab.ylabel("Значение") + pylab.grid(True) + + pylab.tight_layout() + pylab.show() + +if __name__ == "__main__": + main() +``` + +``` +""" +Создание тестового файла с нормально распределёнными числами. +""" +import numpy as np + +# Генерация 50 чисел с нормальным распределением + +signal = np.random.normal(loc=10, scale=5, size=50) + +# Запись в файл +with open("signal.txt", "w") as f: + for i, value in enumerate(signal): + f.write(f"{value:.4f}") + if (i + 1) % 10 == 0: # 10 значений в строке + f.write("\n") + else: + f.write(" ") + +print(f"Создан файл signal.txt с {len(signal)} значениями") + +## Результат + +### Для -2 и 5: + +``` + +Введите имя текстового файла с сигналом: signal.txt +Введите M1 (нижняя граница разности): -2 +Введите M2 (верхняя граница разности, M2 > M1): 5 +Аномальные индексы: (4, 6, 11, 12, 13, 14, 15, 19, 21, 23, 24, 25, 26, 27, 29, 31, 32, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47) +Исправленный сигнал: [4.263134009624702, 4.067283548723314, 4.874920842655541, 4.834128754109237, 8.223862521322928, 11.61359628853662, 10.259560286375322, 8.905524284214025, 8.186641831318802, 8.638222773625724, 10.700010550793879, 12.779448770191685, 8.629985270429243, 9.424308136414886, 8.760419982249502, 9.797062915592713, 10.833705848935924, 9.862509524620615, 11.252167038027647, 12.422198441999871, 13.592229845972096, 10.572927730780062, 7.553625615588027, 7.133718458186862, 9.520052608400205, 9.619255895493783, 6.667092820033337, 5.8050169142673225, 4.942941008501308, 8.946793175470068, 12.950645342438829, 11.648800239430907, 12.308287984866364, 12.96777573030182, 13.306115816113852, 6.713448306681809, 8.251140355134947, 9.870702494815166, 11.490264634495386, 6.833826225314228, 7.604423745564782, 10.493832859781548, 7.59146239455013, 11.577494034371783, 9.08507549520261, 16.320693167525047, 10.352440652123295, 8.987414956427836, 7.622389260732377, 11.17003135779134] +Результат записан в Res44.bin + +``` + +![](-2and5.png) + +### Для -20 и 50: + +``` + +Введите имя текстового файла с сигналом: signal.txt +Введите M1 (нижняя граница разности): -20 +Введите M2 (верхняя граница разности, M2 > M1): 50 +Аномальные индексы: () +Аномальных отсчётов не обнаружено. + +``` + +![](-20and50.png) \ No newline at end of file