🟡 Средний ⏱️ 45 минут

Векторное произведение

Векторное произведение 🔀

Представь: ты обучаешь нейронную сеть, и тебе нужно найти направление, перпендикулярное одновременно к двум feature-векторам. Или ты работаешь с 3D-графикой для генеративной модели и нужно вычислить нормаль к поверхности. Или анализируешь вращательное движение в робототехнике…

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

В отличие от скалярного произведения (которое даёт число), векторное произведение даёт новый вектор. И этот вектор обладает уникальным свойством: он перпендикулярен обоим исходным векторам. Круто? Сейчас разберёмся, как это работает.

🎯 Ты узнаешь: - Что такое векторное произведение и почему оно даёт вектор - Как вычислять векторное произведение (три способа!) - Геометрический смысл: площадь параллелограмма и ориентация в пространстве - Где это применяется в ML, computer vision и 3D-графике - Как использовать векторное произведение для вычисления нормалей, определения поворотов и проверки планарности точек


Что такое векторное произведение простыми словами

Интуиция: Третий вектор, перпендикулярный двум данным

Допустим, у тебя есть два вектора в 3D-пространстве. Скажем, один указывает на восток, другой — на север.

Вопрос: В каком направлении будет вектор, перпендикулярный ОБОИМ?

Ответ: вверх (или вниз)! Это и есть суть векторного произведения.

Векторное произведение двух векторов $\vec{a}$ и $\vec{b}$ — это операция, которая создаёт третий вектор $\vec{c}$, который: 1. Перпендикулярен и $\vec{a}$, и $\vec{b}$ 2. Его длина равна площади параллелограмма, построенного на $\vec{a}$ и $\vec{b}$ 3. Его направление определяется правилом правой руки

        ↑ вектор c = a × b
        |
        |
        +-------→ вектор a
       /
      / вектор b
     ↙

Аналогия из ML/AI

Представь, что ты работаешь с embedding-пространством. У тебя есть два feature-вектора: - $\vec{v_1}$ — характеризует “техничность” текста (много терминов, формул) - $\vec{v_2}$ — характеризует “эмоциональность” текста (восклицания, метафоры)

Векторное произведение $\vec{v_1} \times \vec{v_2}$ даст тебе новое направление в пространстве признаков, которое ортогонально обоим. Это может быть полезно для создания дополнительных признаков (feature engineering) или для понимания, какие измерения твоего пространства независимы.

В computer vision, когда ты работаешь с точками 3D-облака (point cloud), векторное произведение помогает: - Находить нормали к поверхностям - Определять ориентацию объектов - Вычислять освещение (для 3D-рендеринга)


Строгое определение

Определение: Векторным произведением (или внешним произведением, cross product) двух векторов $\vec{a}$ и $\vec{b}$ называется вектор $\vec{c} = \vec{a} \times \vec{b}$, который:

  1. Перпендикулярен как $\vec{a}$, так и $\vec{b}$: $\vec{c} \perp \vec{a}$ и $\vec{c} \perp \vec{b}$
  2. Его модуль (длина) равен: $|\vec{c}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$, где $\theta$ — угол между векторами
  3. Направление определяется правилом правой руки

Важно: Векторное произведение определено только для трёхмерного пространства (хотя есть обобщения для других размерностей).

Обозначения: - $\vec{a} \times \vec{b}$ — векторное произведение (читается “а крест б” или “а кросс б”) - $[\vec{a}, \vec{b}]$ — альтернативное обозначение (реже используется) - $|\vec{a} \times \vec{b}|$ — длина (модуль) векторного произведения

Почему sin, а не cos? В скалярном произведении был косинус: $\vec{a} \cdot \vec{b} = |\vec{a}| \cdot |\vec{b}| \cdot \cos\theta$

В векторном — синус: $|\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$

Причина: когда векторы параллельны ($\theta = 0°$), $\sin 0° = 0$, и векторное произведение равно нулю (что логично — нет уникального перпендикулярного направления). Когда векторы перпендикулярны ($\theta = 90°$), $\sin 90° = 1$, и произведение максимально.


Вычисление векторного произведения: три метода

Метод 1: Формула через координаты (самый практичный)

Пусть: $$\vec{a} = (a_x, a_y, a_z) = a_x\vec{i} + a_y\vec{j} + a_z\vec{k}$$ $$\vec{b} = (b_x, b_y, b_z) = b_x\vec{i} + b_y\vec{j} + b_z\vec{k}$$

Тогда векторное произведение:

$$\vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \ a_x & a_y & a_z \ b_x & b_y & b_z \end{vmatrix}$$

Раскрывая определитель по первой строке:

$$\vec{a} \times \vec{b} = \vec{i}(a_y b_z - a_z b_y) - \vec{j}(a_x b_z - a_z b_x) + \vec{k}(a_x b_y - a_y b_x)$$

Или покомпонентно:

$$\vec{c} = \vec{a} \times \vec{b} = (c_x, c_y, c_z)$$

где: - $c_x = a_y b_z - a_z b_y$ - $c_y = a_z b_x - a_x b_z$ - $c_z = a_x b_y - a_y b_x$

Как запомнить: Каждая компонента — это определитель 2×2 из “оставшихся” координат: - $c_x$: берём $y$ и $z$ (пропускаем $x$) - $c_y$: берём $x$ и $z$ (пропускаем $y$), но меняем знак! - $c_z$: берём $x$ и $y$ (пропускаем $z$)


Пример 1 (базовый): Векторное произведение простых векторов

Условие:
Найди векторное произведение $\vec{a} \times \vec{b}$, где: - $\vec{a} = (1, 2, 3)$ - $\vec{b} = (4, 5, 6)$

Решение:

Шаг 1: Запишем формулу для каждой компоненты

