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

7.2 KiB

Тест по модулю 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]), а если "аномальным" окажется последний элемент, то его значение заменяется на значение предпоследнего элемента.

  1. Создайте еще один модуль М2, в котором должны выполняться операции:
  • запрашивается и вводится имя текстового файла со значениями сигнала; проверяется наличие файла и при отсутствии - повторение запроса;

  • из указанного файла считывается список Х с сигналом, причем в строках файла может быть разное число отсчетов сигнала;

  • запрашиваются и вводятся граничные значения М1 и М2 (с проверкой: М1<M2);

  • с применением функции 1 создается кортеж с индексами "аномальных" отсчетов; результат отображается на экране;

  • если кортеж "аномальных" отсчетов не пустой, то с применением функции 2 создается список Х1 с "исправленным" сигналом, отображается на экране и записывается в бинарный файл Res44.bin; в ином случае выдается сообщение об отсутствии "аномальных" отсчетов.

  1. Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика сигналы Х и Х1.

  2. Подготовьте текстовый файл, в который запишите 50 случайных, нормально распределенных чисел с математическим ожиданием 10 и стандартным отклонением 5. Проведите 2 расчета по программе с использованием этого файла: в первом расчете задайте М1=-2, М2=5, а во втором - М1=-20, М2=50.

MO.py:

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:

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:

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

Ответ программы:

Имя файла: 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

Создан файл Res44.bin:

-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

Ответ программы:

Имя файла: data.txt
Прочитано 50 значений
M1: -20
M2: 50
Аномалии: ()
Аномалий нет

График2