Files
python-labs/TEMA9/Test.md
Ksenia a37ad446ff Test
2025-12-15 11:41:15 +03:00

7.7 KiB

Индивидуальное контрольное задание по модулю 3

Зеленкина Ксения А-02-23

Задание

Вариант 8

  1. Создайте модуль М1, содержащий две функции:

-функция 1: аргументы - кортеж Х с последовательностью отсчетов некоторого сигнала и два числовых параметра Т1 и Т2; в функции должен создаваться список с индексами "аномальных" отсчетов сигнала, удовлетворяющих неравенствам X<T1 или X>T2;

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

  • запрашиваются и вводятся граничные значения Т1 и Т2 с проверкой Т1,T2;

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

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

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

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

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

Решение

Содердимое Mod0 Код:

import matplotlib.pyplot as plt
from Mod2 import process_signal

result = process_signal()
if result:
    X, X1, anomalies = result

    plt.figure(figsize=(10, 6))

    plt.subplot(2, 1, 1)
    plt.plot(X, 'b-')
    if anomalies:
        anomaly_values = [X[i] for i in anomalies]
        plt.plot(anomalies, anomaly_values, 'ro')
    plt.title('Исходный сигнал')
    plt.grid(True)

    if X1 is not None:
        plt.subplot(2, 1, 2)
        plt.plot(X1, 'g-')
        plt.title('Исправленный сигнал')
        plt.grid(True)

    plt.tight_layout()
    plt.show()

Содердимое Mod1 Код:

def find_anomalies(X, T1, T2):
    anomalies = []
    for i, value in enumerate(X):
        if value < T1 or value > T2:
            anomalies.append(i)
    return anomalies


def correct_anomalies(X, anomalies):
    if not anomalies:
        return X

    X_list = list(X)
    n = len(X_list)
    avg_value = sum(X_list) / n

    for idx in anomalies:
        if idx == 0 or idx == n - 1:
            X_list[idx] = avg_value
        else:
            X_list[idx] = (X_list[idx - 1] + X_list[idx + 1]) / 2

    return tuple(X_list)

Содердимое Mod2 Код:

import os
from Mod1 import find_anomalies, correct_anomalies


def process_signal():
    while True:
        filename = input("Введите имя файла с данными: ")
        if os.path.exists(filename):
            break
        print(f"Файл '{filename}' не найден.")

    while True:
        T1 = float(input("Введите значение T1: "))
        T2 = float(input("Введите значение T2: "))
        if T1 < T2:
            break
        print("T1 должно быть меньше T2.")

    X = []
    with open(filename, 'r') as f:
        for line in f:
            line = line.strip()
            if line:
                X.append(float(line))

    X_tuple = tuple(X)

    anomalies = find_anomalies(X_tuple, T1, T2)
    print(f"Найдено аномальных отсчетов: {len(anomalies)}")
    print(f"Индексы: {anomalies}")

    if anomalies:
        X1_tuple = correct_anomalies(X_tuple, anomalies)

        with open('Res33.txt', 'w') as f:
            f.write(f"X: {X_tuple}\nX1: {X1_tuple}\nИндексы: {anomalies}\nT1={T1}, T2={T2}")

        return X_tuple, X1_tuple, anomalies
    else:
        print("Аномальные отсчеты отсутствуют.")
        return X_tuple, None, anomalies

process_signal()

Содердимое Test Код:

import numpy as np


def create_test_file(filename="signal_data.bin", n=50, mean=10, std=5):
    data = np.random.normal(mean, std, n)

    with open(filename, 'w') as f:
        for value in data:
            f.write(f"{value}\n")

    print(f"Файл '{filename}' создан.")

create_test_file()

Запуск Test.py Вывод:

Файл 'signal_data.bin' создан.

Запуск Mod0 (T1 = 5, T2 = 18) Вывод:

Введите имя файла с данными: signal_data.bin
Введите значение T1: 5
Введите значение T2: 18
Найдено аномальных отсчетов: 14
Индексы: [1, 2, 5, 8, 10, 18, 24, 30, 31, 35, 40, 44, 45, 47]

Cписок "аномальных отсчетов не пустой => записываем в текстовый файл Res33.txt Содержимое Res33:

Запуск Mod0 (T1 = -20, T2 = 50) Вывод:

Введите имя файла с данными: signal_data.bin
Введите значение T1: -20
Введите значение T2: 50
Найдено аномальных отсчетов: 0
Индексы: []
Аномальные отсчеты отсутствуют.

Если в поле "Введите имя файла с данными: " мы ничего не введём. Программа повторит запрос. Вывод:

Введите имя файла с данными: 
Файл '' не найден.
Введите имя файла с данными: