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

10 KiB

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

Володин Денис, А-02-23

##Задание

В-20

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

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

t=|M1-M2| /((C1N+С2(NN-N))/(NN-2))0.5

F=max(C1,C2)/min(C1,C2)

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

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

  • при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt.

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

  2. Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.:

-440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993

Решение

Модуль М1


import math
def calculate_statistics(signal_data, N):
    if len(signal_data) < N:
        raise ValueError("N не может быть больше длины сигнала")
    first_part = signal_data[:N]
    second_part = signal_data[N:]
    M1 = sum(first_part) / len(first_part)
    M2 = sum(second_part) / len(second_part)
    C1 = sum((x - M1) ** 2 for x in first_part) / len(first_part)
    C2 = sum((x - M2) ** 2 for x in second_part) / len(second_part)
    return M1, M2, C1, C2
def analyze_signal_file(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            content = file.read().strip()
        signal_data = []
        for item in content.replace(',', ' ').split():
            try:
                signal_data.append(float(item))
            except ValueError:
                continue
        if not signal_data:
            raise ValueError("Файл не содержит числовых данных")
        NN = len(signal_data)
        N = NN // 2  # Берем первую половину данных
        M1, M2, C1, C2 = calculate_statistics(signal_data, N)
        print("\n=== РЕЗУЛЬТАТЫ РАСЧЕТА ===")
        print(f"Общее количество отсчетов: {NN}")
        print(f"Количество отсчетов в первой части (N): {N}")
        print(f"Среднее значение M1 (первые {N} отсчетов): {M1:.4f}")
        print(f"Среднее значение M2 (оставшиеся отсчеты): {M2:.4f}")
        print(f"Дисперсия C1 (первые {N} отсчетов): {C1:.4f}")
        print(f"Дисперсия C2 (оставшиеся отсчеты): {C2:.4f}")
        denominator = (C1 * N + C2 * (NN - N)) / (NN - 2)
        if denominator <= 0:
            t_stat = 0
        else:
            t_stat = abs(M1 - M2) / math.sqrt(denominator)
        if min(C1, C2) == 0:
            F_stat = float('inf')
        else:
            F_stat = max(C1, C2) / min(C1, C2)
        print(f"Статистика t: {t_stat:.4f}")
        print(f"Статистика F: {F_stat:.4f}")
        return signal_data, t_stat, F_stat
    except Exception as e:
        print(f"Ошибка при анализе файла: {e}")
        return None, None, None

M2

import os
import m1
def process_signal_analysis():
    while True:
        filename = input("Введите имя текстового файла с данными сигнала: ").strip()
        if os.path.exists(filename):
            break
        else:
            print(f"Файл '{filename}' не найден. Попробуйте снова.")
    signal_data, t_stat, F_stat = m1.analyze_signal_file(filename) 
    if signal_data is None:
        return
    print(f"\nВведенный сигнал ({len(signal_data)} отсчетов):")
    print(signal_data)
    print(f"Рассчитанные статистики: t = {t_stat:.4f}, F = {F_stat:.4f}")
    t_message = "Сигнал сильно меняется" if t_stat > 2 else "Сигнал заметно не меняется"
    F_message = "Разброс сигнала сильно меняется" if F_stat > 4 else "Разброс сигнала заметно не меняется"
    print(f"\n=== РЕЗУЛЬТАТЫ АНАЛИЗА ===")
    print(t_message)
    print(F_message)
    with open("Res101.txt", "w", encoding="utf-8") as result_file:
        result_file.write("=== РЕЗУЛЬТАТЫ АНАЛИЗА СИГНАЛА ===\n\n")
        result_file.write(f"Исходный сигнал: {signal_data}\n")
        result_file.write(f"Количество отсчетов: {len(signal_data)}\n")
        result_file.write(f"Статистика t: {t_stat:.4f}\n")
        result_file.write(f"Статистика F: {F_stat:.4f}\n\n")
        result_file.write(f"ВЫВОДЫ:\n")
        result_file.write(f"{t_message}\n")
        result_file.write(f"{F_message}\n")
    print(f"\nРезультаты сохранены в файл 'Res101.txt'")
    return signal_data, t_stat, F_stat

M0

import m2
import matplotlib.pyplot as plt
import os
def create_test_data_file():
    covid_data = [-440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 
                  2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993]
    with open("covid_data.txt", "w", encoding="utf-8") as file:
        file.write(", ".join(map(str, covid_data)))
    print("Создан тестовый файл 'covid_data.txt' с данными COVID-19")
def plot_signal(signal_data, title="График сигнала"):
    plt.figure(figsize=(12, 6))
    plt.plot(signal_data, 'b-o', linewidth=2, markersize=6, label='Сигнал')
    plt.axhline(y=0, color='r', linestyle='--', alpha=0.7, label='Нулевая линия')
    plt.title(title, fontsize=14, fontweight='bold')
    plt.xlabel('Номер отсчета', fontsize=12)
    plt.ylabel('Значение сигнала', fontsize=12)
    plt.grid(True, alpha=0.3)
    plt.legend()
    for i, value in enumerate(signal_data):
        plt.annotate(f'{value}', (i, value), textcoords="offset points", 
                    xytext=(0,10), ha='center', fontsize=8)
    plt.tight_layout()
    plt.show()
def main():
    print("=== АНАЛИЗ СИГНАЛА ===")
    print("Программа для статистического анализа сигналов")
    create_test_data_file()
    print("\nЗапуск анализа сигнала...")
    result = m2.process_signal_analysis()  
    if result:
        signal_data, t_stat, F_stat = result
        print("\nСтроится график сигнала...")
        plot_signal(signal_data, "График приращений заболеваемости COVID-19 (январь 2022)")
        print("\n=== АНАЛИЗ ЗАВЕРШЕН ===")
        print("Результаты сохранены в файле 'Res101.txt'")
    else:
        print("Анализ завершен с ошибкой")
if __name__ == "__main__":
    main()

Результат работы

=== АНАЛИЗ СИГНАЛА ===
Программа для статистического анализа сигналов
Создан тестовый файл 'covid_data.txt' с данными COVID-19

Запуск анализа сигнала...
Введите имя текстового файла с данными сигнала:  covid_data.txt

=== РЕЗУЛЬТАТЫ РАСЧЕТА ===
Общее количество отсчетов: 20
Количество отсчетов в первой части (N): 10
Среднее значение M1 (первые 10 отсчетов): 481.2000
Среднее значение M2 (оставшиеся отсчеты): 4205.0000
Дисперсия C1 (первые 10 отсчетов): 1376929.9600
Дисперсия C2 (оставшиеся отсчеты): 8869537.8000
Статистика t: 1.5608
Статистика F: 6.4415

Введенный сигнал (20 отсчетов):
[-440.0, -131.0, -456.0, 1419.0, -167.0, -322.0, -416.0, 1695.0, 421.0, 3209.0, 2665.0, 3359.0, 2051.0, 1496.0, 526.0, 2647.0, 4951.0, 10663.0, 7699.0, 5993.0]
Рассчитанные статистики: t = 1.5608, F = 6.4415

=== РЕЗУЛЬТАТЫ АНАЛИЗА ===
Сигнал заметно не меняется
Разброс сигнала сильно меняется

Результаты сохранены в файл 'Res101.txt'

=== АНАЛИЗ ЗАВЕРШЕН ===
Результаты сохранены в файле 'Res101.txt'