## Индивидуально контрольное задание по Теме 3 Володин Денис, А-02-23 ##Задание В-20 1) Создайте модуль М1, содержащий две функции: - функция 1: аргументы - ряд отсчетов некоторого сигнала и целочисленный параметр N; функция должна рассчитать и возвратить оценки средних значений М1 и М2 и дисперсий С1 и С2 по первым N отсчетам сигнала и по оставшейся его части; - функция 2: аргумент - имя текстового файла с отсчетами сигнала Х; функция должна прочитать данные из указанного файла, передать их в функцию 1, отобразить результаты расчета и по возвращенным данным рассчитать и вернуть 2 статистики t=|M1-M2| /((C1*N+С2*(NN-N))/(NN-2))0.5 F=max(C1,C2)/min(C1,C2) 2) Создайте еще один модуль М2, в котором должны выполняться операции: - запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса; - вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики; - при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt. 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика введенный из файла числовой ряд. 4) Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.: -440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993 ## Решение Модуль М1 ```py 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 ```py 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 ```py 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() ``` Результат работы ```py === АНАЛИЗ СИГНАЛА === Программа для статистического анализа сигналов Создан тестовый файл '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' ``` ![](figure1.png) ```py === АНАЛИЗ ЗАВЕРШЕН === Результаты сохранены в файле 'Res101.txt' ```