MarkovNiks 3 дней назад
Родитель c431dedd31
Сommit cf4690c073

@ -0,0 +1,17 @@
from M2 import main as run_M2
import matplotlib.pyplot as plt
def main():
values, t, F = run_M2()
x_axis = list(range(1, len(values) + 1))
plt.figure()
plt.plot(x_axis, values, marker="o")
plt.xlabel("Номер дня")
plt.ylabel("Прирост заболевших")
plt.title("Сигнал из файла (COVID-19, январь 2022)")
plt.grid(True)
plt.show()
if __name__ == "__main__":
main()

@ -0,0 +1,48 @@
import math
def stats_on_signal(x, N):
NN = len(x)
if N <= 0 or N >= NN:
raise ValueError("N должно быть > 0 и < количества отсчётов сигнала")
part1 = x[:N]
part2 = x[N:]
M1 = sum(part1) / len(part1)
M2 = sum(part2) / len(part2)
def sample_var(data):
n = len(data)
m = sum(data) / n
return sum((v - m) ** 2 for v in data) / (n - 1)
C1 = sample_var(part1)
C2 = sample_var(part2)
return M1, M2, C1, C2, NN
def process_file(filename, N):
values = []
with open(filename, "r", encoding="utf-8") as f:
for line in f:
if not line.strip():
continue
for token in line.replace(",", " ").split():
values.append(float(token))
M1, M2, C1, C2, NN = stats_on_signal(values, N)
print(f"Число отсчётов NN = {NN}")
print(f"M1 = {M1}, M2 = {M2}")
print(f"C1 = {C1}, C2 = {C2}")
aaa = (C1 * N + C2 * (NN - N)) / (NN - 2)
t = abs(M1 - M2) / math.sqrt(aaa)
F = max(C1, C2) / min(C1, C2)
print(f"t = {t}")
print(f"F = {F}")
return values, t, F

@ -0,0 +1,41 @@
from M1 import process_file
def main():
import os
while True:
filename = input("Введите имя текстового файла с сигналом: ").strip()
if os.path.isfile(filename):
break
print("Файл не найден. Повторите ввод.")
N_str = input("Введите N (число первых отсчётов для первой части): ").strip()
N = int(N_str)
values, t, F = process_file(filename, N)
print("Считанный сигнал (отсчёты):")
print(" ".join(f"{v}" for v in values))
if t > 2:
msg_t = "Сигнал сильно меняется"
else:
msg_t = "Сигнал заметно не меняется"
if F > 4:
msg_F = "Разброс сигнала сильно меняется"
else:
msg_F = "Разброс сигнала заметно не меняется"
print(msg_t)
print(msg_F)
with open("Res101.txt", "w", encoding="utf-8") as f:
f.write(msg_t + "\n")
f.write(msg_F + "\n")
return values, t, F
if __name__ == "__main__":
main()

@ -0,0 +1,2 @@
Сигнал заметно не меняется
Разброс сигнала сильно меняется

Двоичные данные
TEMA9/covid.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 32 KiB

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

@ -0,0 +1,215 @@
# Тест по модулю 2
Марков Никита Сергеевич, А-03-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)
```py
#M1.py
import math
def stats_on_signal(x, N):
NN = len(x)
if N <= 0 or N >= NN:
raise ValueError("N должно быть > 0 и < количества отсчётов сигнала")
part1 = x[:N]
part2 = x[N:]
M1 = sum(part1) / len(part1)
M2 = sum(part2) / len(part2)
def sample_var(data):
n = len(data)
m = sum(data) / n
return sum((v - m) ** 2 for v in data) / (n - 1)
C1 = sample_var(part1)
C2 = sample_var(part2)
return M1, M2, C1, C2, NN
def process_file(filename, N):
values = []
with open(filename, "r", encoding="utf-8") as f:
for line in f:
if not line.strip():
continue
for token in line.replace(",", " ").split():
values.append(float(token))
M1, M2, C1, C2, NN = stats_on_signal(values, N)
print(f"Число отсчётов NN = {NN}")
print(f"M1 = {M1}, M2 = {M2}")
print(f"C1 = {C1}, C2 = {C2}")
aaa = (C1 * N + C2 * (NN - N)) / (NN - 2)
t = abs(M1 - M2) / math.sqrt(aaa)
F = max(C1, C2) / min(C1, C2)
print(f"t = {t}")
print(f"F = {F}")
return values, t, F
```
## 2) Создайте еще один модуль М2, в котором должны выполняться операции:
-запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса;
-вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики;
-при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt.
```py
# M2.py
from M1 import process_file
def main():
import os
while True:
filename = input("Введите имя текстового файла с сигналом: ").strip()
if os.path.isfile(filename):
break
print("Файл не найден. Повторите ввод.")
N_str = input("Введите N (число первых отсчётов для первой части): ").strip()
N = int(N_str)
values, t, F = process_file(filename, N)
print("Считанный сигнал (отсчёты):")
print(" ".join(f"{v}" for v in values))
if t > 2:
msg_t = "Сигнал сильно меняется"
else:
msg_t = "Сигнал заметно не меняется"
if F > 4:
msg_F = "Разброс сигнала сильно меняется"
else:
msg_F = "Разброс сигнала заметно не меняется"
print(msg_t)
print(msg_F)
with open("Res101.txt", "w", encoding="utf-8") as f:
f.write(msg_t + "\n")
f.write(msg_F + "\n")
return values, t, F
if __name__ == "__main__":
main()
```
## 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика введенный из файла числовой ряд.
```py
#Mo.py
from M2 import main as run_M2
import matplotlib.pyplot as plt
def main():
values, t, F = run_M2()
x_axis = list(range(1, len(values) + 1))
plt.figure()
plt.plot(x_axis, values, marker="o")
plt.xlabel("Номер дня")
plt.ylabel("Прирост заболевших")
plt.title("Сигнал из файла (COVID-19, январь 2022)")
plt.grid(True)
plt.show()
if __name__ == "__main__":
main()
```
## 4) Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.:
-440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993
Проверьте программу с использованием этих данных.
```py
Введите имя текстового файла с сигналом: covid.txt
Введите N (число первых отсчётов для первой части): 10
Число отсчётов NN = 20
M1 = 481.2, M2 = 4205.0
C1 = 1529922.177777778, C2 = 9855042.0
t = 1.4806648475081259
F = 6.4415315649025455
Считанный сигнал (отсчёты):
-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
Сигнал заметно не меняется
Разброс сигнала сильно меняется
```
**Результат:**
<image src="covid.png">
Загрузка…
Отмена
Сохранить