Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

300 строки
9.8 KiB
Markdown

# Тест по модулю 3
Сарайкина Вера, А-02-23
## Задание
M3_24
1) Создайте модуль М1, содержащий две функции:
- функция 1: аргумент - список или кортеж с выборкой; функция должна рассчитать по выборке оценки математического ожидания, дисперсии, стандартного отклонения и медианы;
- функция 2: аргумент - список или кортеж с выборкой; функция должна произвести расчет по той же выборке оценки коэффициента асимметрии:
ma=[(x1-Mx)3+:+xN-Mx)^3]/[(N-1)*sx^3],
где Mx,sx - оценки математического ожидания и стандартного отклонения по выборке. При этом среднее значение и стандартное отклонение должны быть вычислены с помощью функции 1.
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
- запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;
- выборка вводится из файла и записывается в список;
- с помощью функций 1 и 2 по выборке рассчитываются оценки математического ожидания, дисперсии, стандартного отклонения, медианы и коэффициента асимметрии,
- по выборке рассчитывается гистограмма и отображается в виде графика на экране;
- результаты расчета записываются в бинарный файл с именем Res3737.bin.
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчетов на экране.
4) Подготовьте 2 текстовых файла с выборками и проверьте программу.
## Выполнение
## модуль 1
```py
import math as m
def f1(d):
"Функция 1: среднее, дисперсия, откл, медиана"
if not d:
return 0, 0, 0, 0
n = len(d)
mx = sum(d) / n
v = sum((x - mx) ** 2 for x in d) / (n - 1) if n > 1 else 0
sx = m.sqrt(v) if v > 0 else 0
sd = sorted(d)
if n % 2 == 1:
med = sd[n // 2]
else:
med = (sd[n // 2 - 1] + sd[n // 2]) / 2
return mx, v, sx, med
def f2(d):
"""Функция 2: коэффициент асимметрии"""
if not d:
return 0
mx, _, sx, _ = f1(d)
if sx == 0:
return 0
n = len(d)
sc = sum((x - mx) ** 3 for x in d)
ma = sc / ((n - 1) * (sx ** 3)) if n > 1 else 0
return ma
```
## модуль 2
```py
import os
import struct
import math
import matplotlib.pyplot as plt
import M1
def read_file():
"Чтение файла с выборкой"
while True:
filename = input("Введите имя файла: ").strip()
if not filename.endswith('.txt'):
filename += '.txt'
if os.path.exists(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
numbers = []
for part in content.split():
cleaned = part.strip(',;:')
try:
numbers.append(float(cleaned))
except ValueError:
continue
if numbers:
print(f"Прочитано {len(numbers)} чисел из файла {filename}")
return numbers
else:
print("Файл не содержит чисел")
except Exception as e:
print(f"Ошибка при чтении файла: {e}")
else:
print(f"Файл {filename} не найден")
def create_histogram(data):
"Создание и отображение гистограммы"
if not data:
return
# Определяем количество интервалов
num_bins = min(15, int(math.sqrt(len(data))))
plt.figure(figsize=(10, 6))
plt.hist(data, bins=num_bins, edgecolor='black', alpha=0.7)
plt.title('Гистограмма выборки')
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.grid(True, alpha=0.3)
plt.savefig('histogram.png')
print("Гистограмма сохранена в файл ")
plt.show()
def save_to_binary(stats, asymmetry):
"Сохранение результатов в бинарный файл"
try:
with open('Res3737.bin', 'wb') as file:
# Записываем все 5 значений
for value in [stats[0], stats[1], stats[2], stats[3], asymmetry]:
file.write(struct.pack('d', value))
print("Результаты сохранены в файл 'Res3737.bin'")
except Exception as e:
print(f"Ошибка при сохранении в файл: {e}")
def main():
"Основная функция модуля M2"
sample = read_file()
if not sample:
print("Не удалось получить выборку. Программа завершена.")
return
print(f"\nХарактеристики выборки:")
print(f"Размер выборки: {len(sample)}")
print(f"Минимальное значение: {min(sample):.4f}")
print(f"Максимальное значение: {max(sample):.4f}")
# Расчет статистик
mean, variance, std_dev, median = M1.f1(sample)
asymmetry_coeff = M1.f2(sample)
print(f"\nРезультаты расчетов:")
print(f"Математическое ожидание: {mean:.4f}")
print(f"Дисперсия: {variance:.4f}")
print(f"Стандартное отклонение: {std_dev:.4f}")
print(f"Медиана: {median:.4f}")
print(f"Коэффициент асимметрии: {asymmetry_coeff:.4f}")
create_histogram(sample)
save_to_binary((mean, variance, std_dev, median), asymmetry_coeff)
return sample, mean, variance, std_dev, median, asymmetry_coeff
if __name__ == "__main__":
main()
```
## основной модуль
```py
import M2
def main():
"Главная программа"
print("=" * 40)
print("АНАЛИЗ ВЫБОРКИ")
print("=" * 40)
r = M2.main()
if r:
d, mx, v, sx, med, ma = r
print("\n" + "-" * 40)
print("РЕЗУЛЬТАТЫ:")
print(f"n = {len(d)}")
print(f"min = {min(d):.4f}")
print(f"max = {max(d):.4f}")
print(f"mx = {mx:.4f}")
print(f"v = {v:.4f}")
print(f"sx = {sx:.4f}")
print(f"med = {med:.4f}")
print(f"ma = {ma:.4f}")
if abs(ma) < 0.5:
t = "~симм"
elif ma > 0:
t = "вправо"
else:
t = "влево"
print(f"тип: {t}")
if mx != 0:
cv = sx / mx * 100
print(f"CV = {cv:.1f}%")
print("\n" + "=" * 40)
print("КОНЕЦ")
print("=" * 40)
if __name__ == "__main__":
main()
```
## Вывод для test1
```py
C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py
========================================
АНАЛИЗ ВЫБОРКИ
========================================
Введите имя файла: test1
Прочитано 10 чисел из файла test1.txt
Характеристики выборки:
Размер выборки: 10
Минимальное значение: 12.5000
Максимальное значение: 17.4000
Результаты расчетов:
Математическое ожидание: 14.5900
Дисперсия: 2.4766
Стандартное отклонение: 1.5737
Медиана: 14.5000
Коэффициент асимметрии: 0.2955
Гистограмма сохранена в файл
```
![](histogram.png)
## Вывод для test2
```py
C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py
========================================
АНАЛИЗ ВЫБОРКИ
========================================
Введите имя файла: test2
Прочитано 15 чисел из файла test2.txt
Характеристики выборки:
Размер выборки: 15
Минимальное значение: 95.0000
Максимальное значение: 110.0000
Результаты расчетов:
Математическое ожидание: 102.2667
Дисперсия: 23.3524
Стандартное отклонение: 4.8324
Медиана: 102.0000
Коэффициент асимметрии: 0.1178
Гистограмма сохранена
Результаты сохранены в файл 'Res3737.bin'
----------------------------------------
РЕЗУЛЬТАТЫ:
n = 15
min = 95.0000
max = 110.0000
mx = 102.2667
v = 23.3524
sx = 4.8324
med = 102.0000
ma = 0.1178
тип: ~симм
CV = 4.7%
========================================
КОНЕЦ
========================================
Process finished with exit code 0
```
![](Figure_1.png)