KhatiukhinYS 4 дней назад
Родитель 1bb16f9cff
Сommit b4ce53684b

@ -0,0 +1,123 @@
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
```

@ -0,0 +1,18 @@
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)

@ -0,0 +1,23 @@
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

@ -0,0 +1,51 @@
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
Загрузка…
Отмена
Сохранить