Статья Автор: Деникина Н.В., Деникин А.В.

Предсказания траектории движения частицы

Траектория частицы — это путь, по которому она движется под действием сил, таких как гравитация или электрическое поле. Траектория зависит от начальных условий: положения, скорости и ускорения. Например, если вы бросаете мяч, его траектория зависит от начальной скорости и угла броска. В реальной физике траектории могут быть сложными из-за неоднородных полей или сопротивления среды.

Цель: Использовать машинное обучение, чтобы предсказать координату частицы (например, её положение по оси Y через определённое время) на основе начальных условий, таких как начальная скорость и угол. Это задача регрессии, где мы предсказываем число (координату).


Машинное обучение — это метод, который позволяет компьютеру находить закономерности в данных. В нашем случае:

  • Данные: Таблица с начальными условиями движения частиц (скорость, угол) и их координатами через заданное время.
  • Задача: Научить модель предсказывать координату Y частицы по её начальным условиям.
  • Этапы:
    1. Загрузка и обработка данных.
    2. Преобразование физических данных в числовые признаки.
    3. Обучение модели ML.
    4. Оценка модели и визуализация результатов.

 

Создадим программу на Python, которая:

  • Загружает синтетический датасет с начальными условиями движения частиц (начальная скорость, угол) и их координатой Y через 1 секунду.
  • Обучает модель линейной регрессии для предсказания координаты Y.
  • Визуализирует результаты с помощью Matplotlib.
  • Анализирует данные с помощью Pandas.

Для простоты мы создадим датасет внутри кода, имитирующий движение частицы в гравитационном поле с учётом начальной скорости и угла броска. В реальной задаче данные могут быть получены из экспериментов или симуляций.

Этапы работы программы:

  1. Создание датасета:
    • Мы создали синтетический датасет с 10 частицами. Для каждой частицы указаны:
      • Начальная скорость (Initial_Velocity, м/с).
      • Угол броска (Angle, градусы).
      • Координата Y через 1 секунду (Y_Position, м), рассчитанная по формуле движения в гравитационном поле:\(y= v_0 \sin(\theta) t - \frac{1}{2} g t^2 , где g=9.8м/с^2, \text{t} =1с\) 
    • В реальной задаче данные могут быть получены из физических экспериментов или симуляций.
  2. Предобработка:
    • Преобразуем угол в радианы и создаём новые признаки: v0sin⁡(θ) v_0 \sin(\theta) v0​sin(θ) и v0cos⁡(θ) v_0 \cos(\theta) v0​cos(θ), которые физически связаны с движением.
    • Выбираем числовые признаки для модели ML.
  3. Разделение данных:
    • Делим данные на обучающую (70%) и тестовую (30%) выборки, чтобы проверить модель.
  4. Обучение модели:
    • Используем линейную регрессию — простой алгоритм ML для предсказания чисел (координаты Y).
  5. Оценка модели:
    • Считаем среднеквадратичную ошибку (MSE) — меру, насколько предсказания отличаются от истины.
    • Считаем R² — показатель, насколько модель объясняет данные (чем ближе к 1, тем лучше).
  6. Визуализация:
    • Сравнение предсказаний: Точечный график, показывающий истинные и предсказанные координаты Y.
    • Важность признаков: Гистограмма, показывающая, как скорость и угол влияют на координату.
    • Зависимость Y: График, показывающий, как Y зависит от начальной скорости, с цветом по углу.
    • Матрица корреляции: Тепловая карта, показывающая связи между признаками и Y.
  7. Анализ данных:
    • Считаем средние значения признаков и корреляцию между ними с помощью Pandas.

Вывод:

  • Файл y_position_prediction.png: График, сравнивающий истинные и предсказанные координаты Y.
  • Файл feature_importance.png: Гистограмма, показывающая важность скорости и угла.
  • Файл y_vs_velocity.png: График зависимости Y от начальной скорости.
  • Файл correlation_matrix.png: Тепловая карта корреляции между признаками.
  • Вывод в консоли: Ошибка модели, R², средние значения признаков и корреляционная матрица.
 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import seaborn as sns

