Движение снаряда с квадратным сопротивлением

Я рассчитал формулы с одномерным движением по траектории (свободное падение), включая квадратичное сопротивление, и составил следующие уравнения.Формула создана

Эти уравнения движения сами по себе бесполезны, поэтому мне нужен либо аналитический метод, либо численный метод, чтобы построить двумерное движение снаряда на графике, y против x. Однако мне известно, что уравнения движения двумерных снарядов следующие:

м * а Икс "=" к * в Икс 2 + в у 2 * в Икс
м * а у "=" м г к * в Икс 2 + в у 2 * в у
Я понял, что из-за того, что формулы имеют круговую ссылку, общего решения не будет, поэтому нет аналитического метода для построения этого графика, так как сопротивление в направлении x замедлит снаряд и изменит сопротивление в направлении Y, а также наоборот.

Значит, вот тут я не знаю подхода к задаче, не очень знаком с численными методами решения уравнений. Есть ли способ сделать это в электронной таблице или в MATLAB, сохраняя высокий уровень точности (если возможно, используя RK4).

Примечание: x-скорость ориентирована справа, а y-скорость направлена ​​прямо вверх.

Пожалуйста, поправьте меня, если я допустил какие-либо ошибки.

Двумерное квадратичное сопротивление также рассматривалось в этом посте Phys.SE и ссылках в нем.
Я предлагаю искать на velocity verletи verlet velocityна этом сайте. есть много ответов, которые говорят об этом, и это намного проще реализовать, чем RK4. В Википедии тоже есть информация об этом.

Ответы (1)

В основном у вас есть два ОДУ для решения:

(1) д в мю д т "=" 1 м Ф ( Икс мю , в мю ) (2) д Икс мю д т "=" в мю
что в значительной степени относится к большинству сил в ньютоновской механике. Чтобы решить это численно, вы хотите дискретизировать пространство и время . С такой системой, как (1) и (2), нам действительно нужно беспокоиться только о сокращении времени.

Одной из наиболее стабильных подпрограмм на самом деле является не RK4, а разновидность интеграции чехарды , называемая скоростью verlet . Это превращает (1) и (2) в многоэтапный процесс:

а 1 мю "=" Ф ( Икс я мю ) / м Икс я + 1 мю "=" Икс я мю + ( в я + 1 2 а 1 мю Δ т ) Δ т а 2 мю "=" Ф ( Икс я + 1 мю ) / м в я + 1 мю "=" в я мю + 1 2 ( а 1 мю + а 2 мю ) Δ т
который на самом деле довольно легко реализовать численно, он буквально просто вызывает функцию для силы, а затем обновляет пару массивов ( x,y,vx,vy).

Ваша проблема отличается тем, что а мю "=" а мю ( Икс мю , в мю ) , что делает вычисление второго ускорения немного сложным, поскольку а 2 зависит от в я + 1 мю и наоборот. Этот ответ в GameDev (определенно стоит прочитать некоторые числовые аспекты проблемы) предполагает, что вы можете использовать следующий алгоритм

а 1 мю "=" Ф ( Икс я мю , в я мю ) / м Икс я + 1 мю "=" Икс я мю + ( в я + 1 2 а 1 мю Δ т ) Δ т в я + 1 мю "=" в я мю + 1 2 а 1 мю Δ т а 2 мю "=" Ф ( Икс я + 1 мю , в я + 1 мю ) / м в я + 1 мю "=" в я мю + 1 2 ( а 2 мю а 1 мю ) Δ т
хотя автор этого поста утверждает,

Он не так точен, как метод Рунге-Кутты четвертого порядка (как можно было бы ожидать от метода второго порядка), но намного лучше, чем метод Эйлера или метод наивной скорости Верле без оценки промежуточной скорости, и он по-прежнему сохраняет симплектическое свойство нормального метода. скорость Верле для консервативных сил, не зависящих от скорости.

Поскольку это движение снаряда, Икс "=" у "=" 0 вероятно, является естественным выбором для начальных условий, с в у "=" в 0 грех ( θ ) и в Икс "=" в 0 потому что ( θ ) как обычно.

Также проверьте вариант Leapfrog Йошиды ; ссылка на artcompsci в разделе «Ссылки» на странице Википедии показывает, как создавать версии более высокого порядка, которые легко реализовать в коде.