Я-сценарий гравитации N-тела / Солнечной системы - PullRequest
0 голосов
/ 31 августа 2018

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

После просмотра этого очень хорошего видео и множества других его фотографий я сделал быстрое MS-изображение для рисования, чтобы попытаться упростить мою ситуацию. Во второй сцене вы можете видеть, что новая позиция вычисляется с использованием скорости, гравитационного притяжения и угла между этими двумя «направлениями»?

enter image description here

Я не могу понять, как все это понять.

Ниже приведена JS-скрипка моего кода. Вы заметите, что я стараюсь изо всех сил использовать реальные данные НАСА, чтобы сохранить их точность.

Вы хотите обратить особое внимание на строки 138, в которых производятся все вычисления для его следующего хода.

https://jsfiddle.net/c8eru7mk/9/

attraction: function(p2) {
    // Distance to other body
    var dx = p2.position.x - this.position.x;
    var dy = p2.position.y - this.position.y;
    var d = Math.sqrt(dx ** 2 + dy ** 2); // Possibly correct

    // Force of attracrtion
    this.f = G * (this.mass * p2.mass) / (d ** 2); // Possibly Correct

    // Direction of force, If you read it hard enough you should be able to hear my screams of pain
    // Not sure if this is correct, most likely not.
    var theta = Math.atan2(dy, dx);
    var fx = Math.cos(theta) * this.f;
    var fy = Math.sin(theta) * this.f;

    this.velocity.x += fx / this.mass;
    this.velocity.y += fy / this.mass;

    this.position.x += this.velocity.x;
    this.position.y += this.velocity.y;
}

Проблемы, с которыми я сейчас сталкиваюсь:

  • Если я собираюсь использовать значения НАСА, расстояние между планетами настолько велико, что они не поместятся на экране, и я не могу просто уменьшить расстояния, умножив их на 0,0002 или что-то еще, поскольку это связывайтесь с гравитационной постоянной, и симуляция будет полностью отключена.
  • Я не знаю, как рассчитать следующую позицию, и мой мозг несколько раз взорвался на прошлой неделе, пытаясь сделать это несколько раз.
  • Я понятия не имею, как проверить, неверны ли мои данные конфигурации планет или симуляция неправильная, так что я почти догадываюсь.

Это также мой первый раз, когда я на самом деле кодирую что-то более сложное, чем кнопка в javascript, так что отзывы о компоновке кода и прочее приветствуются!

Большое спасибо

1 Ответ

0 голосов
/ 31 августа 2018

Использование значений НАСА не является проблемой при использовании отдельных координат для рисования. Использование соответствующего линейного преобразования из реальных координат в экранные координаты для отображения не влияет на физические значения и вычисления.

Для моделирования движения планеты с итеративными обновлениями можно предположить, что сила тяжести и скорость постоянны в течение небольшой доли времени dt. Этот коэффициент dt отсутствует в ваших переводах из ускорения в скорость и из скорости в расстояние. Выбор подходящего значения для dt может потребовать некоторых экспериментов. Если значение слишком велико, аппроксимация будет слишком далека от реальности. Если значение слишком мало, вы можете не увидеть никаких движений или ошибки округления могут повлиять на результат.

Для начала предположим, что солнце всегда в (0,0). Также для начала давайте проигнорируем силы между планетами. Тогда вот необходимые формулы для первого неплохого приближения:

  • скалярное ускорение планеты в положении (x,y) под действием силы тяжести солнца (с массой M): a = G*M/(d*d), где d=sqrt(x*x+y*y). Обратите внимание, что это не зависит от массы планеты.
  • вектор ускорения: ax = -a*x/d, ay = -a*y/d (вектор (-x,-y) указывает на солнце и должен иметь длину a)
  • изменение скорости планеты (vx,vy): vx += ax*dt, vy += ay*dt
  • изменение положения планеты: x += vx*dt, y += vy*dt
...