форкнуто от main/python-labs
Родитель
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 @@
|
||||
Сигнал заметно не меняется
|
||||
Разброс сигнала сильно меняется
|
||||
|
После Ширина: | Высота: | Размер: 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">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Загрузка…
Ссылка в новой задаче