$$c_x = a_y b_z - a_z b_y$$ $$c_y = a_z b_x - a_x b_z$$ $$c_z = a_x b_y - a_y b_x$$

Шаг 2: Подставим значения для $c_x$: $$c_x = 2 \cdot 6 - 3 \cdot 5 = 12 - 15 = -3$$

Шаг 3: Вычислим $c_y$: $$c_y = 3 \cdot 4 - 1 \cdot 6 = 12 - 6 = 6$$

Шаг 4: Вычислим $c_z$: $$c_z = 1 \cdot 5 - 2 \cdot 4 = 5 - 8 = -3$$

Шаг 5: Собираем результат: $$\vec{a} \times \vec{b} = (-3, 6, -3)$$

Проверка (опционально): Проверим, что результат действительно перпендикулярен исходным векторам:

$$\vec{a} \cdot (\vec{a} \times \vec{b}) = 1 \cdot (-3) + 2 \cdot 6 + 3 \cdot (-3) = -3 + 12 - 9 = 0 \,\checkmark$$ $$\vec{b} \cdot (\vec{a} \times \vec{b}) = 4 \cdot (-3) + 5 \cdot 6 + 6 \cdot (-3) = -12 + 30 - 18 = 0 \,\checkmark$$

Скалярное произведение равно нулю — значит векторы перпендикулярны!

Ответ: $\vec{a} \times \vec{b} = (-3, 6, -3)$


Пример 2 (ML-контекст): Векторное произведение в feature space

Условие:
У тебя есть два feature-вектора из embedding-модели для текстов: - $\vec{f_1} = (0.8, 0.2, 0.1)$ — вектор “научного” стиля - $\vec{f_2} = (0.1, 0.9, 0.3)$ — вектор “разговорного” стиля

Найди вектор, ортогональный обоим (чтобы создать третий независимый признак).

Решение:

Шаг 1: Применяем формулу векторного произведения

$$\vec{f_3} = \vec{f_1} \times \vec{f_2}$$

Шаг 2: Вычисляем $x$-компоненту: $$f_{3x} = 0.2 \cdot 0.3 - 0.1 \cdot 0.9 = 0.06 - 0.09 = -0.03$$

Шаг 3: Вычисляем $y$-компоненту: $$f_{3y} = 0.1 \cdot 0.1 - 0.8 \cdot 0.3 = 0.01 - 0.24 = -0.23$$

Шаг 4: Вычисляем $z$-компоненту: $$f_{3z} = 0.8 \cdot 0.9 - 0.2 \cdot 0.1 = 0.72 - 0.02 = 0.70$$

Шаг 5: Результат: $$\vec{f_3} = (-0.03, -0.23, 0.70)$$

Интерпретация:
Этот новый вектор $\vec{f_3}$ представляет собой независимое направление в feature space, которое не коррелирует ни с “научностью”, ни с “разговорностью”. Его можно использовать как дополнительный признак в модели для повышения её мощности (dimensionality expansion).

Примечание: В реальном ML ты бы нормализовал этот вектор (привёл к единичной длине), чтобы его масштаб соответствовал другим признакам.

Ответ: $\vec{f_3} = (-0.03, -0.23, 0.70)$


Метод 2: Через определитель (более элегантный)

Векторное произведение можно записать как формальный определитель:

$$\vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \ a_x & a_y & a_z \ b_x & b_y & b_z \end{vmatrix}$$

Раскрываем по первой строке (по базисным векторам):

$$= \vec{i} \begin{vmatrix} a_y & a_z \ b_y & b_z \end{vmatrix} - \vec{j} \begin{vmatrix} a_x & a_z \ b_x & b_z \end{vmatrix} + \vec{k} \begin{vmatrix} a_x & a_y \ b_x & b_y \end{vmatrix}$$

Это тот же результат, что и в методе 1, просто записан компактнее.


Метод 3: Геометрический (через угол и нормаль)

Если ты знаешь: - Длины векторов $|\vec{a}|$ и $|\vec{b}|$ - Угол между ними $\theta$ - Направление нормали (через правило правой руки)

То можешь вычислить: $$|\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$$

И затем построить вектор нужной длины в перпендикулярном направлении.

Этот метод удобен для: - Теоретических выкладок - Оценки порядка величины - Геометрических задач


Пример 3 (геометрический): Вычисление через углы

Условие:
Два вектора имеют длины $|\vec{a}| = 5$ и $|\vec{b}| = 3$, угол между ними $\theta = 30°$. Найди длину их векторного произведения.

Решение:

Шаг 1: Используем формулу для модуля: $$|\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$$

Шаг 2: Подставляем значения: $$|\vec{a} \times \vec{b}| = 5 \cdot 3 \cdot \sin(30°)$$

Шаг 3: Вычисляем ($\sin 30° = 0.5$): $$|\vec{a} \times \vec{b}| = 5 \cdot 3 \cdot 0.5 = 7.5$$

Интерпретация:
Длина векторного произведения равна 7.5. Это также площадь параллелограмма, построенного на векторах $\vec{a}$ и $\vec{b}$.

Ответ: $|\vec{a} \times \vec{b}| = 7.5$


Правило правой руки: определяем направление

Векторное произведение не коммутативно: $\vec{a} \times \vec{b} \neq \vec{b} \times \vec{a}$

Более того: $\vec{b} \times \vec{a} = -(\vec{a} \times \vec{b})$ — результаты противоположны!

Как определить направление? Правило правой руки:

  1. Вытяни правую руку
  2. Направь пальцы вдоль первого вектора $\vec{a}$
  3. Согни пальцы в сторону второго вектора $\vec{b}$
  4. Большой палец (отставленный) покажет направление $\vec{a} \times \vec{b}$

     ↑ большой палец
     | (результат a×b)
     |
     +---→ пальцы вдоль a
    /
    ↙ сгибаем к b
    

