ответвлено от main/python-labs
90 строки
2.8 KiB
Python
90 строки
2.8 KiB
Python
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
|