Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123 строки
5.8 KiB
Markdown

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

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
```