diff --git a/TEMA9/Graf1.png b/TEMA9/Graf1.png new file mode 100644 index 0000000..a96f7be Binary files /dev/null and b/TEMA9/Graf1.png differ diff --git a/TEMA9/Graf2.png b/TEMA9/Graf2.png new file mode 100644 index 0000000..8d9a57e Binary files /dev/null and b/TEMA9/Graf2.png differ diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..f59dde3 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,17 @@ +import matplotlib.pyplot as plt +from M2 import main + +X, X1 = main() + +if X1: + plt.figure(figsize=(10, 5)) + plt.plot(X, 'b-', label='Исходный', alpha=0.7) + plt.plot(X1, 'r-', label='Исправленный', linewidth=2) + plt.legend() + plt.grid(True) + plt.show() +else: + plt.plot(X, 'b-') + plt.title("Нет аномалий для исправления") + plt.grid(True) + plt.show() \ No newline at end of file diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..cae3e42 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,16 @@ +def find_anomalous(X, M1, M2): + K = [] + for i in range(1, len(X)): + diff = X[i] - X[i-1] + if diff < M1 or diff > M2: + K.append(i) + return tuple(K) + +def correct_signal(X, K): + X1 = X.copy() + for i in K: + if i == len(X)-1: + X1[i] = X[i-1] + else: + X1[i] = 0.5 * (X[i-1] + X[i+1]) + return X1 \ No newline at end of file diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..d3561c7 --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,53 @@ +import os +from M1 import find_anomalous, correct_signal + +def get_file(): + while True: + name = input("Имя файла: ") + if (os.getcwd() + "/TEMA9/" + name): + return (os.getcwd() + "/TEMA9/" + name) + print("Файл не найден") + +def get_M(): + while True: + try: + M1 = float(input("M1: ")) + M2 = float(input("M2: ")) + if M1 < M2: + return M1, M2 + print("M1 должно быть < M2") + except: + print("Введите числа") + +def read_file(filename): + X = [] + with open(filename, 'r') as f: + for line in f: + for num in line.split(): + X.append(float(num)) + return X + +def save_binary(X1): + with open(os.getcwd() + "/TEMA9/Res44.bin", 'wb') as f: + for val in X1: + f.write(str(val).encode() + b' ') + +def main(): + filename = get_file() + + X = read_file(filename) + print(f"Прочитано {len(X)} значений") + + M1, M2 = get_M() + + K = find_anomalous(X, M1, M2) + print(f"Аномалии: {K}") + + if K: + X1 = correct_signal(X, K) + print(f"Исправлено: {X1[:10]}...") + save_binary(X1) + else: + print("Аномалий нет") + + return X, X1 if K else None \ No newline at end of file diff --git a/TEMA9/Res44.bin b/TEMA9/Res44.bin new file mode 100644 index 0000000..8eff93b --- /dev/null +++ b/TEMA9/Res44.bin @@ -0,0 +1 @@ +-0.6237815140713643 8.334758413952665 8.676761749029652 16.311955261228825 10.049076856969142 11.629416687369641 9.707997133988439 8.474627629385962 6.672229105628724 4.869830581871486 10.849253911018645 15.007334330751284 15.685684131327989 7.276761757100063 14.936309642961522 7.71080097037114 8.84174165046468 5.40753722882943 0.4706925635385968 4.260279922438404 12.093061250735083 6.9658395175116095 7.603305298422549 8.240771079333488 11.582777804202491 15.70265791101874 13.69355803793308 11.825229995716477 8.924432404604957 6.236897247630704 7.718515343413342 14.138162005578465 10.369381683301384 10.469410599944988 12.440727080674186 5.744189038187823 17.191426811028236 6.9476582691774915 12.497727637752119 8.705607846445806 5.5468985368821375 8.65552847128108 6.8664456002207395 8.650972345948677 10.520154831433961 12.389337316919246 12.27492795757532 12.160518598231395 11.04920237433025 9.937886150429105 \ No newline at end of file diff --git a/TEMA9/data.txt b/TEMA9/data.txt new file mode 100644 index 0000000..6ea98ac --- /dev/null +++ b/TEMA9/data.txt @@ -0,0 +1,10 @@ +-0.6237815140713643 8.196736422711934 17.293298341976694 9.15678707534737 15.330612180480957 +10.941366638590914 7.928221194258327 8.474627629385962 5.301678717071231 4.869830581871486 +20.53836519392446 16.828677240165803 9.47630346757811 14.542691022490175 5.077220046622017 +15.329928263432869 10.344381894120263 2.353555037496492 0.4706925635385968 17.22028298395856 +8.04986728133821 6.9658395175116095 4.216213077021437 8.240771079333488 17.7117577841044 +14.924784529071495 13.69355803793308 11.825229995716477 0.5766257954235954 6.023634813493437 +11.897168699837813 9.413395873333247 16.379155311319117 11.325367493269521 4.559665888570858 +13.556086668078851 6.9287121878047895 20.826766953977618 6.966604350550193 4.168688321526619 +10.44461134234142 6.925108752237655 6.8664456002207395 8.650972345948677 14.378168902408854 +12.389337316919246 9.46007954217064 12.160518598231395 5.5799479802517356 9.937886150429105 diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..bb15c7f --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,158 @@ +# Тест по модулю 3. + +***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: + K.append(i) + return tuple(K) + +def correct_signal(X, K): + X1 = X.copy() + for i in K: + if i == len(X)-1: + X1[i] = X[i-1] + else: + X1[i] = 0.5 * (X[i-1] + X[i+1]) + return X1 +``` + +M2.py: +```python +import os +from M1 import find_anomalous, correct_signal + +def get_file(): + while True: + name = input("Имя файла: ") + if (os.getcwd() + "/TEMA9/" + name): + return (os.getcwd() + "/TEMA9/" + name) + print("Файл не найден") + +def get_M(): + while True: + try: + M1 = float(input("M1: ")) + M2 = float(input("M2: ")) + if M1 < M2: + return M1, M2 + print("M1 должно быть < M2") + except: + print("Введите числа") + +def read_file(filename): + X = [] + with open(filename, 'r') as f: + for line in f: + for num in line.split(): + X.append(float(num)) + return X + +def save_binary(X1): + with open("Res44.bin", 'wb') as f: + for val in X1: + f.write(str(val).encode() + b' ') + +def main(): + filename = get_file() + + X = read_file(filename) + print(f"Прочитано {len(X)} значений") + + M1, M2 = get_M() + + K = find_anomalous(X, M1, M2) + print(f"Аномалии: {K}") + + if K: + X1 = correct_signal(X, K) + print(f"Исправлено: {X1[:10]}...") + save_binary(X1) + else: + print("Аномалий нет") + + return X, X1 if K else None +``` + +## Тест программы. + +**М1=-2, М2=5** + +Ответ программы: +```shell +Имя файла: data.txt +Прочитано 50 значений +M1: -2 +M2: 5 +Аномалии: (1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 48) +Исправлено: [-0.6237815140713643, 8.334758413952665, 8.676761749029652, 16.311955261228825, 10.049076856969142, 11.629416687369641, 9.707997133988439, 8.474627629385962, 6.672229105628724, 4.869830581871486]... +``` + +![График1](Graf1.png) + +Создан файл Res44.bin: +```text +-0.6237815140713643 8.334758413952665 8.676761749029652 16.311955261228825 10.049076856969142 11.629416687369641 9.707997133988439 8.474627629385962 6.672229105628724 4.869830581871486 10.849253911018645 15.007334330751284 15.685684131327989 7.276761757100063 14.936309642961522 7.71080097037114 8.84174165046468 5.40753722882943 0.4706925635385968 4.260279922438404 12.093061250735083 6.9658395175116095 7.603305298422549 8.240771079333488 11.582777804202491 15.70265791101874 13.69355803793308 11.825229995716477 8.924432404604957 6.236897247630704 7.718515343413342 14.138162005578465 10.369381683301384 10.469410599944988 12.440727080674186 5.744189038187823 17.191426811028236 6.9476582691774915 12.497727637752119 8.705607846445806 5.5468985368821375 8.65552847128108 6.8664456002207395 8.650972345948677 10.520154831433961 12.389337316919246 12.27492795757532 12.160518598231395 11.04920237433025 9.937886150429105 +``` + +**М1=-20, М2=50** + +Ответ программы: +```shell +Имя файла: data.txt +Прочитано 50 значений +M1: -20 +M2: 50 +Аномалии: () +Аномалий нет +``` + +![График2](Graf2.png) diff --git a/TEMA9/test.py b/TEMA9/test.py new file mode 100644 index 0000000..2d4b4db --- /dev/null +++ b/TEMA9/test.py @@ -0,0 +1,6 @@ +import random +import os +with open(os.getcwd() + "/TEMA9/data.txt", "w") as f: + for i in range(10): + row = [str(10 + random.gauss(0, 5)) for _ in range(5)] + f.write(" ".join(row) + "\n") \ No newline at end of file