diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..365a524 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,16 @@ +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() diff --git a/TEMA9/Res3.bin b/TEMA9/Res3.bin new file mode 100644 index 0000000..f70b5f6 --- /dev/null +++ b/TEMA9/Res3.bin @@ -0,0 +1 @@ +-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 \ No newline at end of file diff --git a/TEMA9/Ris2.png b/TEMA9/Ris2.png new file mode 100644 index 0000000..204cf34 Binary files /dev/null and b/TEMA9/Ris2.png differ diff --git a/TEMA9/file.py b/TEMA9/file.py new file mode 100644 index 0000000..a39c488 --- /dev/null +++ b/TEMA9/file.py @@ -0,0 +1,22 @@ +# Создание тестовых файлов +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(" ") diff --git a/TEMA9/m1.py b/TEMA9/m1.py new file mode 100644 index 0000000..75ad9c5 --- /dev/null +++ b/TEMA9/m1.py @@ -0,0 +1,14 @@ +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 diff --git a/TEMA9/m2.py b/TEMA9/m2.py new file mode 100644 index 0000000..870710e --- /dev/null +++ b/TEMA9/m2.py @@ -0,0 +1,43 @@ + +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 diff --git a/TEMA9/norm.txt b/TEMA9/norm.txt new file mode 100644 index 0000000..d0e4f75 --- /dev/null +++ b/TEMA9/norm.txt @@ -0,0 +1,10 @@ +9.638 11.830 10.710 12.243 7.871 +7.217 5.605 10.074 9.701 10.770 +5.023 10.584 8.860 11.161 9.286 +11.021 7.903 9.819 6.207 9.968 +8.788 10.810 9.393 11.610 9.162 +7.474 8.723 10.834 10.409 7.644 +11.020 12.192 10.121 12.374 10.542 +10.029 10.025 10.623 12.151 11.246 +6.334 8.940 8.710 8.441 13.528 +10.549 10.758 12.828 11.604 10.078 diff --git a/TEMA9/normal.txt b/TEMA9/normal.txt new file mode 100644 index 0000000..0e78207 --- /dev/null +++ b/TEMA9/normal.txt @@ -0,0 +1,10 @@ +-0.670261 -0.344874 0.163855 1.972697 -1.070138 +-1.600080 -1.192184 1.385800 0.717441 1.366628 +-2.167277 -0.972169 0.519332 -0.061470 2.047732 +1.658521 -0.362867 -1.056382 -1.616225 0.060421 +0.656307 -0.525709 -0.603005 -1.090059 -0.511413 +0.763652 -1.384439 -1.617760 0.381004 -0.969913 +0.556912 -0.909533 -1.729794 -0.296489 -0.512816 +0.294870 -0.425209 -1.410112 -1.079411 -0.168757 +-0.391737 -0.150866 0.433719 0.640307 0.893843 +-1.382238 -0.885768 -0.111122 -0.285125 1.106464 diff --git a/TEMA9/signal.png b/TEMA9/signal.png new file mode 100644 index 0000000..0c369cf Binary files /dev/null and b/TEMA9/signal.png differ diff --git a/TEMA9/test9.md b/TEMA9/test9.md new file mode 100644 index 0000000..965af91 --- /dev/null +++ b/TEMA9/test9.md @@ -0,0 +1,161 @@ +# Индивидуальное контрольное программирование по модулю 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) \ No newline at end of file diff --git a/TEMA9/unif.txt b/TEMA9/unif.txt new file mode 100644 index 0000000..e19fa31 --- /dev/null +++ b/TEMA9/unif.txt @@ -0,0 +1,10 @@ +6.504 5.176 7.549 7.375 11.783 +0.249 11.419 18.203 14.668 15.530 +18.364 16.600 4.786 12.059 17.513 +19.179 14.152 19.548 10.217 10.704 +12.705 14.380 3.517 3.904 15.504 +17.885 16.892 16.499 9.770 9.107 +19.247 5.106 9.702 7.578 15.298 +7.972 11.782 1.254 12.395 5.167 +7.581 10.445 8.521 1.929 13.399 +8.915 11.281 1.551 14.711 5.219 diff --git a/TEMA9/uniform.txt b/TEMA9/uniform.txt new file mode 100644 index 0000000..953cb39 --- /dev/null +++ b/TEMA9/uniform.txt @@ -0,0 +1,10 @@ +4.568506 2.901916 -4.071494 -1.849086 -1.542804 +1.931241 4.325482 -1.498945 0.595658 1.085153 +4.457592 2.251341 2.166884 3.781504 -2.540791 +-0.054355 0.269635 2.912760 3.608378 -2.080063 +-4.230550 -3.332500 -3.515839 -0.935267 1.987336 +-4.190880 -3.801810 1.889535 0.119965 -3.014592 +-4.990087 3.336219 -2.988766 -1.312281 -0.644437 +1.050816 -0.784636 -3.797881 -4.924162 -0.254601 +-0.041066 -3.688233 -2.966742 -1.228369 -2.835806 +-0.350713 -0.759852 -1.346697 1.149597 0.554741