Мнемоника: “ОТ первого КО второму, большой палец — результат”


Пример 4 (правило правой руки): Проверка направления

Условие:
Даны векторы $\vec{a} = (1, 0, 0)$ (вдоль оси X) и $\vec{b} = (0, 1, 0)$ (вдоль оси Y). Найди $\vec{a} \times \vec{b}$ и определи его направление.

Решение:

Шаг 1: Вычислим компоненты: $$c_x = a_y b_z - a_z b_y = 0 \cdot 0 - 0 \cdot 1 = 0$$ $$c_y = a_z b_x - a_x b_z = 0 \cdot 0 - 1 \cdot 0 = 0$$ $$c_z = a_x b_y - a_y b_x = 1 \cdot 1 - 0 \cdot 0 = 1$$

Шаг 2: Результат: $$\vec{a} \times \vec{b} = (0, 0, 1)$$

Это вектор вдоль оси Z!

Проверка правилом правой руки: - Пальцы вдоль X (первый вектор) - Сгибаем к Y (второй вектор) - Большой палец указывает на +Z ✓

Геометрический смысл: Векторы X и Y лежат в плоскости XY, их векторное произведение перпендикулярно этой плоскости — то есть направлено вдоль Z.

Важно: Если бы мы вычисляли $\vec{b} \times \vec{a}$, получили бы $(0, 0, -1)$ — направление противоположное!

Ответ: $\vec{a} \times \vec{b} = (0, 0, 1)$ (единичный вектор вдоль оси Z)


Свойства векторного произведения

1. Антикоммутативность

$$\vec{a} \times \vec{b} = -(\vec{b} \times \vec{a})$$

Порядок важен! Меняешь местами векторы — меняется направление результата.

2. Дистрибутивность относительно сложения

$$\vec{a} \times (\vec{b} + \vec{c}) = \vec{a} \times \vec{b} + \vec{a} \times \vec{c}$$ $$(\vec{a} + \vec{b}) \times \vec{c} = \vec{a} \times \vec{c} + \vec{b} \times \vec{c}$$

3. Ассоциативность со скалярами

$$(\lambda \vec{a}) \times \vec{b} = \lambda(\vec{a} \times \vec{b}) = \vec{a} \times (\lambda \vec{b})$$

Скаляр можно выносить за знак произведения.

4. Произведение параллельных векторов — нулевой вектор

$$\vec{a} \parallel \vec{b} \Rightarrow \vec{a} \times \vec{b} = \vec{0}$$

В частности: $\vec{a} \times \vec{a} = \vec{0}$

5. Базисные векторы

$$\vec{i} \times \vec{j} = \vec{k}$$ $$\vec{j} \times \vec{k} = \vec{i}$$ $$\vec{k} \times \vec{i} = \vec{j}$$

Циклический порядок: $i \to j \to k \to i \to …$

И обратный порядок меняет знак: $$\vec{j} \times \vec{i} = -\vec{k}$$ $$\vec{k} \times \vec{j} = -\vec{i}$$ $$\vec{i} \times \vec{k} = -\vec{j}$$


Пример 5 (свойства): Использование дистрибутивности

Условие:
Вычисли $\vec{a} \times \vec{b}$, где $\vec{a} = 2\vec{i} + 3\vec{j}$ и $\vec{b} = \vec{i} - \vec{k}$, используя свойства векторного произведения.

Решение:

Шаг 1: Раскроем произведение по дистрибутивности: $$\vec{a} \times \vec{b} = (2\vec{i} + 3\vec{j}) \times (\vec{i} - \vec{k})$$

$$= 2\vec{i} \times \vec{i} + 2\vec{i} \times (-\vec{k}) + 3\vec{j} \times \vec{i} + 3\vec{j} \times (-\vec{k})$$

Шаг 2: Упростим каждое слагаемое: - $2\vec{i} \times \vec{i} = 2 \cdot \vec{0} = \vec{0}$ (вектор сам на себя) - $2\vec{i} \times (-\vec{k}) = -2(\vec{i} \times \vec{k}) = -2(-\vec{j}) = 2\vec{j}$ - $3\vec{j} \times \vec{i} = 3(-\vec{k}) = -3\vec{k}$ - $3\vec{j} \times (-\vec{k}) = -3(\vec{j} \times \vec{k}) = -3\vec{i}$

Шаг 3: Сложим все слагаемые: $$\vec{a} \times \vec{b} = \vec{0} + 2\vec{j} - 3\vec{k} - 3\vec{i}$$ $$= -3\vec{i} + 2\vec{j} - 3\vec{k}$$ $$= (-3, 2, -3)$$

Проверка прямым методом: $$\vec{a} = (2, 3, 0), \quad \vec{b} = (1, 0, -1)$$ $$c_x = 3 \cdot (-1) - 0 \cdot 0 = -3 \quad \checkmark$$ $$c_y = 0 \cdot 1 - 2 \cdot (-1) = 2 \quad \checkmark$$ $$c_z = 2 \cdot 0 - 3 \cdot 1 = -3 \quad \checkmark$$

Ответ: $\vec{a} \times \vec{b} = (-3, 2, -3)$


Геометрический смысл: площадь параллелограмма

Ключевая идея: Модуль векторного произведения равен площади параллелограмма, построенного на двух векторах как на сторонах.

$$S_{\text{параллелограмм}} = |\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$$

      b
     ↗
    /
   /
  +-------→ a
  |      /
  |    /
  |  / высота h = |b|sin(θ)
  |/
  
Площадь = основание × высота = |a| × |b|sin(θ)

