Загрузка данных


import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# Количество выборок и количество случайных величин в каждой сумме
n_samples = 10_000
n_values = 30

# Равномерное распределение на отрезке [0, 1]
uniform = stats.uniform(loc=0, scale=1)

# Строим первый график — плотность равномерного распределения
x = np.linspace(0, 1, 200)
plt.figure(figsize=(8, 4))
plt.plot(x, uniform.pdf(x), label='Равномерное распределение')
plt.title('Плотность равномерного распределения U(0, 1)')
plt.xlabel('x')
plt.ylabel('Плотность вероятности')
plt.grid(True)
plt.legend()
plt.show()

# Генерируем 10 000 выборок по 30 независимых чисел
# Размер массива: 10 000 строк и 30 столбцов
samples = uniform.rvs(size=(n_samples, n_values))

# Складываем 30 чисел в каждой строке
sums = np.sum(samples, axis=1)

# Вычисляем выборочное среднее и стандартное отклонение сумм
mu = np.mean(sums)
sigma = np.std(sums, ddof=1)

print(f'Выборочное среднее μ = {mu:.4f}')
print(f'Выборочное стандартное отклонение σ = {sigma:.4f}')

# Строим второй график — нормированную гистограмму сумм
plt.figure(figsize=(8, 4))
plt.hist(sums, bins=40, density=True, alpha=0.6,
         label='Гистограмма сумм')

# Создаём нормальное распределение с найденными параметрами μ и σ
normal = stats.norm(loc=mu, scale=sigma)

# Строим плотность нормального распределения поверх гистограммы
x = np.linspace(sums.min(), sums.max(), 300)
plt.plot(x, normal.pdf(x), 'r-', linewidth=2,
         label='Нормальное распределение')

plt.title('Суммы случайных величин и нормальное распределение')
plt.xlabel('Сумма 30 случайных величин')
plt.ylabel('Плотность вероятности')
plt.grid(True)
plt.legend()
plt.show()

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline

# Исходные значения времени
t = np.array([0, 1, 2, 3, 4, 5])

# Координата x монотонно возрастает
x = np.array([0, 1, 2, 3, 4, 5])

# Координата y изменяется вверх и вниз
y = np.array([0, 2, 1, 3, 2, 4])

# Строим кубический сплайн зависимости y от x
spline = CubicSpline(x, y)

# Создаём новую сетку из 200 точек между минимальным и максимальным x
x_new = np.linspace(x.min(), x.max(), 200)

# Вычисляем значения y на новой сетке с помощью сплайна
y_new = spline(x_new)

# Вычисляем длину траектории по исходным точкам
# Интегрируем скорость по времени:
# скорость = sqrt((dx/dt)^2 + (dy/dt)^2)
dx_dt = np.gradient(x, t)
dy_dt = np.gradient(y, t)
speed = np.sqrt(dx_dt**2 + dy_dt**2)
length_original = np.trapz(speed, t)

# Вычисляем длину траектории по построенному сплайну
# Производная сплайна показывает dy/dx
dy_dx = spline(x_new, 1)

# Поскольку x монотонно возрастает, длина дуги:
# интеграл sqrt(1 + (dy/dx)^2) по x
length_spline = np.trapz(np.sqrt(1 + dy_dx**2), x_new)

# Выводим результаты
print(f'Длина траектории по исходным точкам: {length_original:.4f}')
print(f'Длина траектории по сплайну: {length_spline:.4f}')

# Строим график исходных точек и восстановленной кривой
plt.figure(figsize=(8, 5))

# Исходные измерения
plt.plot(x, y, 'o', label='Исходные точки')

# Кубический сплайн
plt.plot(x_new, y_new, label='Кубический сплайн')

plt.title('Восстановление траектории движения')
plt.xlabel('Координата x')
plt.ylabel('Координата y')
plt.grid(True)
plt.legend()
plt.show()