Причина, по которой в вашей реализации снаряды иногда ускоряются и вылетают невероятно быстро, заключается в том, что в этой проблеме задействовано несколько масштабов времени и масштабов длины, но ваш шаг интеграции не обращает на них внимания. Вместо того, чтобы настраивать массы, лучше настроить шаг интегрирования, чтобы он реагировал на эти различные масштабы времени и длины, что не позволит вашим числам стать слишком большими.
Допустим, у вас есть один снаряд массой m и несколько планет с массами Mk, расположенных в фиксированных положениях векторов Rk< /эм>. Если вектор положения снаряда равен r, то уравнения Ньютона дают вам
для ускорения снаряда d^2r/dt^2 и
для скорости снаряда dr/dt, где E — полная энергия (которая является постоянной движение).
Теперь представьте на мгновение, что у вас есть только одна планета с массой M и что у вас есть снаряд, вращающийся вокруг нее по эллиптической орбите с большой полуосью a и периодом Т. Тогда третий закон Кеплера говорит вам, что
Конечно, у вас нет ни одной планеты, и снаряд не вращается вокруг этих планет по одной эллиптической орбите. На самом деле его орбита может даже не быть замкнутой. Тем не менее, вместо того, чтобы настраивать массы планет, подумайте о настройке масштабов времени и масштабов длины, за которые они отвечают в движении снаряда. Эти масштабы времени и длины приблизительно задаются приведенным выше выражением, по крайней мере, в тех случаях, когда орбиты почти эллиптические. Поэтому вместо Mk используйте
как прокси для масс планеты. Уравнения, которые вы хотите интегрировать, становятся
для ускорения снаряда d^2r/dt^2 и
для скорости снаряда dr/dt.
Теперь, почему они лучше, чем исходные уравнения? Потому что вы можете заранее выбрать различные периоды и большие полуоси, которые затем определяют различные масштабы времени и длины орбиты снаряда. Это, в свою очередь, поможет вам решить, какие шаги интегрирования использовать в различных точках орбиты, и это поможет вам получить как более точную орбиту, так и более эффективную численную задачу для решения.
Например, скажем, у вас есть 3 планеты. Вместо того, чтобы произвольно устанавливать их массы и надеяться на лучшее, скажем, вы выбираете a1 = 100 пикселей, T1 = 5 секунд, a2 = 200 пикселей , T2 = 10 секунд, a3 = 150 пикселей и T3 = 30 секунд. Эти числа означают, что первый снаряд пролетит примерно 2pi x 100 пикселей за 5 секунд, то есть его скорость составляет примерно 120 пикселей в секунду< /эм>. Остальные движутся со скоростью примерно 120 пикселей в секунду и 30 пикселей в секунду. При 120 пикселях в секунду, если вы хотите интегрировать один пиксель за временной шаг, вам понадобится примерно 100 временных шагов в секунду, поэтому ваш временной шаг никогда не должен быть большим. больше 0,01 секунды.
Опять же, это неточные соображения, потому что орбита не обязательно замкнута, а третий закон Кеплера, как указано выше, действителен только для задачи двух тел с замкнутой орбитой. Тем не менее, составление уравнений в приведенной выше форме и тщательный выбор и контроль шага интегрирования для согласования с временными масштабами, присущими проблеме, сделают вашу симуляцию намного более стабильной и точной.
Для реальной помощи в реализации адаптивных методов интегрирования для систем обыкновенных дифференциальных уравнений (примером которых является эта задача), посмотрите адаптивные методы Рунге-Кутты.
person
wltrup
schedule
17.04.2015