Данная статья подтолкнула меня к написанию двух симуляторов — солнечной системы и полета управляемой ракеты в ней.
Так что путь автора повторить можно :-)
Неприятно осознавать, что такую задачу на собеседовании я бы не решил за разумное время (15 мин)
Вряд ли интервьювер бы ждал больше. (Под решением я подразумеваю рабочий код)
С другой стороны в условиях коммерческой разработки с жесткими дедлайнами и высокими требованиями к качеству продукта я работаю вполне успешно.
Я вижу два объяснения:
1. Я достаточно жестко «вошел в колею» — проектирую, пишу код в соответствии со стандартами, отдаю в тестирование, деплоймент на продакшн, поддержка. Сложно перестроиться на что-то новое.
Луну и вывод на круговую окололунную орбиту добавил. (В заметке есть ссылка на видео правда не очень хорошего качества. ЮТьюб как-то пережимет по-своему)
Для этого понадобилось еще 3 включения двигателя:
1. Перевод с круговой околоземной орбиты на орбиту Земля — Луна
2. Торможение возле Луны и перевод на некую промежуточную орбиту. По этой орбите ракета облетает Луну и направляется обратно к Земле…
3. Еще одно торможение и перевод на круговую орбиту вокруг Луны.
Пока не удалось совместить 2 и 3
В планах — освоить метод Дормана-Принца.
Ну и более «пологий» вывод на околоземную…
Есть много других планов, но об этом пока рано говорить.
Этот комментарий и послужил толчком для переделки :-)
Ясно. Я провел некоторые исследования для системы из двух тел. Действительно, траектория остается на своем месте.
Вот система из двух тел, расстояние между ними при наименьшем и наибольшем удалении:
Я записал сумму всех сил, разложил по осям Х и У
И для каждой из осей применил метод Рунге-Кутты.
Соменение состоит в том, не потерял ли я чего-то важного при таком подходе. Все-же координаты зависимы, т.е. делать так нельзя. Но с другой стороны эта связь учтена в формуле:
У меня получилось!
Несколько дней изучения и чтения «Нежестких задач» и я осилил метод Рунге-Кутты!!!
Мне удалось сбалансировать систему в новом проекте за 5 минут, при том, что методом Эйлера я целую неделю мучался подбором параметров и стабилизацией траектории!!!
Не очень понял с ускорениями.
Я бы советовал двигаться в сторону второго закона Ньютона. А именно — ускорение считать как Ai = Sum(Fij)/m, где Fij — сила взаимного притяжения тел (Fij = G * mi * mj * (Xi — Xj) / (rij ^ 3), тут записано в векторной форме).
Я ж точно так и делал. Только сразу сократил m и оперировал не понятием «сила», а понятием «ускорение» :-)
Мне уже подсказали воспользоваться другими численными методами. Возможно, я так и поступлю, если удастся осилить. Университетский курс численных методов требует много времени. Школьный курс физики намного менее требовательный.
Да, тут я вынужден согласиться. На момент написания я помнил только закон всемирного тяготения и 2-й закон Ньютона. Пробел в этой области
Но теперь я знаю что есть метод Эйлера и метод Рунге-Кутты.
Ага. Прочитал, что до 3.3 configparser назывался ConfigParser
The ConfigParser module has been renamed to configparser in Python 3. The 2to3 tool will automatically adapt imports when converting your sources to Python 3
Так что путь автора повторить можно :-)
Вряд ли интервьювер бы ждал больше. (Под решением я подразумеваю рабочий код)
С другой стороны в условиях коммерческой разработки с жесткими дедлайнами и высокими требованиями к качеству продукта я работаю вполне успешно.
Я вижу два объяснения:
1. Я достаточно жестко «вошел в колею» — проектирую, пишу код в соответствии со стандартами, отдаю в тестирование, деплоймент на продакшн, поддержка. Сложно перестроиться на что-то новое.
2. Задача достаточно сильно оторвана от жизни.
Для этого понадобилось еще 3 включения двигателя:
1. Перевод с круговой околоземной орбиты на орбиту Земля — Луна
2. Торможение возле Луны и перевод на некую промежуточную орбиту. По этой орбите ракета облетает Луну и направляется обратно к Земле…
3. Еще одно торможение и перевод на круговую орбиту вокруг Луны.
Пока не удалось совместить 2 и 3
В планах — освоить метод Дормана-Принца.
Ну и более «пологий» вывод на околоземную…
Есть много других планов, но об этом пока рано говорить.
На сайте, откуда я копировал, тоже небыло авторства.
Спасибо за веру в мои скромные способности.
Этот комментарий и послужил толчком для переделки :-)
Ясно. Я провел некоторые исследования для системы из двух тел. Действительно, траектория остается на своем месте.
Вот система из двух тел, расстояние между ними при наименьшем и наибольшем удалении:
Еще раз спасибо.
Я записал сумму всех сил, разложил по осям Х и У
И для каждой из осей применил метод Рунге-Кутты.
Соменение состоит в том, не потерял ли я чего-то важного при таком подходе. Все-же координаты зависимы, т.е. делать так нельзя. Но с другой стороны эта связь учтена в формуле:
где r — расстояние между двумя телами.
Спасибо всем кто подскажет.
У меня получилось!
Несколько дней изучения и чтения «Нежестких задач» и я осилил метод Рунге-Кутты!!!
Мне удалось сбалансировать систему в новом проекте за 5 минут, при том, что методом Эйлера я целую неделю мучался подбором параметров и стабилизацией траектории!!!
Всем огромное спасибо!
Попервах у меня наслаивалось следующее значение на предыдущее. Простой баг был :-)
Я бы советовал двигаться в сторону второго закона Ньютона. А именно — ускорение считать как Ai = Sum(Fij)/m, где Fij — сила взаимного притяжения тел (Fij = G * mi * mj * (Xi — Xj) / (rij ^ 3), тут записано в векторной форме).
Я ж точно так и делал. Только сразу сократил m и оперировал не понятием «сила», а понятием «ускорение» :-)
Мне уже подсказали воспользоваться другими численными методами. Возможно, я так и поступлю, если удастся осилить. Университетский курс численных методов требует много времени. Школьный курс физики намного менее требовательный.
Но теперь я знаю что есть метод Эйлера и метод Рунге-Кутты.
Спасибо за ссылки. Ознакомлюсь.
Буду осваивать новый метод. Есть над чем поработать теперь.
Огромное спасибо.
The ConfigParser module has been renamed to configparser in Python 3. The 2to3 tool will automatically adapt imports when converting your sources to Python 3
Может, это поможет.
Да, иногда бывает сложно поймать стабильную комбинацию :-) Чем больше планет тоем тоньше грань.
Попробуйте Питон 3.3, если есть возможность.
Все должно запуститься.