Следствие: Площадь треугольника, построенного на векторах $\vec{a}$ и $\vec{b}$: $$S_{\text{треугольник}} = \frac{1}{2}|\vec{a} \times \vec{b}|$$

Применение в computer vision: - Вычисление площадей полигонов в 3D-моделях - Определение видимости граней (face culling) - Расчёт освещения (площадь влияет на интенсивность)


Пример 6 (геометрия): Площадь треугольника в 3D

Условие (реалистичный CV-кейс):
У тебя есть point cloud (облако точек) трёх вершин треугольника на 3D-модели: - $A = (1, 0, 0)$ - $B = (0, 2, 0)$ - $C = (0, 0, 3)$

Найди площадь этого треугольника.

Решение:

Шаг 1: Построим векторы из точки A к двум другим: $$\vec{AB} = B - A = (0, 2, 0) - (1, 0, 0) = (-1, 2, 0)$$ $$\vec{AC} = C - A = (0, 0, 3) - (1, 0, 0) = (-1, 0, 3)$$

Шаг 2: Найдём векторное произведение: $$\vec{AB} \times \vec{AC} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \ -1 & 2 & 0 \ -1 & 0 & 3 \end{vmatrix}$$

$$c_x = 2 \cdot 3 - 0 \cdot 0 = 6$$ $$c_y = 0 \cdot (-1) - (-1) \cdot 3 = 3$$ $$c_z = (-1) \cdot 0 - 2 \cdot (-1) = 2$$

$$\vec{AB} \times \vec{AC} = (6, 3, 2)$$

Шаг 3: Найдём модуль: $$|\vec{AB} \times \vec{AC}| = \sqrt{6^2 + 3^2 + 2^2} = \sqrt{36 + 9 + 4} = \sqrt{49} = 7$$

Шаг 4: Площадь треугольника: $$S = \frac{1}{2} |\vec{AB} \times \vec{AC}| = \frac{7}{2} = 3.5$$

Применение:
В 3D-графике (например, рендеринг mesh) эта формула используется миллионы раз в секунду для вычисления освещения, детекции коллизий, расчёта нормалей.

Ответ: Площадь треугольника = 3.5 квадратных единиц


Применения векторного произведения в ML/AI и программировании

1. Computer Vision: вычисление нормалей к поверхностям

Зачем: Нормаль (перпендикуляр к поверхности) нужна для: - Расчёта освещения (Phong shading, Lambert’s law) - Определения видимости (backface culling) - Сегментации поверхностей в point clouds

Как: Для треугольника с вершинами A, B, C: $$\vec{n} = \vec{AB} \times \vec{AC}$$

После нормализации (приведение к единичной длине): $$\vec{n}_{\text{norm}} = \frac{\vec{n}}{|\vec{n}|}$$

Код (псевдо-Python):

def compute_normal(A, B, C):
    AB = B - A
    AC = C - A
    normal = np.cross(AB, AC)
    return normal / np.linalg.norm(normal)

2. Определение планарности точек

Задача: Проверить, лежат ли четыре точки в одной плоскости.

Метод: Если векторы $\vec{AB}$, $\vec{AC}$, $\vec{AD}$ компланарны, то смешанное произведение: $$(\vec{AB} \times \vec{AC}) \cdot \vec{AD} = 0$$

Используем векторное произведение для построения нормали к плоскости, затем скалярное для проверки.

3. Робототехника: момент силы (torque)

В физике и робототехнике момент силы: $$\vec{\tau} = \vec{r} \times \vec{F}$$

где $\vec{r}$ — радиус-вектор (плечо), $\vec{F}$ — сила.

Это критично для управления роботами-манипуляторами, квадрокоптерами, автономными машинами.

4. Feature engineering: создание ортогональных признаков

Если два признака коррелируют, их векторное произведение даёт ортогональное направление в feature space. Это может улучшить разделимость классов.

Пример:
Feature1: размер изображения (пиксели)
Feature2: яркость (0-255)
Cross-product feature: новое измерение, некоррелирующее с предыдущими


Пример 7 (ML-практика): Вычисление нормали для 3D-рендеринга

Условие (реальный кейс из Unity/Unreal):
У тебя есть треугольный полигон на 3D-модели персонажа: - Вершина 1: $(2, 1, 0)$ - Вершина 2: $(3, 4, 1)$ - Вершина 3: $(1, 3, 2)$

Найди нормаль к этой поверхности (для расчёта освещения).

Решение:

Шаг 1: Построим два вектора на плоскости треугольника: $$\vec{v_1} = (3, 4, 1) - (2, 1, 0) = (1, 3, 1)$$ $$\vec{v_2} = (1, 3, 2) - (2, 1, 0) = (-1, 2, 2)$$

Шаг 2: Векторное произведение даёт нормаль: $$\vec{n} = \vec{v_1} \times \vec{v_2}$$

$$n_x = 3 \cdot 2 - 1 \cdot 2 = 6 - 2 = 4$$ $$n_y = 1 \cdot (-1) - 1 \cdot 2 = -1 - 2 = -3$$ $$n_z = 1 \cdot 2 - 3 \cdot (-1) = 2 + 3 = 5$$

$$\vec{n} = (4, -3, 5)$$

Шаг 3: Нормализуем (приводим к единичной длине): $$|\vec{n}| = \sqrt{4^2 + (-3)^2 + 5^2} = \sqrt{16 + 9 + 25} = \sqrt{50} \approx 7.07$$

$$\vec{n}_{\text{norm}} = \left(\frac{4}{7.07}, \frac{-3}{7.07}, \frac{5}{7.07}\right) \approx (0.566, -0.424, 0.707)$$

Применение:
Эта нормализованная нормаль используется в shaders для расчёта освещения по формулам типа: $$I = I{\text{ambient}} + I{\text{diffuse}} \cdot (\vec{n} \cdot \vec{L})$$

