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

7.9 KiB

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

  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.

Решение

Модуль 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()

Результат

Для -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

alt text

Для -20 и 50:


Введите имя текстового файла с сигналом: signal.txt
Введите M1 (нижняя граница разности): -20
Введите M2 (верхняя граница разности, M2 > M1): 50
Аномальные индексы: ()
Аномальных отсчётов не обнаружено.

alt text