ответвлено от main/python-labs
report:добавлен
Этот коммит содержится в:
161
TEMA9/test9.md
Обычный файл
161
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
|
||||
```
|
||||

|
||||
Ссылка в новой задаче
Block a user