Я ищу функцию, которая с учетом времени (например, времени Unix ) возвращает текущее расстояние между Марсом и Землей в световых секундах.
Это может быть математическая функция или функция программирования (предпочтительно на Python или псевдокоде), но она не должна зависеть от подключения к Интернету.
Этот вопрос похож на вопрос, который я задавал ранее , но мне снова нужно получить расстояние без подключения к Интернету.
Заранее спасибо!
Примечание: я планирую изучать орбитальную механику, но эта функция мне нужна раньше. :)
Нет простой функции, которая была бы точной. И Земля, и Марс вращаются по эллипсам (первый закон Кеплера). Они движутся с разной скоростью (секунда Кеплера). Чтобы найти текущее расстояние между ними, вы должны вычислить их положение в трех измерениях.
Другими словами, вы должны сделать орбитальную кинематику. Как рассчитать положение объектов на орбите?
Если точность не важна. Вы можете аппроксимировать орбиты кругами в одной плоскости. Тогда положение Земли
Расстояние между ними рассчитывается по Пифагору
Расстояния указаны в а.е., а время в годах (тогда легко преобразовать в световые секунды). и - константы, выбранные для соответствия положениям планет в момент времени 0. Значения 1,5 и 1,882 выбраны потому, что орбита Марса примерно в 1,5 раза больше, чем Земля, а марсианский год в 1,882 раза длиннее, чем земной.
Круговая аппроксимация, однако, плоха для Марса, и при этом игнорируется тот факт, что Марс не находится точно в той же орбитальной плоскости, что и Земля, поэтому значения будут весьма приблизительными.
примечание. Это ответ типа «расширенный комментарий», в котором рассматриваются два потенциальных решения, которые могут быть не совсем тем, что вам нужно, но близки.
Вещь, которая дает вам информацию о положении вещей в Солнечной системе в определенное время, называется эфемеридой .
Первоначально это были таблицы предсказаний (прошлого и будущего), основанные на расчетах. Ко времени Ньютона они стали довольно хорошими, так как Ньютон разработал метод итеративного решения уравнения Кеплера (например , метод Ньютона ). См. вопрос Как это сделали Ньютон и Кеплер (на самом деле)? и ответы там для немного больше фона.
Пакет Python PyEphem существует и хорошо поддерживается, и является реинкарнацией XEphem на языке python . Я им не пользовался, но считаю, что он хранит достаточно информации об орбитальных параметрах в определенные эпохи для создания эфемерид, включая некоторые гравитационные возмущения. Другими словами, это гораздо больше, чем планеты, движущиеся по фиксированным эллиптическим орбитам вокруг неподвижного солнца. Поэтому я считаю, что он работает без подключения к Интернету.
Я никогда не использовал его, потому что мне рекомендовали посмотреть Skyfield , и это именно то, что мне было нужно. Он загружает стандартные эфемериды JPL, которые вы выбираете, а затем просто использует их с вашего жесткого диска. Однако, чтобы иметь дело с секундами координации и другими эффектами, связанными со временем , время от времени необходимо проверять Интернет на наличие обновлений информации о секундах координации, поскольку они произвольны.
Я не знаю, есть ли в Skyfield способ избежать этого. На самом деле это хороший вопрос. Если вы работаете со шкалой времени, в которой нет високосных секунд, я не уверен, будет ли она работать в текущей версии.
Пакеты Skyfield и PyEphem Python написаны и поддерживаются @BrandonRhodes.
Если вы можете позволить время от времени подключаться к Интернету (скажем, каждый месяц или несколько месяцев), то Skyfield чрезвычайно прост в использовании. Например, вот сценарий, который я использовал в этом ответе . Если вы хотите преобразовать форматы времени из системного времени, вы можете выполнить поиск моих вопросов в stackoverflow и исследовании пространства. Если вы хотите, чтобы системное время вашего локального компьютера теперь использовалось t = ts.now()
напрямую вместо utc.
import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import load
data = load('de421.bsp')
ts = load.timescale()
t = ts.utc(2016, 7, 5, 9, 50, 0)
jupiter, earth = data['Jupiter barycenter'], data['Earth']
jpos, epos = jupiter.at(t).position.km, earth.at(t).position.km
d_instantaneous = np.sqrt(((jpos - epos)**2).sum())
d_light = earth.at(t).observe(jupiter).distance().km # where WAS Jupiter 48 minutes ago?
clight = 299792.458 # km/s
print "d_instantaneous / c = ", d_instantaneous/clight
print "d_light / c = ", d_light/clight
jupiter = data['Jupiter barycenter']
на mars = data['Mars barycenter']
Марс, если хотите :-)
Кевин