EfremovSI 4 недель назад
Родитель 7b18a10bb1
Сommit 8cb32abf61

@ -0,0 +1,174 @@
# Индивидуальное контрольное задание по теме 9
Ефремов Станислав, А-02-23
## Задание
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 расчета по программе с использованием этого файла: в первом расчете задайте М1=-2, М2=5, а во втором - М1=-20, М2=50.
## Решение
### Модуль 1
```py
def find_anomalous_indices(X, M1, M2):
indices = []
for i in range(1, len(X)):
diff = X[i] - X[i-1]
if diff < M1 or diff > M2:
indices.append(i)
return tuple(indices)
def correct_anomalies(X, K):
X1 = X.copy()
for idx in K:
if idx == len(X) - 1:
X1[idx] = X1[idx - 1]
else:
X1[idx] = 0.5 * (X1[idx - 1] + X1[idx + 1])
return X1
```
### Модуль 2
```py
import os
import sys
import pickle
def run_M2():
while True:
filename = input("Введите имя текстового файла с сигналом: ").strip()
if os.path.isfile(filename):
break
X = []
with open(filename, 'r') as f:
for line in f:
parts = line.strip().split()
for p in parts:
X.append(float(p))
while True:
M1 = float(input("Введите M1 (нижняя граница разности): "))
M2 = float(input("Введите M2 (верхняя граница разности, M2 > M1): "))
if M1 < M2:
break
else:
print("M1 должно быть меньше M2.")
from M1 import find_anomalous_indices, correct_anomalies
K = find_anomalous_indices(X, M1, M2)
print(f"Аномальные индексы: {K}")
if K:
X1 = correct_anomalies(X, K)
print("Исправленный сигнал:", X1)
with open("Res44.bin", "wb") as f:
pickle.dump(X1, f)
print("Результат записан в Res44.bin")
else:
print("Аномальных отсчётов не обнаружено.")
return X, X1 if K else X
```
### Модуль 0
```py
import pylab
from M2 import run_M2
def main():
X, X1 = run_M2()
pylab.figure(figsize=(10, 5))
pylab.subplot(1, 2, 1)
pylab.plot(X, label='Исходный сигнал')
pylab.title("Исходный сигнал")
pylab.xlabel("Отсчёты")
pylab.ylabel("Значение")
pylab.grid(True)
pylab.subplot(1, 2, 2)
pylab.plot(X1, label='Исправленный сигнал', color='orange')
pylab.title("Исправленный сигнал")
pylab.xlabel("Отсчёты")
pylab.ylabel("Значение")
pylab.grid(True)
pylab.tight_layout()
pylab.show()
if __name__ == "__main__":
main()
```
## Результат
### Для -2 и 5:
```py
Введите имя текстового файла с сигналом: signal.txt
Введите M1 (нижняя граница разности): -2
Введите M2 (верхняя граница разности, M2 > M1): 5
Аномальные индексы: (4, 6, 11, 12, 13, 14, 15, 19, 21, 23, 24, 25, 26, 27, 29, 31, 32, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47)
Исправленный сигнал: [4.263134009624702, 4.067283548723314, 4.874920842655541, 4.834128754109237, 8.223862521322928, 11.61359628853662, 10.259560286375322, 8.905524284214025, 8.186641831318802, 8.638222773625724, 10.700010550793879, 12.779448770191685, 8.629985270429243, 9.424308136414886, 8.760419982249502, 9.797062915592713, 10.833705848935924, 9.862509524620615, 11.252167038027647, 12.422198441999871, 13.592229845972096, 10.572927730780062, 7.553625615588027, 7.133718458186862, 9.520052608400205, 9.619255895493783, 6.667092820033337, 5.8050169142673225, 4.942941008501308, 8.946793175470068, 12.950645342438829, 11.648800239430907, 12.308287984866364, 12.96777573030182, 13.306115816113852, 6.713448306681809, 8.251140355134947, 9.870702494815166, 11.490264634495386, 6.833826225314228, 7.604423745564782, 10.493832859781548, 7.59146239455013, 11.577494034371783, 9.08507549520261, 16.320693167525047, 10.352440652123295, 8.987414956427836, 7.622389260732377, 11.17003135779134]
Результат записан в Res44.bin
```
![alt text](-2and5.png)
### Для -20 и 50:
```py
Введите имя текстового файла с сигналом: signal.txt
Введите M1 (нижняя граница разности): -20
Введите M2 (верхняя граница разности, M2 > M1): 50
Аномальные индексы: ()
Аномальных отсчётов не обнаружено.
```
![alt text](-20and50.png)
Загрузка…
Отмена
Сохранить