форкнуто от main/python-labs
Родитель
150fe9efbb
Сommit
82aeccbc85
|
После Ширина: | Высота: | Размер: 57 KiB |
|
После Ширина: | Высота: | Размер: 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]...
|
||||
```
|
||||
|
||||

|
||||
|
||||
Создан файл 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
|
||||
Аномалии: ()
|
||||
Аномалий нет
|
||||
```
|
||||
|
||||

|
||||
@ -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")
|
||||
Загрузка…
Ссылка в новой задаче