где $\vec{L}$ — направление на источник света.

Ответ: Нормаль $\vec{n} = (4, -3, 5)$, нормализованная: $(0.566, -0.424, 0.707)$


Практика: 30 заданий

Базовые (задания 1-10)

Задание 1: Найди векторное произведение $\vec{a} \times \vec{b}$, где $\vec{a} = (1, 0, 0)$, $\vec{b} = (0, 1, 0)$.


Задание 2: Вычисли $\vec{a} \times \vec{b}$, если $\vec{a} = (2, 0, 0)$, $\vec{b} = (0, 3, 0)$.


Задание 3: Найди $\vec{b} \times \vec{a}$ для векторов из задания 1. Сравни с результатом задания 1.


Задание 4: Вычисли $\vec{a} \times \vec{b}$, где $\vec{a} = (1, 2, 0)$, $\vec{b} = (0, 0, 3)$.


Задание 5: Найди длину векторного произведения $|\vec{a} \times \vec{b}|$ для $\vec{a} = (3, 0, 0)$, $\vec{b} = (0, 4, 0)$.


Задание 6: Проверь, параллельны ли векторы $\vec{a} = (2, 4, 6)$ и $\vec{b} = (1, 2, 3)$, вычислив их векторное произведение.


Задание 7: Вычисли $3\vec{a} \times \vec{b}$, где $\vec{a} = (1, 1, 0)$, $\vec{b} = (0, 1, 1)$.


Задание 8: Найди площадь параллелограмма, построенного на векторах $\vec{a} = (2, 0, 0)$ и $\vec{b} = (0, 3, 0)$.


Задание 9: Вычисли $\vec{i} \times \vec{k}$, где $\vec{i}$ и $\vec{k}$ — стандартные базисные векторы.


Задание 10: Найди векторное произведение $\vec{a} \times \vec{b}$, если $\vec{a} = (1, 1, 1)$, $\vec{b} = (2, 2, 2)$.


Средние (задания 11-20)

Задание 11: Найди площадь треугольника с вершинами A(1, 0, 0), B(0, 1, 0), C(0, 0, 1).


Задание 12 (ML-кейс): У тебя есть два embedding-вектора: $\vec{e_1} = (0.5, 0.5, 0.5)$ (нейтральный тон) и $\vec{e_2} = (1, 0, 0)$ (агрессивный тон). Создай ортогональный вектор $\vec{e_3}$ через векторное произведение и нормализуй его.


Задание 13: Вычисли $(\vec{a} + \vec{b}) \times \vec{c}$, где $\vec{a} = (1, 0, 0)$, $\vec{b} = (0, 1, 0)$, $\vec{c} = (0, 0, 1)$.


Задание 14: Найди единичный вектор, перпендикулярный векторам $\vec{a} = (1, 2, 3)$ и $\vec{b} = (4, 5, 6)$.


Задание 15: Вычисли модуль векторного произведения для векторов длиной 5 и 8 под углом 45°.


Задание 16 (робототехника): Манипулятор робота имеет плечо $\vec{r} = (0.3, 0, 0)$ м (30 см вдоль X). К концу приложена сила $\vec{F} = (0, 0, -10)$ Н (вниз). Найди момент силы (torque) $\vec{\tau} = \vec{r} \times \vec{F}$.


Задание 17: Проверь, компланарны ли векторы $\vec{a} = (1, 0, 0)$, $\vec{b} = (0, 1, 0)$, $\vec{c} = (1, 1, 0)$.


Задание 18: Найди $\vec{a} \times (\vec{b} \times \vec{c})$, где $\vec{a} = \vec{i}$, $\vec{b} = \vec{j}$, $\vec{c} = \vec{k}$.


Задание 19: Вычисли площадь четырёхугольника ABCD, если известны векторы диагоналей: $\vec{AC} = (4, 0, 0)$ и $\vec{BD} = (0, 3, 0)$.


Задание 20 (CV-практика): В компьютерной графике есть три точки на экране: P1(100, 200, 0), P2(150, 250, 0), P3(200, 200, 0) (пиксели). Определи, является ли порядок обхода по часовой или против часовой стрелки (для backface culling).


Продвинутые (задания 21-30)

Задание 21 (нейронные сети): В градиентном спуске для обучения нейросетей иногда используют векторные операции для регуляризации. Пусть градиент функции потерь $\vec{g} = (0.5, 0.3, 0.1)$, а направление предыдущего шага $\vec{p} = (0.2, 0.6, 0.1)$. Найди компоненту градиента, перпендикулярную $\vec{p}$, используя векторное произведение (полезно для momentum methods).


Задание 22: Докажи, что для любых векторов $\vec{a}$ и $\vec{b}$ выполнено: $\vec{a} \times \vec{b} = -(\vec{b} \times \vec{a})$.


Задание 23 (3D-графика): В 3D-движке нужно определить, видна ли грань полигона с камеры. Даны вершины грани: A(1, 2, 3), B(2, 3, 4), C(3, 2, 3). Позиция камеры: V(0, 0, 0). Определи видимость (грань видна, если нормаль направлена к камере).


Задание 24: Вычисли $(\vec{a} \times \vec{b}) \cdot (\vec{c} \times \vec{d})$, где $\vec{a} = (1, 0, 0)$, $\vec{b} = (0, 1, 0)$, $\vec{c} = (0, 0, 1)$, $\vec{d} = (1, 1, 0)$.


Задание 25 (физика): Частица движется в магнитном поле. Сила Лоренца: $\vec{F} = q(\vec{v} \times \vec{B})$, где $q = 1.6 \times 10^{-19}$ Кл (заряд электрона), $\vec{v} = (10^6, 0, 0)$ м/с (скорость), $\vec{B} = (0, 0.1, 0)$ Тл (магнитное поле). Найди силу.


