Почти безмассовый кот упал в космос (не волнуйтесь, с скафандром и всем остальным) в точке (x, y, z)
со скоростью (vx, vy, vz)
. В этой точке находится фиксированная, бесконечно плотная планета (с объемом 0), (0, 0, 0)
которая притягивает объекты на расстоянии r
с ускорением 1/r^2
. Согласно ньютоновской гравитации, куда движется объект после времени t
?
Почти безмассовое в этом случае означает, что вы выводите значение lim (mass --> 0) <position of cat>
. На массу влияет гравитация планеты, но гравитация кошки не влияет на планету. Другими словами, центральное тело является фиксированным.
Это несколько похоже на Code Golf: какова судьба космического корабля? [версия с плавающей запятой] , но это отличается, потому что это измерение точности.
Вы можете реализовать решение, основанное на моделировании, которое должно выполняться менее чем за 3 секунды, ИЛИ вы можете реализовать программу, которая дает точное значение (также должна выполняться менее чем за 3 секунды). Смотрите подробности о выигрыше ниже. Если вы реализуете симуляцию, она не должна быть точной, но ваш счет будет ниже из-за неточности.
Ввод : x y z vx vy vz t
не обязательно целые числа, представляющие координаты x, y, z, скорость в направлениях x, y и z и время соответственно. Гарантируется, что скорость кошки строго меньше, чем скорость спасения на этой высоте. Ввод может быть взят из любого места, включая параметры для функции. Программа должна работать менее чем за три секунды на моем ноутбуке t < 2^30
, а это означает, что если вы запускаете симуляцию, вы должны соответствующим образом скорректировать свой временной шаг. Если вы планируете использовать ограничение в 3 секунды для каждого тестового случая, убедитесь, что есть настраиваемый параметр, который может сделать его более точным / менее точным для увеличения скорости, чтобы я мог запустить его за три секунды на моем компьютере.
Выход : x y z
позиция после времени t
.
Поскольку проблема двух тел может быть полностью решена, теоретически можно получить идеальный, правильный ответ.
Оценка : для любого тестового случая ошибка определяется как расстояние между вашим выходом и «истинным» выходом. Истинный вывод определен как тот, который генерирует фрагмент теста. Если ошибка меньше чем 10^(-8)
, ошибка округляется до нуля. Ваша оценка - это средняя ошибка на 100 (или более) случайных тестовых случаях. Если вы напишите совершенно точный ответ, вы должны получить оценку 0; выигрывает наименьшее количество очков, и связи будут нарушены по длине кода.
Тестовые случаи :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
В этом случае орбита идеально круглая с периодом 2 * пи, поэтому после оборота 159154943 раз кошка окажется примерно на (0,83789, -0,54584). Это не тестовый пример, на котором будет проверяться ваш код; однако, если вы отправите совершенно точный ответ, вы можете проверить его на этом.
Фрагмент ниже генерирует случайные дополнительные тестовые случаи и будет использоваться для оценки представлений; дайте мне знать, если есть ошибка с этим:
источник
t
дается в секундах? Если да, будет ли скорость указываться в единицах в секунду или что-то меньшее?t
дается в единицу времени, что бы это ни было, и скорость будет использовать ту же единицу. Будь то в секундах или часах, ответ будет одинаковым.nearly massless cat
Ну, а какой будет точная масса кошки? Должны ли мы просто использовать0
в качестве значения массы этой кошки?Ответы:
Python 3.5 + NumPy, точный, 186 байт
Это точное решение с использованием формулы I, разработанной на основе Йеспера Йоранссониса, «Симметрии задачи Кеплера», 2015 . Он использует бинарный поиск для решения трансцендентного уравнения Ax + B cos x + C sin x = D, которое не имеет решения в замкнутой форме.
Функция ожидает, что позиция и скорость будут переданы как массивы NumPy:
источник
@
?numpy.dot
(умножение произведения на матрицу). См. PEP 465.Javascript
Это просто для того, чтобы начать работать, так как никто, кажется, не публикует ответы. Вот очень наивный, простой способ, который можно значительно улучшить:
Тестирование:
Эй, это очень хорошо. Он имеет ошибку около 3.333 * 10 ^ (- 6), которой недостаточно для округления вниз ... это близко.
Просто для удовольствия:
Ну что ж; так что это не самый лучший.
И на случайном тестовом примере от генератора:
С ошибкой только приблизительно 0.32305!
Это можно значительно улучшить, используя что-то вроде интеграции Verlet или какой-нибудь необычный алгоритм. Фактически, эти алгоритмы могут даже получить отличные результаты, несмотря на то, что они являются симуляциями.
источник