Я сделал симуляцию на С++ с законом Ньютона и протестировал ее, сравнивая положения планет с положением из Калькулятора Солнечной системы Дона Кросса (который я преобразовал из JavaScript в С++)
http://cosinekitty.com/solar_system.html
То, что я делаю, это каждый временной шаг (обычно 1 секунда, но шаг 0,2 секунды очень похож на шаг 10 секунд):
Как вы видите, у некоторых планет отклонения небольшие, а у некоторых большие, поэтому мой вопрос: могут ли Ньютоновы быть точными? или Don Cross Солнечной системы калькулятор не? Или в этом районе есть черная материя? Или что еще?
void CGravitator::CalcAceleration(double timeseconds){
unsigned int i,j,iend;
if (sunStatic)iend=m_np-1;
else iend=m_np;
for (i = 0; i < iend; i++) {
m_planetas[i].aceleration.set(0,0,0);
CVector3 totalGravitationalForce;
// Loop through all bodies in the universe to calculate their gravitational pull on the object (TODO: Ignore very far away objects for better performance)
for (j = 0; j < m_np; j++) {
if (i == j) continue; // No need to calculate the gravitational pull of a body on itself as it will always be 0.
double distancia =CVector3::Distancia(m_planetas[i].pos,m_planetas[j].pos);
double force = KGNEWTON * m_planetas[i].masa * m_planetas[j].masa / pow(distancia, 2);
CVector3 forceDirection = CVector3::Normalize(m_planetas[j].pos - m_planetas[i].pos);
totalGravitationalForce += forceDirection * force;
}
CVector3 incspeed = totalGravitationalForce / m_planetas[i].masa ;
m_planetas[i].aceleration += incspeed * timeseconds;
}
Вам нужно использовать лучший численный метод. Метод Эйлера, как известно, плох для орбитальной механики, потому что численные ошибки всегда накапливаются. В частности, метод Эйлера не сохраняет энергию, поэтому вы получаете орбиты, которые просто волшебным образом набирают энергию и выходят из-под контроля.
Вам нужно использовать что-то вроде метода Верле или какой-либо другой симплектический интегратор.
Помимо недостатков численного метода, указанных в другом ответе, моделирование орбиты Меркурия должно учитывать гравитацию Юпитера, а также релятивистские эффекты. Это объясняет лишь небольшую часть отклонения, но его следует учитывать, когда численный метод станет лучше.
По-видимому , прецессия перигелия Меркурия из-за притяжения Юпитера и релятивистских эффектов составляет около 574 угловых секунд за столетие, или 1,57E-2 угловых секунды в день. При окружности орбиты около 3,6E8 км и угловой секунде, равной 1,296E-6 оборота, это составляет около 4,3 км, или 43 км за 10 дней.
Хотя разница в положении перигелия напрямую не переводится в разницу в местоположении, она должна дать представление об эффекте.
Ошибка исходила из источников данных. Теперь я заменил на NAIF cspice.lib и скачал общий файл SPK только для планет, и ошибка действительно мала без других гравитационных тел, таких как астеориды и кометы. Очень просто использовать только 2 функции (furnsh_c и spkezr_c), include и lib.
Закодировано с помощью vc6++ pure win 32. Я запустил makeall.bat из разархивированного спайса (не смог заставить его работать в MFC).
Также временной шаг может составлять любую долю секунды, поэтому спайс и ньютон синхронизируются. Итак, Ньютон сказал мне, что черной материи не существует.
Вот результаты без гравитации астероидов и комет за 10 дней и без поправок в cpsice spkezr_c
ошибка расстояния в км ньютон (Верле) от spice
time = 864000,250
MERCURY BARYCENTER = 5,511496277969209e+002
SATURN BARYCENTER = 8.535731413118873e+001
VENUS BARYCENTER = 2.701394194074592e+002
URANUS BARYCENTER = 8.651056255887706e+001
EARTH = 9.664941717935676e+001
NEPTUNE BARYCENTER = 8.654038466254323e+001
MOON = 1.208560265740111e+002
MARS BARYCENTER = 5.954829440293592e+001
PLUTO BARYCENTER = 8.661640570487361E+001
Jupiter BaryCenter = 8.256645190275238E+001
Общее расстояние ошибок = 1,525933904320919e+003
Time Ini Gregorian
= 2000 январь 01: 00: 00.000 Время.
PM 2Кольцо
PM 2Кольцо
Джейкей
Ник Т
Луис АЛЬБЕРТО
Луис АЛЬБЕРТО
Артур
Ильмари Каронен
m_planetas[i].masa
. Отмените их. (И измените «силу» в именах ваших переменных на «ускорение».) # 2 Сначала вы (предположительно) берете квадратный корень внутри,CVector3::Distancia
а затем возводите в квадрат расстояние. Отмените их тоже. И № 3 да, избегайте интеграции Эйлера. И # 4, пожалуйста, включите в свой вопрос код обновления фактической скорости и положения — в нем могут быть ошибки или числовые неточности, которые влияют на ваши результаты.Дэвид Уайт
матовый черный
РБарриЯнг
PM 2Кольцо
PM 2Кольцо
Дэвид Хаммен
Ильмари Каронен
m_planetas[i].aceleration
, так как они не опубликовали остальную часть, но значение, которое они хранят в этом векторе, не является ускорением. (incspeed
является ускорением, по крайней мере, при условии, чтоtotalGravitationalForce
это действительно сила, но тогда оно умножается на интервал времени.)Qмеханик
Луис АЛЬБЕРТО
Луис АЛЬБЕРТО