Задание 26: Найди объём параллелепипеда, построенного на векторах $\vec{a} = (1, 0, 0)$, $\vec{b} = (0, 2, 0)$, $\vec{c} = (0, 0, 3)$ (используй смешанное произведение через векторное).


Задание 27 (точка в треугольнике): Проверь, лежит ли точка P(1, 1, 0) внутри треугольника с вершинами A(0, 0, 0), B(2, 0, 0), C(0, 2, 0) (используй векторное произведение для проверки ориентации).


Задание 28 (оптимизация): В методе Ньютона для оптимизации иногда используют векторное произведение для построения ортогональных базисов. Даны два вектора: $\vec{v_1} = (1, 1, 0)$, $\vec{v_2} = (1, -1, 2)$. Построй ортонормированный базис, используя векторное произведение (Gram-Schmidt процесс).


Задание 29 (углубленное): Докажи тождество Якоби для векторного произведения: $$\vec{a} \times (\vec{b} \times \vec{c}) + \vec{b} \times (\vec{c} \times \vec{a}) + \vec{c} \times (\vec{a} \times \vec{b}) = \vec{0}$$


Задание 30 (финальное, комплексное): Реализуй на псевдокоде (Python-подобном) функцию для вычисления освещённости точки поверхности 3D-модели (Lambertian shading), используя векторное произведение для нахождения нормали.

Дано: - Три вершины треугольника: A, B, C - Точка освещения: L - Интенсивность света: I₀


Частые ошибки

Ошибка 1: Неправильный порядок операций в формуле
Неправильно: При вычислении $c_y$ ученик пишет $c_y = a_x b_z - a_z b_x$ (забыл поменять порядок)
Правильно: $c_y = a_z b_x - a_x b_z$ (меняем порядок для средней компоненты!)
Почему важно: Это приведёт к неправильному знаку компоненты, и вектор будет указывать не в ту сторону. В графике это может привести к инверсии освещения (тёмные места станут светлыми и наоборот).


Ошибка 2: Путаница скалярного и векторного произведения
Неправильно: “Векторное произведение двух перпендикулярных векторов равно 0” (это верно для скалярного!)
Правильно: Векторное произведение перпендикулярных векторов максимально (равно $|\vec{a}| \cdot |\vec{b}|$, так как $\sin 90° = 1$). Ноль получается для параллельных векторов.
Почему важно: Полная противоположность! Перпендикулярные векторы дают нулевое скалярное произведение, но максимальное векторное.


Ошибка 3: Игнорирование правила правой руки
Неправильно: Считать, что $\vec{a} \times \vec{b} = \vec{b} \times \vec{a}$ (коммутативность)
Правильно: $\vec{a} \times \vec{b} = -(\vec{b} \times \vec{a})$ (антикоммутативность!)
Почему важно: В 3D-графике от этого зависит, какая сторона полигона считается “лицевой”, а какая “задней”. Ошибка приведёт к тому, что объекты будут отрисовываться наизнанку (backface culling сработает неправильно).


Ошибка 4: Забывание о том, что результат — ВЕКТОР
Неправильно: Записать результат как число: “$\vec{a} \times \vec{b} = 5$”
Правильно: Результат всегда вектор: $\vec{a} \times \vec{b} = (c_x, c_y, c_z)$. Если нужно число — берём модуль: $|\vec{a} \times \vec{b}|$
Почему важно: Путаница приведёт к ошибкам в дальнейших вычислениях. Векторное произведение — это вектор с направлением.


Ошибка 5: Применение к не-3D векторам
Неправильно: Пытаться вычислить векторное произведение для 2D-векторов $(x, y)$ или 4D-векторов
Правильно: Векторное произведение классически определено только для 3D. Для 2D используй “псевдоскалярное” произведение: $a_x b_y - a_y b_x$ (даёт число, не вектор). Для высших размерностей есть обобщения, но это уже другая математика.
Почему важно: В ML ты часто работаешь с векторами размерности 128, 256, 512… Векторное произведение к ним напрямую не применимо. Используй скалярное произведение, косинусную близость и т.д.


Главное запомнить

📝 Ключевые понятия

Что такое векторное произведение: Операция, которая из двух векторов $\vec{a}$ и $\vec{b}$ создаёт третий вектор $\vec{c} = \vec{a} \times \vec{b}$, перпендикулярный обоим исходным.

Формула для вычисления: - $c_x = a_y b_z - a_z b_y$ - $c_y = a_z b_x - a_x b_z$ (обрати внимание на порядок!) - $c_z = a_x b_y - a_y b_x$

Модуль векторного произведения: $|\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$ — это площадь параллелограмма, построенного на векторах.

Правило правой руки: Определяет направление результата. Пальцы от $\vec{a}$ к $\vec{b}$, большой палец — результат.

Антикоммутативность: $\vec{a} \times \vec{b} = -(\vec{b} \times \vec{a})$ — порядок векторов важен! Меняешь местами — меняется направление.

Параллельные векторы: Если $\vec{a} \parallel \vec{b}$, то $\vec{a} \times \vec{b} = \vec{0}$. В частности, $\vec{a} \times \vec{a} = \vec{0}$.

Перпендикулярные векторы: Для них $\sin 90° = 1$, поэтому $|\vec{a} \times \vec{b}| = |\vec{a}| \cdot |\vec{b}|$ (максимально).

Базисные векторы: $\vec{i} \times \vec{j} = \vec{k}$, $\vec{j} \times \vec{k} = \vec{i}$, $\vec{k} \times \vec{i} = \vec{j}$ (циклический порядок).

Геометрический смысл: Длина векторного произведения = площадь параллелограмма. Для треугольника: $S = \frac{1}{2}|\vec{a} \times \vec{b}|$.

