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()