# Индивидуальное контрольное программирование по модулю 3 Лазарев Данил, А-01-23 # Задание 1) Создайте модуль М1, содержащий две функции: - функция 1: аргументы - список SPS1 с числовыми значениям - отсчетами некоторого сигнала, и параметр Alpha со значением между 0.01 и 0.99; в функции создается и возвращается новый список SPS2, в котором SPS2[0] = SPS1[0], а остальные элементы вычисляются по формуле SPS[i]=Alpha*SPS2[i-1]+(1-Alpha)*(SPS1[i-1]-SPS2[i-1]) , где i - от 1 до длины списка SPS1; - функция 2: аргументы - два списка с числовыми значениями; в функции рассчитываются среднее значение разностей и средний квадрат разностей значений двух списков с одинаковыми индексами 2) Создайте еще один модуль М2, в котором должны: - запрашиваться имя текстового файла с исходными данными, проверяться его наличие и при отсутствии - повторение запроса; - из указанного файла считываются и заносятся в список IS_SPS числовые данные - отсчеты некоторого сигнала (в файле они могут располагаться по несколько значений на строке); - запрашивается значение параметра сглаживания ALPH, проверяется, что он больше 0 и меньше 1; - с помощью функции 1 создается новый список SG_SPS и отображается на экране; - с помощью функции 2 по двум этим спискам рассчитываются два указанных значения и отображаются с заголовками; - список, полученный в функции 1 записывается в бинарный файл Res3.bin. 3) Создайте модуль М0 - главную программу, которая вызывает М2, отображает оба списка из функции 1 на одном графике. 4) Создайте текстовый файл, в который запишите 50 случайных чисел, нормально распределенных, с некоторыми параметрами. Проведите расчеты по программе. Создайте еще один файл, в который запишите 50 случайных чисел с равномерным распределением в некотором диапазоне значений. # Решение Модуль1 ``` def smooth(sps1, alpha): sps2 = [sps1[0]] for i in range(1, len(sps1)): val = alpha * sps2[i-1] + (1 - alpha) * (sps1[i-1] - sps2[i-1]) sps2.append(val) return sps2 def calc_diff(list1, list2): """Расчет разностей между списками""" diffs = [list1[i] - list2[i] for i in range(len(list1))] avg = sum(diffs) / len(diffs) avg_sq = sum(d * d for d in diffs) / len(diffs) return avg, avg_sq ``` Модуль 2 ``` import m1 import os def main(): while True: filename = input("Введите имя файла: ") if os.path.exists(filename): break print("Файл не найден!") # Чтение данных data = [] with open(filename, 'r') as f: for i in f: for num in i.split(): data.append(float(num)) # Запрос параметра while True: alpha_str = input("Введите alpha (0-1): ") if alpha_str.replace('.', '', 1).isdigit(): alpha = float(alpha_str) if 0 < alpha < 1: break print("Ошибка! alpha должен быть от 0 до 1") smoothed = m1.smooth(data, alpha) print("Сглаженный сигнал:", smoothed) # Расчет разностей avg, avg_sq = m1.calc_diff(data, smoothed) print(f"Средняя разность: {avg}") print(f"Средний квадрат разности: {avg_sq}") # Запись в бинарный файл with open('Res3.bin', 'wb') as f: for val in smoothed: f.write(str(val).encode() + b' ') return data, smoothed ``` Модуль 0 ``` import m2 import matplotlib.pyplot as plt # Запуск обработки original, smoothed = m2.main() # Построение графика plt.figure(figsize=(10, 5)) plt.plot(original, label='Оригинальный сигнал', alpha=0.7) plt.plot(smoothed, label='Сглаженный сигнал', linewidth=2) plt.legend() plt.grid(True) plt.title('Сравнение оригинального и сглаженного сигнала') plt.xlabel('Отсчеты') plt.ylabel('Значение') plt.show() ``` Функция для создания файлов ``` # Создание тестовых файлов import numpy as np # Файл с нормальным распределением normal_data = np.random.normal(0, 1, 50) with open('normal.txt', 'w') as f: for i, val in enumerate(normal_data): f.write(f"{val:.6f}") if (i + 1) % 5 == 0: f.write("\n") else: f.write(" ") # Файл с равномерным распределением uniform_data = np.random.uniform(-5, 5, 50) with open('uniform.txt', 'w') as f: for i, val in enumerate(uniform_data): f.write(f"{val:.6f}") if (i + 1) % 5 == 0: f.write("\n") else: f.write(" ") ``` Вывод результатов: ``` Введите имя файла: normal.txt Введите alpha (0-1): 0.5 Сглаженный сигнал: [-0.670261, -0.3351305, -0.172437, 0.08192750000000001, 0.9863485, -0.535069, -0.80004, -0.596092, 0.6928999999999998, 0.3587205, 0.683314, -1.0836384999999997, -0.4860845, 0.25966599999999995, -0.030735000000000012, 1.023866, 0.8292605, -0.18143350000000003, -0.528191, -0.8081125, 0.03021050000000003, 0.3281535, -0.2628545, -0.3015025, -0.5450295, -0.2557065, 0.381826, -0.6922195, -0.80888, 0.19050200000000006, -0.48495649999999996, 0.2784559999999999, -0.4547665, -0.864897, -0.1482445, -0.256408, 0.147435, -0.21260450000000003, -0.705056, -0.5397055, -0.0843785, -0.1958685, -0.075433, 0.21685950000000004, 0.3201535, 0.4469215, -0.691119, -0.442884, -0.055561, -0.1425625] Средняя разность: -0.09488711 Средний квадрат разности: 1.0956006793638149 ``` ![](Ris2.png)