Применение в CV: Вычисление нормалей к поверхностям (для освещения и рендеринга), определение видимости граней, расчёт площадей полигонов.

Применение в физике: Момент силы $\vec{\tau} = \vec{r} \times \vec{F}$, сила Лоренца $\vec{F} = q(\vec{v} \times \vec{B})$, угловая скорость $\vec{\omega}$ в динамике вращения.

Только для 3D: Классическое векторное произведение определено только в трёхмерном пространстве. Для других размерностей есть обобщения, но они редко встречаются на практике.


Связь с другими темами курса

Что нужно было знать до этого урока: - Скалярное произведение векторов — для понимания разницы между “произведение даёт число” vs “произведение даёт вектор”. Также для проверки перпендикулярности результата. - Базовые операции с векторами — сложение, вычитание, умножение на скаляр. Это база для всех векторных операций. - Координаты и базис — понимание, что любой вектор можно разложить по базисным векторам $\vec{i}, \vec{j}, \vec{k}$. - Основы геометрии — понятия площади, параллелограмма, треугольника, перпендикулярности.

Что изучить дальше: - Смешанное произведение векторов — комбинация скалярного и векторного произведения: $(\vec{a} \times \vec{b}) \cdot \vec{c}$. Используется для вычисления объёмов, проверки компланарности точек. - Тензоры — обобщение векторов и матриц. В глубоком обучении все операции — это тензорные операции (вектора — тензоры ранга 1). - Линейные преобразования — матрицы поворота, отражения, проекции. Векторное произведение связано с кососимметричными матрицами. - Дифференциальная геометрия — кривизна, кручение кривых и поверхностей. Векторное произведение используется для определения касательных и нормалей.

Где это нужно в жизни:

В ML/AI: - 🤖 Feature Engineering: Создание ортогональных признаков в многомерном пространстве - 🎨 Computer Vision: Вычисление нормалей для 3D-реконструкции из point clouds (SLAM, NeRF) - 🤖 Робототехника: Расчёт моментов сил для управления манипуляторами и квадрокоптерами - 📊 Data Science: Определение линейной независимости признаков (через векторное произведение можно проверить, лежат ли вектора в одной плоскости)

В программировании: - 💻 3D-графика: Рендеринг полигонов (Unity, Unreal Engine, WebGL) — каждый кадр миллионы векторных произведений для вычисления освещения - 🎮 Игровая физика: Расчёт коллизий, траекторий, вращений объектов (Unity Physics, Bullet Physics) - 🗺️ GIS и картография: Определение положения точек относительно линий, построение буферных зон

В науке и инженерии: - 🔬 Физика: Электромагнетизм (сила Лоренца), механика (момент силы, угловая скорость), квантовая механика (спин, момент импульса) - ✈️ Аэродинамика: Расчёт подъёмной силы, давления на поверхности (важно для дронов, самолётов) - 🏗️ Инженерия: Статика и динамика конструкций (моменты сил на балках, фермах)


Интересные факты

💡 Почему именно правая рука? Правило правой руки — это соглашение (convention), а не физический закон. Математически можно было бы определить векторное произведение через левую руку, и вся физика бы работала так же (это называлось бы “левоориентированная система координат”). Но исторически правая рука стала стандартом, и теперь все используют её для согласованности.

💡 Связь с кватернионами: Векторное произведение тесно связано с кватернионами — расширением комплексных чисел для 3D-вращений. Многие 3D-движки (Unity, Unreal) внутри используют кватернионы именно потому, что они позволяют элегантно работать с вращениями без проблем гимбал-блокировки (gimbal lock). А сами кватернионы были открыты Уильямом Гамильтоном в 1843 году — он шёл по мосту и внезапно понял формулу $i^2 = j^2 = k^2 = ijk = -1$, после чего выгравировал её на мосту перочинным ножом!

💡 Нет аналога в 2D: В двумерном пространстве векторное произведение не существует в привычном виде. Можно определить “псевдоскалярное” произведение (cross product magnitude): $a_x b_y - a_y b_x$, которое даёт не вектор, а число — площадь параллелограмма со знаком. Это полезно в компьютерной графике для определения, с какой стороны от прямой находится точка.

💡 В 7D тоже работает! Хотя векторное произведение классически определено в 3D, существует обобщение для 7-мерного пространства (да, именно 7, не 4, не 5!). Это связано с октонионами — ещё одним расширением кватернионов. Почему именно 7? Это математически уникальная размерность, где можно определить операцию, аналогичную векторному произведению, сохраняющую антикоммутативность и билинейность.

💡 Применение в нейронных сетях: В некоторых архитектурах graph neural networks (GNN) для работы с 3D-данными (например, молекулярные структуры) векторное произведение используется как один из слоёв для создания эквивариантных (equivariant) представлений. Это означает, что если ты повернёшь входные данные, выходные повернутся точно так же — важное свойство для работы с 3D-объектами.

💡 Самый известный пример в программировании: Вероятно, самое частое применение векторного произведения — это вычисление нормалей в шейдерах. Каждый раз, когда ты видишь реалистичное освещение в игре или 3D-приложении, за кулисами миллионы раз в секунду вычисляется векторное произведение для определения, как свет падает на каждый пиксель. Вот почему GPU так хорошо оптимизированы для этой операции — она буквально критична для графики.


Лайфхаки и полезные трюки

1. Мнемоника для запоминания порядка компонент
Вместо того чтобы запоминать формулы, запомни правило: “берём то, что остаётся, когда убираем текущую ось”: - Для $c_x$: убираем x-компоненты → берём yz: $c_x = a_y b_z - a_z b_y$ - Для $c_y$: убираем y-компоненты → берём xz: $c_y = a_z b_x - a_x b_z$ (и меняем знак!) - Для $c_z$: убираем z-компоненты → берём xy: $c_z = a_x b_y - a_y b_x$

