ответвлено от main/python-labs
Test
Этот коммит содержится в:
25
TEMA9/Mod0.py
Обычный файл
25
TEMA9/Mod0.py
Обычный файл
@@ -0,0 +1,25 @@
|
||||
import matplotlib.pyplot as plt
|
||||
from Mod2 import process_signal
|
||||
|
||||
result = process_signal()
|
||||
if result:
|
||||
X, X1, anomalies = result
|
||||
|
||||
plt.figure(figsize=(10, 6))
|
||||
|
||||
plt.subplot(2, 1, 1)
|
||||
plt.plot(X, 'b-')
|
||||
if anomalies:
|
||||
anomaly_values = [X[i] for i in anomalies]
|
||||
plt.plot(anomalies, anomaly_values, 'ro')
|
||||
plt.title('Исходный сигнал')
|
||||
plt.grid(True)
|
||||
|
||||
if X1 is not None:
|
||||
plt.subplot(2, 1, 2)
|
||||
plt.plot(X1, 'g-')
|
||||
plt.title('Исправленный сигнал')
|
||||
plt.grid(True)
|
||||
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
23
TEMA9/Mod1.py
Обычный файл
23
TEMA9/Mod1.py
Обычный файл
@@ -0,0 +1,23 @@
|
||||
def find_anomalies(X, T1, T2):
|
||||
anomalies = []
|
||||
for i, value in enumerate(X):
|
||||
if value < T1 or value > T2:
|
||||
anomalies.append(i)
|
||||
return anomalies
|
||||
|
||||
|
||||
def correct_anomalies(X, anomalies):
|
||||
if not anomalies:
|
||||
return X
|
||||
|
||||
X_list = list(X)
|
||||
n = len(X_list)
|
||||
avg_value = sum(X_list) / n
|
||||
|
||||
for idx in anomalies:
|
||||
if idx == 0 or idx == n - 1:
|
||||
X_list[idx] = avg_value
|
||||
else:
|
||||
X_list[idx] = (X_list[idx - 1] + X_list[idx + 1]) / 2
|
||||
|
||||
return tuple(X_list)
|
||||
41
TEMA9/Mod2.py
Обычный файл
41
TEMA9/Mod2.py
Обычный файл
@@ -0,0 +1,41 @@
|
||||
import os
|
||||
from Mod1 import find_anomalies, correct_anomalies
|
||||
|
||||
|
||||
def process_signal():
|
||||
while True:
|
||||
filename = input("Введите имя файла с данными: ")
|
||||
if os.path.exists(filename):
|
||||
break
|
||||
print(f"Файл '{filename}' не найден.")
|
||||
|
||||
while True:
|
||||
T1 = float(input("Введите значение T1: "))
|
||||
T2 = float(input("Введите значение T2: "))
|
||||
if T1 < T2:
|
||||
break
|
||||
print("T1 должно быть меньше T2.")
|
||||
|
||||
X = []
|
||||
with open(filename, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
X.append(float(line))
|
||||
|
||||
X_tuple = tuple(X)
|
||||
|
||||
anomalies = find_anomalies(X_tuple, T1, T2)
|
||||
print(f"Найдено аномальных отсчетов: {len(anomalies)}")
|
||||
print(f"Индексы: {anomalies}")
|
||||
|
||||
if anomalies:
|
||||
X1_tuple = correct_anomalies(X_tuple, anomalies)
|
||||
|
||||
with open('Res33.txt', 'w') as f:
|
||||
f.write(f"X: {X_tuple}\nX1: {X1_tuple}\nИндексы: {anomalies}\nT1={T1}, T2={T2}")
|
||||
|
||||
return X_tuple, X1_tuple, anomalies
|
||||
else:
|
||||
print("Аномальные отсчеты отсутствуют.")
|
||||
return X_tuple, None, anomalies
|
||||
195
TEMA9/Test.md
Обычный файл
195
TEMA9/Test.md
Обычный файл
@@ -0,0 +1,195 @@
|
||||
# Индивидуальное контрольное задание по модулю 3
|
||||
|
||||
Зеленкина Ксения А-02-23
|
||||
## Задание
|
||||
Вариант 8
|
||||
1) Создайте модуль М1, содержащий две функции:
|
||||
|
||||
-функция 1: аргументы - кортеж Х с последовательностью отсчетов некоторого сигнала и два числовых параметра Т1 и Т2; в функции должен создаваться список с индексами "аномальных" отсчетов сигнала, удовлетворяющих неравенствам X<T1 или X>T2;
|
||||
|
||||
- функция 2: аргументы - кортеж Х с отсчетами сигнала и список "аномальных" значений; в функции должен создаваться новый кортеж Х1, в котором элементы, не являющиеся "аномальными", совпадают с соответствующими элементами из Х, а "аномальные" значения заменяются по правилу: если это первый или последний элемент, то он заменяется на среднее значение по кортежу Х, а остальные - заменяются на полусумму соседних по индексу элементов.
|
||||
|
||||
2) Создайте еще один модуль М2, в котором должны выполняться операции:
|
||||
|
||||
- запрашивается и вводится имя бинарного файла с данными (кортежем); проверяется наличие файла и при отсутствии - повторение запроса;
|
||||
|
||||
- запрашиваются и вводятся граничные значения Т1 и Т2 с проверкой Т1,T2;
|
||||
|
||||
- из указанного файла считывается кортеж Х с сигналом;
|
||||
|
||||
- с применением функции 1 создается список с индексами "аномальных" отсчетов; результат отображается на экране;
|
||||
|
||||
- если список "аномальных отсчетов не пустой, то с применением функции 2 создается кортеж Х1 с "исправленным" сигналом, отображается на экране и записывается в текстовый файл Res33.txt; в ином случае выдается сообщение об отсутствии "аномальных" отсчетов.
|
||||
|
||||
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика сигналы Х и Х1.
|
||||
|
||||
4) Подготовьте бинарный файл, в который запишите кортеж Х с 50 случайными, нормально распределенными числами с математическим ожиданием 10 и стандартным отклонением 5. Проведите 2 расчета по программе с использованием этого файла: в первом расчете задайте Т1=5, Т2=18, а во втором - Т1=-20, Т2=50.
|
||||
|
||||
|
||||
|
||||
## Решение
|
||||
Содердимое Mod0
|
||||
_Код:_
|
||||
```py
|
||||
import matplotlib.pyplot as plt
|
||||
from Mod2 import process_signal
|
||||
|
||||
result = process_signal()
|
||||
if result:
|
||||
X, X1, anomalies = result
|
||||
|
||||
plt.figure(figsize=(10, 6))
|
||||
|
||||
plt.subplot(2, 1, 1)
|
||||
plt.plot(X, 'b-')
|
||||
if anomalies:
|
||||
anomaly_values = [X[i] for i in anomalies]
|
||||
plt.plot(anomalies, anomaly_values, 'ro')
|
||||
plt.title('Исходный сигнал')
|
||||
plt.grid(True)
|
||||
|
||||
if X1 is not None:
|
||||
plt.subplot(2, 1, 2)
|
||||
plt.plot(X1, 'g-')
|
||||
plt.title('Исправленный сигнал')
|
||||
plt.grid(True)
|
||||
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
```
|
||||
|
||||
Содердимое Mod1
|
||||
_Код:_
|
||||
```py
|
||||
def find_anomalies(X, T1, T2):
|
||||
anomalies = []
|
||||
for i, value in enumerate(X):
|
||||
if value < T1 or value > T2:
|
||||
anomalies.append(i)
|
||||
return anomalies
|
||||
|
||||
|
||||
def correct_anomalies(X, anomalies):
|
||||
if not anomalies:
|
||||
return X
|
||||
|
||||
X_list = list(X)
|
||||
n = len(X_list)
|
||||
avg_value = sum(X_list) / n
|
||||
|
||||
for idx in anomalies:
|
||||
if idx == 0 or idx == n - 1:
|
||||
X_list[idx] = avg_value
|
||||
else:
|
||||
X_list[idx] = (X_list[idx - 1] + X_list[idx + 1]) / 2
|
||||
|
||||
return tuple(X_list)
|
||||
```
|
||||
|
||||
Содердимое Mod2
|
||||
_Код:_
|
||||
```py
|
||||
import os
|
||||
from Mod1 import find_anomalies, correct_anomalies
|
||||
|
||||
|
||||
def process_signal():
|
||||
while True:
|
||||
filename = input("Введите имя файла с данными: ")
|
||||
if os.path.exists(filename):
|
||||
break
|
||||
print(f"Файл '{filename}' не найден.")
|
||||
|
||||
while True:
|
||||
T1 = float(input("Введите значение T1: "))
|
||||
T2 = float(input("Введите значение T2: "))
|
||||
if T1 < T2:
|
||||
break
|
||||
print("T1 должно быть меньше T2.")
|
||||
|
||||
X = []
|
||||
with open(filename, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
X.append(float(line))
|
||||
|
||||
X_tuple = tuple(X)
|
||||
|
||||
anomalies = find_anomalies(X_tuple, T1, T2)
|
||||
print(f"Найдено аномальных отсчетов: {len(anomalies)}")
|
||||
print(f"Индексы: {anomalies}")
|
||||
|
||||
if anomalies:
|
||||
X1_tuple = correct_anomalies(X_tuple, anomalies)
|
||||
|
||||
with open('Res33.txt', 'w') as f:
|
||||
f.write(f"X: {X_tuple}\nX1: {X1_tuple}\nИндексы: {anomalies}\nT1={T1}, T2={T2}")
|
||||
|
||||
return X_tuple, X1_tuple, anomalies
|
||||
else:
|
||||
print("Аномальные отсчеты отсутствуют.")
|
||||
return X_tuple, None, anomalies
|
||||
|
||||
process_signal()
|
||||
```
|
||||
|
||||
Содердимое Test
|
||||
_Код:_
|
||||
```py
|
||||
import numpy as np
|
||||
|
||||
|
||||
def create_test_file(filename="signal_data.bin", n=50, mean=10, std=5):
|
||||
data = np.random.normal(mean, std, n)
|
||||
|
||||
with open(filename, 'w') as f:
|
||||
for value in data:
|
||||
f.write(f"{value}\n")
|
||||
|
||||
print(f"Файл '{filename}' создан.")
|
||||
|
||||
create_test_file()
|
||||
```
|
||||
|
||||
Запуск Test.py
|
||||
_Вывод:_
|
||||
```py
|
||||
Файл 'signal_data.bin' создан.
|
||||
```
|
||||
|
||||
Запуск Mod0 (T1 = 5, T2 = 18)
|
||||
_Вывод:_
|
||||
```py
|
||||
Введите имя файла с данными: signal_data.bin
|
||||
Введите значение T1: 5
|
||||
Введите значение T2: 18
|
||||
Найдено аномальных отсчетов: 14
|
||||
Индексы: [1, 2, 5, 8, 10, 18, 24, 30, 31, 35, 40, 44, 45, 47]
|
||||
```
|
||||
|
||||
<img src = "./photo2.png" width="500" height="300" align="center">
|
||||
|
||||
Cписок "аномальных отсчетов не пустой => записываем в текстовый файл Res33.txt
|
||||
Содержимое Res33:
|
||||
<img src = "./photo3.png" width="500" height="300" align="center">
|
||||
|
||||
Запуск Mod0 (T1 = -20, T2 = 50)
|
||||
_Вывод:_
|
||||
```py
|
||||
Введите имя файла с данными: signal_data.bin
|
||||
Введите значение T1: -20
|
||||
Введите значение T2: 50
|
||||
Найдено аномальных отсчетов: 0
|
||||
Индексы: []
|
||||
Аномальные отсчеты отсутствуют.
|
||||
```
|
||||
<img src = "./photo4.png" width="500" height="300" align="center">
|
||||
|
||||
Если в поле "Введите имя файла с данными: " мы ничего не введём. Программа повторит запрос.
|
||||
_Вывод:_
|
||||
```py
|
||||
Введите имя файла с данными:
|
||||
Файл '' не найден.
|
||||
Введите имя файла с данными:
|
||||
```
|
||||
15
TEMA9/Test.py
Обычный файл
15
TEMA9/Test.py
Обычный файл
@@ -0,0 +1,15 @@
|
||||
import numpy as np
|
||||
|
||||
|
||||
def create_test_file(filename="signal_data.bin", n=50, mean=10, std=5):
|
||||
data = np.random.normal(mean, std, n)
|
||||
|
||||
with open(filename, 'w') as f:
|
||||
for value in data:
|
||||
f.write(f"{value}\n")
|
||||
|
||||
print(f"Файл '{filename}' создан.")
|
||||
print(f"Первые 10 значений: {data[:10]}")
|
||||
|
||||
|
||||
create_test_file()
|
||||
Двоичные данные
TEMA9/photo2.png
Обычный файл
Двоичные данные
TEMA9/photo2.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 106 KiB |
Двоичные данные
TEMA9/photo3.png
Обычный файл
Двоичные данные
TEMA9/photo3.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 295 KiB |
Двоичные данные
TEMA9/photo4.png
Обычный файл
Двоичные данные
TEMA9/photo4.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 60 KiB |
Ссылка в новой задаче
Block a user