ответвлено от main/python-labs
test: done
Этот коммит содержится в:
Двоичные данные
TEMA9/Figure_2.png
Обычный файл
Двоичные данные
TEMA9/Figure_2.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 44 KiB |
18
TEMA9/M0.py
Обычный файл
18
TEMA9/M0.py
Обычный файл
@@ -0,0 +1,18 @@
|
||||
import M2
|
||||
import pylab
|
||||
signal, t, F = M2.process_signal()
|
||||
indices = list(range(len(signal)))
|
||||
pylab.figure(figsize=(12, 6))
|
||||
pylab.plot(indices, signal, 'b-o', linewidth=2, markersize=4)
|
||||
pylab.xlabel('Номер отсчета')
|
||||
pylab.ylabel('Значение сигнала')
|
||||
pylab.title('График сигнала (приращения заболеваемости COVID-19)')
|
||||
pylab.grid(True)
|
||||
pylab.axhline(y=0, color='r', linestyle='--', linewidth=1)
|
||||
|
||||
N = len(signal) // 2
|
||||
pylab.axvline(x=N, color='g', linestyle='-', linewidth=2, label=f'Граница N={N}')
|
||||
pylab.legend()
|
||||
pylab.show()
|
||||
|
||||
print("График отображен.")
|
||||
89
TEMA9/M1.py
Обычный файл
89
TEMA9/M1.py
Обычный файл
@@ -0,0 +1,89 @@
|
||||
import math
|
||||
|
||||
def function1(signal, N):
|
||||
"""
|
||||
Функция 1: рассчитывает оценки средних и дисперсий по первым N отсчетам
|
||||
и по оставшейся части сигнала
|
||||
|
||||
Аргументы:
|
||||
signal - ряд отсчетов сигнала
|
||||
N - целочисленный параметр (количество первых отсчетов)
|
||||
|
||||
Возвращает:
|
||||
M1, M2, C1, C2 - средние и дисперсии по двум частям сигнала
|
||||
"""
|
||||
part1 = signal[:N]
|
||||
part2 = signal[N:]
|
||||
|
||||
if len(part1) > 0:
|
||||
M1 = sum(part1) / len(part1)
|
||||
sum_sq1 = 0
|
||||
for x in part1:
|
||||
sum_sq1 += (x - M1) ** 2
|
||||
C1 = sum_sq1 / (len(part1) - 1) if len(part1) > 1 else 0
|
||||
else:
|
||||
M1 = 0
|
||||
C1 = 0
|
||||
|
||||
if len(part2) > 0:
|
||||
M2 = sum(part2) / len(part2)
|
||||
sum_sq2 = 0
|
||||
for x in part2:
|
||||
sum_sq2 += (x - M2) ** 2
|
||||
C2 = sum_sq2 / (len(part2) - 1) if len(part2) > 1 else 0
|
||||
else:
|
||||
M2 = 0
|
||||
C2 = 0
|
||||
|
||||
return M1, M2, C1, C2
|
||||
|
||||
|
||||
def function2(filename):
|
||||
"""
|
||||
Функция 2: читает данные из файла, передает их в функцию 1,
|
||||
отображает результаты и рассчитывает статистики t и F
|
||||
|
||||
Аргумент:
|
||||
filename - имя текстового файла с отсчетами сигнала
|
||||
|
||||
Возвращает:
|
||||
signal - прочитанный сигнал
|
||||
t, F - рассчитанные статистики
|
||||
M1, M2, C1, C2 - промежуточные результаты
|
||||
"""
|
||||
file = open(filename, 'r')
|
||||
content = file.read()
|
||||
file.close()
|
||||
|
||||
elements = content.replace(',', ' ').split()
|
||||
signal = []
|
||||
for elem in elements:
|
||||
if elem.strip():
|
||||
signal.append(float(elem))
|
||||
|
||||
NN = len(signal)
|
||||
N = NN // 2
|
||||
print(f"Параметр N (половина длины) = {N}")
|
||||
|
||||
M1, M2, C1, C2 = function1(signal, N)
|
||||
|
||||
print(f"Первые {N} отсчетов: M1 = {M1:.4f}, C1 = {C1:.4f}")
|
||||
print(f"Оставшиеся {NN-N} отсчетов: M2 = {M2:.4f}, C2 = {C2:.4f}")
|
||||
|
||||
if NN > 2 and (C1 * N + C2 * (NN - N)) > 0:
|
||||
numerator = abs(M1 - M2)
|
||||
denominator = math.sqrt((C1 * N + C2 * (NN - N)) / (NN - 2))
|
||||
t = numerator / denominator if denominator != 0 else 0
|
||||
else:
|
||||
t = 0
|
||||
print("Недостаточно данных для расчета t")
|
||||
|
||||
if C2 > 0 and C1 > 0:
|
||||
F = max(C1, C2) / min(C1, C2)
|
||||
else:
|
||||
F = 1
|
||||
|
||||
print(f"Статистика t = {t:.6f}")
|
||||
print(f"Статистика F = {F:.6f}")
|
||||
|
||||
return signal, t, F, M1, M2, C1, C2
|
||||
55
TEMA9/M2.py
Обычный файл
55
TEMA9/M2.py
Обычный файл
@@ -0,0 +1,55 @@
|
||||
import os
|
||||
import M1
|
||||
|
||||
def process_signal():
|
||||
"""
|
||||
Основная функция модуля M2
|
||||
Запрашивает имя файла, проверяет его существование,
|
||||
вызывает функцию2 из M1 и записывает результаты в файл Res101.txt
|
||||
"""
|
||||
# Запрос имени файла с проверкой существования
|
||||
while True:
|
||||
filename = input("\nВведите имя файла с данными: ").strip()
|
||||
|
||||
if os.path.exists(filename):
|
||||
print(f"Файл '{filename}' найден")
|
||||
break
|
||||
else:
|
||||
print(f"Файл '{filename}' не существует. Повторите ввод.")
|
||||
# Вызов функции 2 из модуля M1
|
||||
signal, t_stat, F_stat, mean1, mean2, var1, var2 = M1.function2(filename)
|
||||
|
||||
print("Отсчеты сигнала:")
|
||||
for i in range(len(signal)):
|
||||
print(f" {i:2d}: {signal[i]:8.2f}")
|
||||
print("\n--- Анализ результатов ---")
|
||||
messages = []
|
||||
if t_stat > 2:
|
||||
msg_t = "Сигнал сильно меняется"
|
||||
print(f"t={t_stat:.4f} > 2: {msg_t}")
|
||||
else:
|
||||
msg_t = "Сигнал заметно не меняется"
|
||||
print(f"t={t_stat:.4f} ≤ 2: {msg_t}")
|
||||
messages.append(msg_t)
|
||||
|
||||
if F_stat > 4:
|
||||
msg_F = "Разброс сигнала сильно меняется"
|
||||
print(f"F={F_stat:.4f} > 4: {msg_F}")
|
||||
else:
|
||||
msg_F = "Разброс сигнала заметно не меняется"
|
||||
print(f"F={F_stat:.4f} ≤ 4: {msg_F}")
|
||||
messages.append(msg_F)
|
||||
res_filename = "Res101.txt"
|
||||
file = open(res_filename, 'w', encoding='utf-8')
|
||||
file.write(f"Исходный файл: {filename}\n")
|
||||
file.write(f"Количество отсчетов: {len(signal)}\n")
|
||||
file.write(f"t-статистика: {t_stat:.6f}\n")
|
||||
file.write(f"F-статистика: {F_stat:.6f}\n")
|
||||
file.write("-"*40 + "\n")
|
||||
file.write(f"Вывод 1: {msg_t}\n")
|
||||
file.write(f"Вывод 2: {msg_F}\n")
|
||||
file.close()
|
||||
|
||||
print(f"\nРезультаты сохранены в файл '{res_filename}'")
|
||||
|
||||
return signal, t_stat, F_stat
|
||||
7
TEMA9/Res101.txt
Обычный файл
7
TEMA9/Res101.txt
Обычный файл
@@ -0,0 +1,7 @@
|
||||
Исходный файл: covid_jan2022.txt
|
||||
Количество отсчетов: 20
|
||||
t-статистика: 1.480665
|
||||
F-статистика: 6.441532
|
||||
----------------------------------------
|
||||
Вывод 1: Сигнал заметно не меняется
|
||||
Вывод 2: Разброс сигнала сильно меняется
|
||||
20
TEMA9/covid_jan2022.txt
Обычный файл
20
TEMA9/covid_jan2022.txt
Обычный файл
@@ -0,0 +1,20 @@
|
||||
-440
|
||||
-131
|
||||
-456
|
||||
1419
|
||||
-167
|
||||
-322
|
||||
-416
|
||||
1695
|
||||
421
|
||||
3209
|
||||
2665
|
||||
3359
|
||||
2051
|
||||
1496
|
||||
526
|
||||
2647
|
||||
4951
|
||||
10663
|
||||
7699
|
||||
5993
|
||||
0
TEMA9/test.md
Обычный файл
0
TEMA9/test.md
Обычный файл
Ссылка в новой задаче
Block a user