Пример: Вычисляя $c_y$, думай: “Нет y → беру x и z → сначала z от первого вектора ($a_z b_x$), потом x от первого ($a_x b_z$), но с минусом!”


2. Быстрая проверка перпендикулярности результата
После вычисления $\vec{c} = \vec{a} \times \vec{b}$ всегда можно проверить правильность: посчитай $\vec{a} \cdot \vec{c}$ и $\vec{b} \cdot \vec{c}$ (скалярные произведения). Оба должны быть равны 0.

Лайфхак: В экзаменационной ситуации или на интервью это демонстрирует твоё понимание и внимательность.


3. Оценка порядка величины без калькулятора
Если нужно быстро оценить $|\vec{a} \times \vec{b}|$, не вычисляя точно: - Оцени длины векторов: $|\vec{a}| \approx …$, $|\vec{b}| \approx …$ - Оцени угол: перпендикулярны ли? параллельны? под 45°? - Используй $|\vec{a} \times \vec{b}| \approx |\vec{a}| \cdot |\vec{b}| \cdot \sin\theta$

Пример: $\vec{a} = (3, 4, 0)$, $\vec{b} = (0, 5, 12)$ — векторы почти перпендикулярны (разные компоненты). $|\vec{a}| = 5$, $|\vec{b}| = 13$, $\sin 90° = 1$ → результат примерно 65.


4. Код-сниппет для Python/NumPy (запомни наизусть)

import numpy as np

# Векторное произведение
c = np.cross(a, b)

# Проверка перпендикулярности
assert np.isclose(np.dot(a, c), 0)
assert np.isclose(np.dot(b, c), 0)

# Нормализация (приведение к единичной длине)
c_norm = c / np.linalg.norm(c)

Этот код ты будешь использовать снова и снова в CV, робототехнике, 3D-графике.


5. Трюк с определителем (для аналитических выкладок)
Когда пишешь математические выкладки (статьи, доказательства), использу формальный определитель — это компактнее:

$$\vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \ a_x & a_y & a_z \ b_x & b_y & b_z \end{vmatrix}$$

Так сразу видна структура, и меньше шансов ошибиться в знаках.


6. Векторное произведение = 0 → параллельность (тест в одну строку)
Нужно проверить, параллельны ли векторы? Вычисли $|\vec{a} \times \vec{b}|$. Если близко к 0 (с учётом погрешности float) → параллельны.

def are_parallel(a, b, tolerance=1e-9):
    return np.linalg.norm(np.cross(a, b)) < tolerance

Это быстрее, чем проверять отношения компонент ($\frac{a_x}{b_x} = \frac{a_y}{b_y} = \frac{a_z}{b_z}$), где могут быть деления на ноль.


7. Направление нормали: правая vs левая сторона
В 3D-графике порядок обхода вершин треугольника определяет, какая сторона “лицевая”: - Обход против часовой (counter-clockwise, CCW): нормаль смотрит на тебя (лицевая сторона) - Обход по часовой (clockwise, CW): нормаль смотрит от тебя (задняя сторона)

Лайфхак: Если рендер показывает объекты “наизнанку” — проверь порядок вершин в векторном произведении!


8. Формула “бац минус цаб” (для двойного векторного произведения)
Двойное векторное произведение $\vec{a} \times (\vec{b} \times \vec{c})$ вычисляется через: $$\vec{a} \times (\vec{b} \times \vec{c}) = \vec{b}(\vec{a} \cdot \vec{c}) - \vec{c}(\vec{a} \cdot \vec{b})$$

Мнемоника: “бац минус цаб” (первые буквы: $\vec{b}$, $\vec{a}$, $\vec{c}$ → $\vec{b}…\vec{c}$)

Это экономит кучу времени при аналитических выкладках в механике и электродинамике!


9. Площадь многоугольника в 3D (трюк с разбиением)
Для произвольного многоугольника в 3D (не только треугольника): 1. Выбери одну вершину как “центр” 2. Раздели многоугольник на треугольники из этого центра 3. Вычисли площадь каждого треугольника через $\frac{1}{2}|\vec{a} \times \vec{b}|$ 4. Сложи все площади

Работает для любого выпуклого и даже невыпуклого многоугольника!


10. Оптимизация в коде: только z-компонента (для 2D-задач в 3D)
Если работаешь с “2D” векторами, где z-компонента = 0 (например, точки на экране $(x, y, 0)$), тебе нужна только z-компонента результата:

def cross_2d_z(a, b):
    """Быстрое вычисление z-компоненты для 2D-векторов"""
    return a[0] * b[1] - a[1] * b[0]

Это в 3 раза быстрее, чем полное векторное произведение — критично для real-time графики!


💡 Совет: Векторное произведение — это не просто формула для зубрёжки. Это геометрическая интуиция: “какой вектор перпендикулярен этим двум?”. Когда ты смотришь на два вектора в пространстве, старайся визуализировать, куда будет направлен их cross product (правило правой руки!). Эта интуиция критически важна в 3D-программировании, робототехнике, компьютерной графике.

Следующий шаг: Теперь, когда ты понимаешь векторное произведение, изучи смешанное произведение $(\vec{a} \times \vec{b}) \cdot \vec{c}$ — комбинация векторного и скалярного произведения, которая даёт объём параллелепипеда. Это следующий уровень векторной алгебры!

🚀 И помни: Каждый раз, когда ты играешь в 3D-игру, видишь реалистичное освещение или используешь AR-фильтр в Instagram — за кулисами GPU вычисляет миллионы векторных произведений в секунду. Теперь ты понимаешь, как это работает на математическом уровне!

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!