форкнуто от main/python-labs
main
Родитель
bd601825a0
Сommit
ef50af3624
@ -0,0 +1,201 @@
|
|||||||
|
## Индивидуально контрольное задание по Теме 3
|
||||||
|
|
||||||
|
Володин Денис, А-02-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)
|
||||||
|
|
||||||
|
2) Создайте еще один модуль М2, в котором должны выполняться операции:
|
||||||
|
|
||||||
|
- запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса;
|
||||||
|
|
||||||
|
- вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики;
|
||||||
|
|
||||||
|
- при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt.
|
||||||
|
|
||||||
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика введенный из файла числовой ряд.
|
||||||
|
|
||||||
|
4) Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.:
|
||||||
|
|
||||||
|
-440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
Модуль М1
|
||||||
|
```py
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
```py
|
||||||
|
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
|
||||||
|
|
||||||
|
```py
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат работы
|
||||||
|
|
||||||
|
```py
|
||||||
|
=== АНАЛИЗ СИГНАЛА ===
|
||||||
|
Программа для статистического анализа сигналов
|
||||||
|
Создан тестовый файл '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'
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
## Индивидуально контрольное задание по Теме 4
|
||||||
|
|
||||||
|
Володин Денис, А-02-23
|
||||||
|
|
||||||
|
##Задание
|
||||||
|
|
||||||
|
В-20
|
||||||
|
Напишите инструкцию запоминания в переменной текущего времени в секундах с начала эпохи. Преобразуйте это время в Московское региональное время. Создайте кортеж с элементами – целыми числами от 27 до 147 через 15. Рассчитайте сумму элементов кортежа и определите значение отношения синуса этой суммы к корню квадратному из неё. Отобразите полученное значение в виде: «Результат = ХХХ» с округлением до 5 знаков после точки.
|
||||||
|
|
||||||
|
##Решение
|
||||||
|
|
||||||
|
```py
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import math
|
||||||
|
current_time_seconds = time.time()
|
||||||
|
print(f"Текущее время в секундах с начала эпохи: {current_time_seconds}")
|
||||||
|
utc_time = datetime.datetime.utcfromtimestamp(current_time_seconds)
|
||||||
|
moscow_time = utc_time + datetime.timedelta(hours=3)
|
||||||
|
print(f"Московское время: {moscow_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||||||
|
numbers_tuple = tuple(range(27, 148, 15))
|
||||||
|
print(f"Кортеж чисел: {numbers_tuple}")
|
||||||
|
tuple_sum = sum(numbers_tuple)
|
||||||
|
print(f"Сумма элементов кортежа: {tuple_sum}")
|
||||||
|
if tuple_sum >= 0:
|
||||||
|
result = math.sin(tuple_sum) / math.sqrt(tuple_sum)
|
||||||
|
else:
|
||||||
|
result = math.sin(tuple_sum) / math.sqrt(-tuple_sum) # для комплексного случая, но в нашем случае сумма положительна
|
||||||
|
print(f"Результат = {result:.5f}")
|
||||||
|
```
|
||||||
|
|
||||||
|
##Вывод
|
||||||
|
|
||||||
|
```py
|
||||||
|
Текущее время в секундах с начала эпохи: 1760948869.1841416
|
||||||
|
Московское время: 2025-10-20 11:27:49
|
||||||
|
Кортеж чисел: (27, 42, 57, 72, 87, 102, 117, 132, 147)
|
||||||
|
Сумма элементов кортежа: 783
|
||||||
|
Результат = -0.02419
|
||||||
|
```
|
||||||
Загрузка…
Ссылка в новой задаче