diff --git a/TEMA9/Figure_1_t.png b/TEMA9/Figure_1_t.png new file mode 100644 index 0000000..c001f04 Binary files /dev/null and b/TEMA9/Figure_1_t.png differ diff --git a/TEMA9/Figure_2_t.png b/TEMA9/Figure_2_t.png new file mode 100644 index 0000000..a4a7ec9 Binary files /dev/null and b/TEMA9/Figure_2_t.png differ diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..71e96a4 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,27 @@ +import M2 +import matplotlib.pyplot as plt + +def main(): + original, processed = M2.main() + # Строим графики + plt.figure(figsize=(10, 6)) + # График 1 + plt.subplot(2, 1, 1) + plt.plot(original, 'b-') + plt.title("Исходный сигнал") + plt.xlabel("Номер отсчета") + plt.ylabel("Значение") + plt.grid(True) + + # График 2 + plt.subplot(2, 1, 2) + plt.plot(processed, 'r-') + plt.title("Обработанный сигнал") + plt.xlabel("Номер отсчета") + plt.ylabel("Значение") + plt.grid(True) + plt.tight_layout() + plt.show() + +if __name__ == "__main__": + main() diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..147eff0 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,17 @@ +def function_1(X, T): + X1 = [] + for value in X: + if value > T: + X1.append(T) + elif value < -T: + X1.append(-T) + else: + X1.append(value) + return X1 + +def function_2(XX): + count = 0 + for i in range(1, len(XX)): + if XX[i] > XX[i-1]: + count += 1 + return count diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..b0d8ce5 --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,52 @@ + +import M1 + +def main(): + print("=== Обработка сигнала ===") + while True: + filename = input("Введите имя файла: ") + try: + file = open(filename, 'r') + file.close() + break + except: + print(f"Файл '{filename}' не найден. Попробуйте еще.") + + print(f"Чтение файла {filename}...") + X = [] + file = open(filename, 'r') + for line in file: + try: + X.append(float(line.strip())) + except: + pass # пропускаем строки, которые не содержат чисел + file.close() + print(f"Прочитано чисел: {len(X)}") + print(f"Первые 3 числа: {X[:3]}") + + while True: + try: + T = float(input("Введите T (>0): ")) + if T > 0: + break + else: + print("T должен быть больше 0") + except: + print("Введите число") + + # Применяем функцию 1 + X1 = M1.function_1(X, T) + print(f"\nСигнал обработан с T={T}") + print(f"Пример: X[0]={X[0]:.3f} -> X1[0]={X1[0]:.3f}") + print(f" X[1]={X[1]:.3f} -> X1[1]={X1[1]:.3f}") + + # Применяем функцию 2 + increases = M1.function_2(X1) + print(f" Число элементов удовлетворяющих неравенству: {increases}") + + # Сохраняем в файл + with open("Res55.bin", 'w') as f: + for value in X1: + f.write(f"{value}\n") + print("Файл Res55.bin создан") + return X, X1 diff --git a/TEMA9/main_prog.py b/TEMA9/main_prog.py new file mode 100644 index 0000000..c9a8628 --- /dev/null +++ b/TEMA9/main_prog.py @@ -0,0 +1,22 @@ +import math +import random + +# Синусоидальный сигнал (40 точек) +with open("sine.txt", "w") as f: + for i in range(40): + value = 3.5 * math.sin(2 * math.pi * i / 9) + f.write(f"{value}\n") +print("Файл sine.txt создан (синус)") + +# Нормальный сигнал (40 точек) +with open("normal.txt", "w") as f: + for i in range(40): + # Простой способ получить нормальное распределение + r = sum(random.random() for _ in range(12)) - 6 + value = 5 + 7 * r + f.write(f"{value}\n") +print("Файл normal.txt создан (нормальный)") + +print(" sine.txt с T=2.5") +print(" normal.txt с T=6") +print("\nЗапуск: python M0.py") diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..c78abeb --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,240 @@ +# Индивидуальное контрольное задание по теме 9 + +## Задание: +1) Создайте модуль М1, содержащий две функции: +- функция 1: аргументы - список или кортеж Х с элементами - отсчетами некоторого сигнала и числовой параметр Т; в функции создается новый список Х1 с элементами, значения которых определяются по значениям элементов из Х по правилу: X1[i]=T, если X[i]>T; X1[i]=-T, если X[i]<-T; в остальных случаях X1[i]=X[i]; +- функция 2: аргумент - список или кортеж ХХ ; в функции должно подсчитываться число элементов, удовлетворяющих неравенству XX[i]>XX[i-1]. + + +2) Создайте еще один модуль М2, в котором должны выполняться операции: +- запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса; +- из файла считывается список Х; +- запрашивается значение параметра Т с проверкой Т>0; +- с помощью функции 1 производится преобразование сигнала с записью его в новый список; отображается результат; +- с новому списку применяется функция 2 и отображается результат; +- преобразованный сигнал записывается в бинарный файл Res55.bin. + +3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика исходный и преобразованный сигнал. + +4) Для проверки программы создайте 2 текстовых файла: в первый запишите 40 отсчетов синусоидального сигнала с периодом 9 и амплитудой 3.5 ; во второй - случайный, нормально распределенный сигнал с математическим ожиданием, равным 5, и стандартным отклонением, равным 7. При запуске программы с первым файлом задайте Т=2.5, со вторым - Т=6. + +## Решение: +- M1: +``` +>>>def function_1(X, T): + X1 = [] + for value in X: + if value > T: + X1.append(T) + elif value < -T: + X1.append(-T) + else: + X1.append(value) + return X1 + +>>>def function_2(XX): + count = 0 + for i in range(1, len(XX)): + if XX[i] > XX[i-1]: + count += 1 + return count +``` + +- M2: +``` +>>>import M1 + +>>>def main(): + print("=== Обработка сигнала ===") + while True: + filename = input("Введите имя файла: ") + try: + file = open(filename, 'r') + file.close() + break + except: + print(f"Файл '{filename}' не найден. Попробуйте еще.") + + print(f"Чтение файла {filename}...") + X = [] + file = open(filename, 'r') + for line in file: + try: + X.append(float(line.strip())) + except: + pass # пропускаем строки, которые не содержат чисел + file.close() + print(f"Прочитано чисел: {len(X)}") + print(f"Первые 3 числа: {X[:3]}") + + while True: + try: + T = float(input("Введите T (>0): ")) + if T > 0: + break + else: + print("T должен быть больше 0") + except: + print("Введите число") + + # Применяем функцию 1 + X1 = M1.function_1(X, T) + print(f"\nСигнал обработан с T={T}") + print(f"Пример: X[0]={X[0]:.3f} -> X1[0]={X1[0]:.3f}") + print(f" X[1]={X[1]:.3f} -> X1[1]={X1[1]:.3f}") + + # Применяем функцию 2 + increases = M1.function_2(X1) + print(f" Число элементов удовлетворяющих неравенству: {increases}") + + # Сохраняем в файл + with open("Res55.bin", 'w') as f: + for value in X1: + f.write(f"{value}\n") + print("Файл Res55.bin создан") + return X, X1 +``` + +- M0(основной): +``` +>>>import M2 +>>>import matplotlib.pyplot as plt + +>>>def main(): + original, processed = M2.main() + # Строим графики + plt.figure(figsize=(10, 6)) + # График 1 + plt.subplot(2, 1, 1) + plt.plot(original, 'b-') + plt.title("Исходный сигнал") + plt.xlabel("Номер отсчета") + plt.ylabel("Значение") + plt.grid(True) + + # График 2 + plt.subplot(2, 1, 2) + plt.plot(processed, 'r-') + plt.title("Обработанный сигнал") + plt.xlabel("Номер отсчета") + plt.ylabel("Значение") + plt.grid(True) + plt.tight_layout() + plt.show() + +>>>if __name__ == "__main__": + main() +=== Обработка сигнала === +Введите имя файла: sine.txt +Чтение файла sine.txt... +Прочитано чисел: 40 +Первые 3 числа: [0.0, 2.249756633902887, 3.446827135542728] +Введите T (>0): 2.5 + +Сигнал обработан с T=2.5 +Пример: X[0]=0.000 -> X1[0]=0.000 + X[1]=2.250 -> X1[1]=2.250 + Число элементов удовлетворяющих неравенству: 18 +Файл Res55.bin создан + +=== Обработка сигнала === +Введите имя файла: normal.txt +Чтение файла normal.txt... +Прочитано чисел: 40 +Первые 3 числа: [-12.419956992247982, 9.170966980707039, 1.5586943810492464] +Введите T (>0): 6 + +Сигнал обработан с T=6.0 +Пример: X[0]=-12.420 -> X1[0]=-6.000 + X[1]=9.171 -> X1[1]=6.000 + Число элементов удовлетворяющих неравенству: 16 +Файл Res55.bin создан +``` +- Для первого бинарного файла: +0.0 +2.249756633902887 +2.5 +2.5 +1.197070501639841 +-1.1970705016398404 +-2.5 +-2.5 +-2.2497566339028885 +-8.572527594031472e-16 +2.249756633902887 +2.5 +2.5 +1.1970705016398404 +-1.197070501639838 +-2.5 +-2.5 +-2.2497566339028867 +-1.7145055188062944e-15 +2.2497566339028845 +2.5 +2.5 +1.197070501639847 +-1.1970705016398373 +-2.5 +-2.5 +-2.249756633902887 +-2.5717582782094417e-15 +2.2497566339028836 +2.5 +2.5 +1.197070501639842 +-1.1970705016398364 +-2.5 +-2.5 +-2.249756633902888 +-3.429011037612589e-15 +2.2497566339028827 +2.5 +2.5 + +- Для второго файла: +-6.0 +6.0 +1.5586943810492464 +2.4650468069822447 +-1.3776515381877372 +4.308588576336187 +-2.477643780693926 +3.1227006290467134 +-6.0 +1.4639685181290663 +0.5887631397128779 +2.047305681679859 +6.0 +6.0 +5.523857430011989 +-6.0 +6.0 +6.0 +0.8873255790447026 +6.0 +4.186677532259668 +6.0 +3.9062331720166252 +6.0 +6.0 +6.0 +3.4689403335145297 +6.0 +6.0 +6.0 +4.336774118550339 +3.9036252545111303 +6.0 +3.160901927152815 +5.7645792486392 +6.0 +0.342439825635517 +0.7388797780425458 +-1.4449795545346191 +-2.913183927457421 + + +![График](Figure_1_t.png) + +![График](Figure_2_t.png)