Пользователь № 6 аудитории Ж-115 1 месяц назад
Родитель 3da1dde586
Сommit 13f8ef0c17

Двоичные данные
TEMA9/-20and50.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 80 KiB

Двоичные данные
TEMA9/-2and5.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 79 KiB

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

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

@ -0,0 +1,51 @@
# M2.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

Двоичные данные
TEMA9/Res44.bin

Двоичный файл не отображается.

@ -0,0 +1,10 @@
4.263134009624702 4.067283548723314 4.874920842655541 4.834128754109237 10.405920382638437
11.61359628853662 7.593559339199566 8.905524284214025 8.186641831318802 8.638222773625724
10.700010550793879 5.937964750303343 14.858886989589493 4.480521770666802 10.21863100240053
8.09653182808412 10.833705848935924 9.862509524620615 11.252167038027647 8.640348799010265
13.592229845972096 4.883380805635669 7.553625615588027 13.512737353500533 6.7138113007856965
11.906386758613547 9.718459182587361 3.71492974457289 4.942941008501308 10.223575151953712
12.950645342438829 5.157741827157216 10.346955136422984 12.96777573030182 13.306115816113852
8.834837767997525 0.12078079724976654 9.788832403588085 11.490264634495386 5.082665741299458
2.17738781613307 8.375021265815336 13.383241973998315 4.689091929318712 15.563525674193436
6.592656956033435 23.556310839847484 4.384188136721545 7.622389260732377 11.17003135779134

@ -0,0 +1,196 @@
# Индивидуальное контрольное задание по теме 9
Голощапов Д.Е., А-01-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
```
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
```
import os
import sys
import pickle
def run_M2():
while True:
filename = input("Введите имя текстового файла с сигналом: ").strip()
if os.path.isfile(filename):
break
else:
print('Файл не найден, повторите ввод')
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
```
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()
```
```
"""
Создание тестового файла с нормально распределёнными числами.
"""
import numpy as np
# Генерация 50 чисел с нормальным распределением
signal = np.random.normal(loc=10, scale=5, size=50)
# Запись в файл
with open("signal.txt", "w") as f:
for i, value in enumerate(signal):
f.write(f"{value:.4f}")
if (i + 1) % 10 == 0: # 10 значений в строке
f.write("\n")
else:
f.write(" ")
print(f"Создан файл signal.txt с {len(signal)} значениями")
## Результат
### Для -2 и 5:
```
Введите имя текстового файла с сигналом: 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
```
![](-2and5.png)
### Для -20 и 50:
```
Введите имя текстового файла с сигналом: signal.txt
Введите M1 (нижняя граница разности): -20
Введите M2 (верхняя граница разности, M2 > M1): 50
Аномальные индексы: ()
Аномальных отсчётов не обнаружено.
```
![](-20and50.png)
Загрузка…
Отмена
Сохранить