TerekhovFV 1 месяц назад
Родитель 150fe9efbb
Сommit 82aeccbc85

Двоичные данные
TEMA9/Graf1.png

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

После

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

Двоичные данные
TEMA9/Graf2.png

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

После

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

@ -0,0 +1,17 @@
import matplotlib.pyplot as plt
from M2 import main
X, X1 = main()
if X1:
plt.figure(figsize=(10, 5))
plt.plot(X, 'b-', label='Исходный', alpha=0.7)
plt.plot(X1, 'r-', label='Исправленный', linewidth=2)
plt.legend()
plt.grid(True)
plt.show()
else:
plt.plot(X, 'b-')
plt.title("Нет аномалий для исправления")
plt.grid(True)
plt.show()

@ -0,0 +1,16 @@
def find_anomalous(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 correct_signal(X, K):
X1 = X.copy()
for i in K:
if i == len(X)-1:
X1[i] = X[i-1]
else:
X1[i] = 0.5 * (X[i-1] + X[i+1])
return X1

@ -0,0 +1,53 @@
import os
from M1 import find_anomalous, correct_signal
def get_file():
while True:
name = input("Имя файла: ")
if (os.getcwd() + "/TEMA9/" + name):
return (os.getcwd() + "/TEMA9/" + name)
print("Файл не найден")
def get_M():
while True:
try:
M1 = float(input("M1: "))
M2 = float(input("M2: "))
if M1 < M2:
return M1, M2
print("M1 должно быть < M2")
except:
print("Введите числа")
def read_file(filename):
X = []
with open(filename, 'r') as f:
for line in f:
for num in line.split():
X.append(float(num))
return X
def save_binary(X1):
with open(os.getcwd() + "/TEMA9/Res44.bin", 'wb') as f:
for val in X1:
f.write(str(val).encode() + b' ')
def main():
filename = get_file()
X = read_file(filename)
print(f"Прочитано {len(X)} значений")
M1, M2 = get_M()
K = find_anomalous(X, M1, M2)
print(f"Аномалии: {K}")
if K:
X1 = correct_signal(X, K)
print(f"Исправлено: {X1[:10]}...")
save_binary(X1)
else:
print("Аномалий нет")
return X, X1 if K else None

@ -0,0 +1 @@
-0.6237815140713643 8.334758413952665 8.676761749029652 16.311955261228825 10.049076856969142 11.629416687369641 9.707997133988439 8.474627629385962 6.672229105628724 4.869830581871486 10.849253911018645 15.007334330751284 15.685684131327989 7.276761757100063 14.936309642961522 7.71080097037114 8.84174165046468 5.40753722882943 0.4706925635385968 4.260279922438404 12.093061250735083 6.9658395175116095 7.603305298422549 8.240771079333488 11.582777804202491 15.70265791101874 13.69355803793308 11.825229995716477 8.924432404604957 6.236897247630704 7.718515343413342 14.138162005578465 10.369381683301384 10.469410599944988 12.440727080674186 5.744189038187823 17.191426811028236 6.9476582691774915 12.497727637752119 8.705607846445806 5.5468985368821375 8.65552847128108 6.8664456002207395 8.650972345948677 10.520154831433961 12.389337316919246 12.27492795757532 12.160518598231395 11.04920237433025 9.937886150429105

@ -0,0 +1,10 @@
-0.6237815140713643 8.196736422711934 17.293298341976694 9.15678707534737 15.330612180480957
10.941366638590914 7.928221194258327 8.474627629385962 5.301678717071231 4.869830581871486
20.53836519392446 16.828677240165803 9.47630346757811 14.542691022490175 5.077220046622017
15.329928263432869 10.344381894120263 2.353555037496492 0.4706925635385968 17.22028298395856
8.04986728133821 6.9658395175116095 4.216213077021437 8.240771079333488 17.7117577841044
14.924784529071495 13.69355803793308 11.825229995716477 0.5766257954235954 6.023634813493437
11.897168699837813 9.413395873333247 16.379155311319117 11.325367493269521 4.559665888570858
13.556086668078851 6.9287121878047895 20.826766953977618 6.966604350550193 4.168688321526619
10.44461134234142 6.925108752237655 6.8664456002207395 8.650972345948677 14.378168902408854
12.389337316919246 9.46007954217064 12.160518598231395 5.5799479802517356 9.937886150429105

@ -0,0 +1,158 @@
# Тест по модулю 3.
***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.
MO.py:
```python
import matplotlib.pyplot as plt
from M2 import main
X, X1 = main()
if X1:
plt.figure(figsize=(10, 5))
plt.plot(X, 'b-', label='Исходный', alpha=0.7)
plt.plot(X1, 'r-', label='Исправленный', linewidth=2)
plt.legend()
plt.grid(True)
plt.show()
else:
plt.plot(X, 'b-')
plt.title("Нет аномалий для исправления")
plt.grid(True)
plt.show()
```
M1.py:
```python
def find_anomalous(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 correct_signal(X, K):
X1 = X.copy()
for i in K:
if i == len(X)-1:
X1[i] = X[i-1]
else:
X1[i] = 0.5 * (X[i-1] + X[i+1])
return X1
```
M2.py:
```python
import os
from M1 import find_anomalous, correct_signal
def get_file():
while True:
name = input("Имя файла: ")
if (os.getcwd() + "/TEMA9/" + name):
return (os.getcwd() + "/TEMA9/" + name)
print("Файл не найден")
def get_M():
while True:
try:
M1 = float(input("M1: "))
M2 = float(input("M2: "))
if M1 < M2:
return M1, M2
print("M1 должно быть < M2")
except:
print("Введите числа")
def read_file(filename):
X = []
with open(filename, 'r') as f:
for line in f:
for num in line.split():
X.append(float(num))
return X
def save_binary(X1):
with open("Res44.bin", 'wb') as f:
for val in X1:
f.write(str(val).encode() + b' ')
def main():
filename = get_file()
X = read_file(filename)
print(f"Прочитано {len(X)} значений")
M1, M2 = get_M()
K = find_anomalous(X, M1, M2)
print(f"Аномалии: {K}")
if K:
X1 = correct_signal(X, K)
print(f"Исправлено: {X1[:10]}...")
save_binary(X1)
else:
print("Аномалий нет")
return X, X1 if K else None
```
## Тест программы.
**М1=-2, М2=5**
Ответ программы:
```shell
Имя файла: data.txt
Прочитано 50 значений
M1: -2
M2: 5
Аномалии: (1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 48)
Исправлено: [-0.6237815140713643, 8.334758413952665, 8.676761749029652, 16.311955261228825, 10.049076856969142, 11.629416687369641, 9.707997133988439, 8.474627629385962, 6.672229105628724, 4.869830581871486]...
```
![График1](Graf1.png)
Создан файл Res44.bin:
```text
-0.6237815140713643 8.334758413952665 8.676761749029652 16.311955261228825 10.049076856969142 11.629416687369641 9.707997133988439 8.474627629385962 6.672229105628724 4.869830581871486 10.849253911018645 15.007334330751284 15.685684131327989 7.276761757100063 14.936309642961522 7.71080097037114 8.84174165046468 5.40753722882943 0.4706925635385968 4.260279922438404 12.093061250735083 6.9658395175116095 7.603305298422549 8.240771079333488 11.582777804202491 15.70265791101874 13.69355803793308 11.825229995716477 8.924432404604957 6.236897247630704 7.718515343413342 14.138162005578465 10.369381683301384 10.469410599944988 12.440727080674186 5.744189038187823 17.191426811028236 6.9476582691774915 12.497727637752119 8.705607846445806 5.5468985368821375 8.65552847128108 6.8664456002207395 8.650972345948677 10.520154831433961 12.389337316919246 12.27492795757532 12.160518598231395 11.04920237433025 9.937886150429105
```
**М1=-20, М2=50**
Ответ программы:
```shell
Имя файла: data.txt
Прочитано 50 значений
M1: -20
M2: 50
Аномалии: ()
Аномалий нет
```
![График2](Graf2.png)

@ -0,0 +1,6 @@
import random
import os
with open(os.getcwd() + "/TEMA9/data.txt", "w") as f:
for i in range(10):
row = [str(10 + random.gauss(0, 5)) for _ in range(5)]
f.write(" ".join(row) + "\n")
Загрузка…
Отмена
Сохранить