10 KiB
Индивидуально контрольное задание по Теме 3
Володин Денис, А-02-23
##Задание
В-20
- Создайте модуль М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)
- Создайте еще один модуль М2, в котором должны выполняться операции:
-
запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса;
-
вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики;
-
при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt.
-
Создайте модуль М0 - главную программу, которая вызывает М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'
