|
|
M3_9
|
|
|
|
|
|
1) Создайте модуль М1, содержащий две функции:
|
|
|
|
|
|
- функция 1: аргументы - список Х с последовательностью отсчетов некоторого сигнала и два числовых параметра:М1 и М2; в функции должен создаваться кортеж К с индексами "аномальных" отсчетов сигнала, для которых выполняются неравенства: X[i]-X[i-1]<M1 или X[i]-X[i-1]>M2.
|
|
|
|
|
|
- функция 2: аргументы - список Х с отсчетами сигнала и кортеж К с индексами "аномальных" отсчетов; в функции должен создаваться новый список Х1, в котором элементы совпадают с элементами из Х, если те не являются "аномальными", а элементы из списка К заменяются на X[i]=0.5*(X[i-1]+X[i+1]), а если "аномальным" окажется последний элемент, то его значение заменяется на значение предпоследнего элемента.
|
|
|
|
|
|
2) Создайте еще один модуль М2, в котором должны выполняться операции:
|
|
|
|
|
|
- запрашивается и вводится имя текстового файла со значениями сигнала; проверяется наличие файла и при отсутствии - повторение запроса;
|
|
|
|
|
|
- из указанного файла считывается список Х с сигналом, причем в строках файла может быть разное число отсчетов сигнала;
|
|
|
|
|
|
- запрашиваются и вводятся граничные значения М1 и М2 (с проверкой: М1<M2);
|
|
|
|
|
|
- с применением функции 1 создается кортеж с индексами "аномальных" отсчетов; результат отображается на экране;
|
|
|
|
|
|
- если кортеж "аномальных" отсчетов не пустой, то с применением функции 2 создается список Х1 с "исправленным" сигналом, отображается на экране и записывается в бинарный файл Res44.bin; в ином случае выдается сообщение об отсутствии "аномальных" отсчетов.
|
|
|
|
|
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика сигналы Х и Х1.
|
|
|
|
|
|
4) Подготовьте текстовый файл, в который запишите 50 случайных, нормально распределенных чисел с математическим ожиданием 10 и стандартным отклонением 5. Проведите 2 расчета по программе с использованием этого файла.
|
|
|
```py
|
|
|
import matplotlib.pyplot as plt
|
|
|
from MMM2 import main_pr
|
|
|
|
|
|
def plot_signals(X, X1):
|
|
|
plt.figure()
|
|
|
plt.plot(X, label='X',marker='o', linestyle='-')
|
|
|
plt.plot(X1, label='X1',marker='s', linestyle='--')
|
|
|
plt.title('Сравнение исходного и исправленного сигналов')
|
|
|
plt.legend()
|
|
|
plt.grid(True)
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
result = main_pr()
|
|
|
if result:
|
|
|
X, X1 = result if result[1] is not None else (result[0], None)
|
|
|
plot_signals(X, X1)
|
|
|
```
|
|
|
```py
|
|
|
import os
|
|
|
import pickle
|
|
|
from MMM1 import find_anomal, cor_anom
|
|
|
|
|
|
def read_sig(filename):
|
|
|
numbers = []
|
|
|
try:
|
|
|
with open(filename, 'r', encoding='utf-8') as f:
|
|
|
for line in f:
|
|
|
parts = line.strip().split()
|
|
|
for part in parts:
|
|
|
try:
|
|
|
numbers.append(float(part))
|
|
|
except ValueError:
|
|
|
continue
|
|
|
except Exception as e:
|
|
|
print(f"Ошибка чтения файла: {e}")
|
|
|
return None
|
|
|
return numbers
|
|
|
|
|
|
def main_pr():
|
|
|
while True:
|
|
|
filename = input("Введите имя текстового файла с сигналом: ")
|
|
|
if os.path.isfile(filename):
|
|
|
break
|
|
|
print("Файл не найден. Попробуйте снова.")
|
|
|
|
|
|
X = read_sig(filename)
|
|
|
if X is None:
|
|
|
print("Не удалось прочитать сигнал.")
|
|
|
return
|
|
|
|
|
|
M1 = float(input("Введите M1 (нижняя граница): "))
|
|
|
M2 = float(input("Введите M2 (верхняя граница): "))
|
|
|
|
|
|
anomalies = find_anomal(X, M1, M2)
|
|
|
if anomalies:
|
|
|
print(f"Индексы аномальных отсчетов: {anomalies}")
|
|
|
else:
|
|
|
print("Индексов аномальных отcчетов нет")
|
|
|
|
|
|
if anomalies:
|
|
|
X1 = cor_anom(X, anomalies)
|
|
|
|
|
|
with open('Res44.bin', 'wb') as f:
|
|
|
pickle.dump(X1, f)
|
|
|
print("Результат сохранён в файл Res44.bin")
|
|
|
else:
|
|
|
print("Аномальных отсчетов не обнаружено.")
|
|
|
|
|
|
return X, X1 if anomalies else None
|
|
|
|
|
|
```
|
|
|
```py
|
|
|
def find_anomal(X, M1, M2):
|
|
|
|
|
|
K = []
|
|
|
for i in range(1, len(X)):
|
|
|
diff = X[i] - X[i - 1]
|
|
|
if diff < M1 or diff > M2:
|
|
|
K.append(i)
|
|
|
return tuple(K)
|
|
|
|
|
|
def cor_anom(X, K):
|
|
|
|
|
|
X1 = X.copy()
|
|
|
n = len(X)
|
|
|
|
|
|
for idx in K:
|
|
|
if idx == n - 1:
|
|
|
X1[idx] = X[idx - 1]
|
|
|
elif idx == 0:
|
|
|
X1[idx] = X[idx + 1]
|
|
|
else:
|
|
|
X1[idx] = 0.5 * (X[idx - 1] + X[idx + 1])
|
|
|
|
|
|
return X1
|
|
|
|
|
|
``` |