Видимо замылился глаз. Не могу найти/понять в чем ошибка.
Что пытаюсь сделать:
Простенькую симуляцию движения тела по орбите вокруг источника гравитации.
Для этого случайным образом выставляется тело, и для него рассчитывается:
вектор направленный к центру источника гравитации => вектор силы притяжения
касательная к орбите => вектор текущей скорости объекта (в первой итерации расчет производится как первой космической. При последующих, как сумма предыдущего вектора скорости и вектора силы притяжения в текущих координатах)
Ожидаемый результат:
движение тела по идеально (ну почти) круглой орбите
Получаемый результат:
В большинстве случаев движение по эллиптической орбите
Предполагаемая причина:
Ошибки вычисления и их последовательное накопление
Что меня удовлетворит в качестве ответа:
Способ существенно уменьшить эти ошибки или ослабить их влияние на модель настолько, чтобы визуально орбита выглядела круглой, с центром в центре источника гравитации
Текущая реализация:
где:
черное тело - объект на орбите
оранжевое тело - источник гравитации (неподвижный/стационарный)
красная линия - соединяет центры объекта и источника гравитации
зеленая линия - вектор скорости, направленный по касательной к орбите (для наглядности увеличен на порядок)
синяя линия - вектор силы притяжения (для наглядности увеличен на 2 порядка)
Роман,
первый косяк в this.gravity = Math.sqrt(G*mass/(dist*dist)),
если верить этой формуле
то ускорение свободного падения будет this.gravity = G*mass/(dist*dist)
А дальше я просто не понял откуда взялось this.tdx = -this.x*this.gravity/dist и переписал эту часть по своему
Ведь по факту я в неявном виде производил нормализация векторов
Лучше всё же в явном виде её сделать, так меньше вероятность запутаться во всех этих формулах
А дальше я просто не понял откуда взялось this.tdx = -this.x*this.gravity/dist
ну тут просто:
this.tdx = -this.x*this.gravity/dist
где: -this.x - направление на центр тяжести this.gravity/dist - его (направления/вектора) нормализация и приведение к вектору силы притяжения
Если у вас реальные физические формулы, то я бы сказал что ожидаемый результат - движение тела по эллиптической орбите.
Все тела в космосе так и летают.
Более того, даже этот сдвиг эллипса на каждом круге - это то что происходит в реальности.
Может у вас программа наоборот - слишком правильно работает?
Антон Швец, в первом приближении да, это шар. Я думаю, речь идёт об идеальном случае, когда существует только сила притяжения и только для тела (масса и размеры тела пренебрежимо малы) + начальное ускорение. Разве в этом случае реальная формула не приводится к обычному движению по окружности? Или я что-то не знаю?
Griboks, движение по окружности, т.е. круговая орбита будет если спутнику сообщили первую космическую скорость по касательной к предполагаемой орбите.
И автор рассчитывает ее, только у него G равно единице, хотя она конечно потом в расчете силы притяжения тоже участвует.
В общем надо аккуратно все проверять, времени столько нет :)
Вектор движения вот странно как-то рассчитывается, и на глаз видно что тело летит криво изначально.
ожидаемый результат - движение тела по эллиптической орбите.
Все тела в космосе так и летают.
Более того, даже этот сдвиг эллипса на каждом круге - это то что происходит в реальности.
Так то оно так, но у меня по факту расчет идет для идеально круглого тела, относительно точечного центра гравитации. Учитывая это, орбита все таки должна получится круглой. Далее, если шаг итерации делать меньше, то и орбита скругляется. По сути на лицо факт неточности вычислений, причиной которой являются следующие факторы:
1. неточность вычислений заложенных в сам механизм хранения значений с плавающей запятой;
2. неточность вычислений за счет достаточно большого шага на каждой итерации вычислений;
А вопрос мой по сути заключается не в том, как избавится от данных неточностей или уменьшить их (без существенного увеличения вычислительной нагрузки этого сделать нельзя) а в том, как добиться уменьшения их влияния на получаемую орбиту. Самый просто вариант, просто перемещать объект по фиксированной окружности с рассчитанной для этой окружности скоростью, но он мне не подходит по ряду причин:
1. мне нужно чтобы тела двигались по законам приближенным к физическим.
2. при добавлении источников гравитации, движение тел должно их учитывать
в первом приближении да, это шар. Я думаю, речь идёт об идеальном случае, когда существует только сила притяжения и только для тела (масса и размеры тела пренебрежимо малы) + начальное ускорение.
Именно так. Именно для таких условий мне нужно добиться (хотя бы визуально) идеальной окружности, для любой высоты орбиты и тел с любой массой
И автор рассчитывает ее, только у него G равно единице, хотя она конечно потом в расчете силы притяжения тоже участвует.
В общем надо аккуратно все проверять, времени столько нет :)
Вектор движения вот странно как-то рассчитывается, и на глаз видно что тело летит криво изначально
Ну, сама по себе гравитационная постоянная тут на кривизну орбиты влиять вообще не должна. А так да, изначально орбита искривляется после первой итерации. Перепроверил логику вычислений раз 100500 но ошибки так и не нашел. Если все же поможете выловить причину искривления, буду очень благодарен.
Может при какой-то скорости эллипс станет неотличим от окружности.
так и происходить, но нужен механизм, который позволит получить эту скорость для произвольных масс телл и произвольной высоты орбиты без участия человека и визуальной оценки. Такой механизм есть - это расчет первой космической скорости, но в симуляции это почемуто работает несколько неправильно. Ищу причину)
Пе́рвая косми́ческая ско́рость (кругова́я ско́рость) — минимальная (для заданной высоты над поверхностью планеты) горизонтальная скорость, которую необходимо придать объекту, чтобы он совершал движение по круговой орбите вокруг планеты и не начал падать [1]. Первая космическая скорость для орбиты, расположенной вблизи поверхности Земли, составляет 7,91 км/с[2]. Впервые была достигнута космическим аппаратом СССР 4 октября 1957 г. (первый искусственный спутник)[3].
так уже нашли ошибку)))
она была в формуле вычисления силы тяжести. Я там воткнул корень квадратный, откуда я его взял, не спрашивайте, невнимательность и спешка))))