# 1. Создаем синтетический датасет
# Признаки: начальная скорость (Initial_Velocity, м/с), угол броска (Angle, градусы)
# Целевая переменная: координата Y через 1 секунду (Y_Position, м)
# Формула для Y: y = v0 * sin(θ) * t - 0.5 * g * t^2, где g=9.8 м/с², t=1 с
g = 9.8  # ускорение свободного падения
data = {
    'Initial_Velocity': [10, 12, 15, 8, 11, 14, 9, 13, 10, 16],
    'Angle': [30, 45, 60, 20, 50, 40, 35, 55, 25, 65],
    'Y_Position': [
        v * np.sin(np.radians(a)) * 1 - 0.5 * g * 1**2
        for v, a in zip([10, 12, 15, 8, 11, 14, 9, 13, 10, 16], [30, 45, 60, 20, 50, 40, 35, 55, 25, 65])
    ]
}
df = pd.DataFrame(data)

# 2. Предобработка
# Преобразуем угол в радианы и создаем новые признаки: v0*sin(θ) и v0*cos(θ)
df['Sin_Angle'] = np.sin(np.radians(df['Angle']))
df['Cos_Angle'] = np.cos(np.radians(df['Angle']))
features = df[['Initial_Velocity', 'Sin_Angle', 'Cos_Angle']]
target = df['Y_Position']

# 3. Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3, random_state=42)

# 4. Обучение модели линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)

# 5. Предсказание и оценка
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error (MSE): {mse:.2f}")
print(f"R^2 Score: {r2:.2f}")

# 6. Визуализация: сравнение предсказанных и истинных значений
plt.figure(figsize=(6, 4))
plt.scatter(y_test, y_pred, color='blue', s=100)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('True Y Position (m)')
plt.ylabel('Predicted Y Position (m)')
plt.title('True vs Predicted Y Position')
plt.savefig('y_position_prediction.png')
plt.close()

# Визуализация: важность признаков
feature_importance = pd.Series(model.coef_, index=features.columns)
plt.figure(figsize=(6, 4))
feature_importance.plot(kind='bar', color='skyblue')
plt.xlabel('Feature')
plt.ylabel('Coefficient (Importance)')
plt.title('Feature Importance for Y Position Prediction')
plt.savefig('feature_importance.png')
plt.close()

# Визуализация: зависимость Y от начальной скорости
plt.figure(figsize=(8, 6))
scatter = plt.scatter(df['Initial_Velocity'], df['Y_Position'], c=df['Angle'], cmap='viridis', s=100)
plt.colorbar(scatter, label='Angle (degrees)')
plt.xlabel('Initial Velocity (m/s)')
plt.ylabel('Y Position (m)')
plt.title('Y Position vs Initial Velocity (Colored by Angle)')
plt.savefig('y_vs_velocity.png')
plt.close()

# 7. Анализ данных с Pandas
# Средние значения признаков
print("\nAverage values of features:")
print(df[['Initial_Velocity', 'Angle']].mean())

# Корреляция между признаками и Y
correlation = df[['Initial_Velocity', 'Angle', 'Y_Position']].corr()
print("\nCorrelation matrix:")
print(correlation)

# Визуализация корреляции
plt.figure(figsize=(6, 4))
sns.heatmap(correlation, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix')
plt.savefig('correlation_matrix.png')
plt.close()
 

Задания для практики

  1. Добавьте в датасет ещё один признак, например, начальную высоту частицы, и проверьте, как это влияет на точность.
  2. Постройте график зависимости Y от угла броска (аналогично y_vs_velocity.png).
  3. Попробуйте другой алгоритм ML, например, RandomForestRegressor из sklearn, и сравните результаты.
Печать