Космическая наука с Python

Космическая наука с Python - Дополнения к статьям

Часть 10 учебной серии - это дополнительная статья о дополнительных материалах. Как мы можем правильно визуализировать многомерные функции?

Предисловие

Это 10-я часть моей серии руководств по Python Космическая наука с Python. Все коды, которые здесь показаны, загружены на GitHub. Наслаждайтесь!

Сегодняшний урок - это «Дополнительная статья» о том, как создавать «Дополнительные материалы» для статей. Дополнительные материалы могут быть чем угодно, например таблицами, наборами данных и т. Д., Которые не помещаются в научную статью. Здесь мы рассмотрим параметр Тиссерана и узнаем, как создать анимацию многомерной функции.

Введение

На наших последних сессиях мы узнали о кометах, их происхождении и их орбитальных характеристиках. В прошлый раз мы обнаружили, что астродинамическая теория Феликса Тиссерана [1] из 19 века помогает нам описать и объяснить динамическую связь между периодическими кометами (типа P) и Юпитером. Уравнение возвращает так называемый параметр Тиссерана T относительно Юпитера (JUP), который зависит от большой полуоси a, наклона i и эксцентриситет e кометы. Результирующий параметр не имеет единицы измерения, а значение от 2 до 3 указывает на близкую встречу с Юпитером в прошлом. Комета стала Кометой семейства Юпитера (JFC).

Представьте себе использование и описание уравнения с несколькими входными параметрами в диссертации или исследовательской работе (или в статье Medium). Уравнения, результаты и графики очевидны для вас, кто постоянно работает в этой конкретной области исследования. Но научные идеи и результаты должны быть понятными и доступными для других. Иначе вы не сможете убедить других в своих идеях. Все остается слишком сложным, и ваши идеи не могут развиваться. Ежедневно публикуются десятки научных работ. Что хорошего? Что стоит прочитать? Должен ли я верить тому, что утверждает исследователь?

Графики, таблицы и изображения помогают нам и читателю понять сложность результатов исследования, а создание интересных сюжетов может стать ремеслом. Но есть ограничения:

  1. Некоторые исследования создают массу данных, которые невозможно распечатать или отобразить.
  2. Исследовательская работа или диссертация являются «двумерными».

Обе проблемы можно легко решить с помощью дополнительного онлайн-раздела Дополнительные материалы. Например, Science предоставляет рекомендации для этих материалов, которые не могут быть опубликованы в печатной версии газеты. Код может быть размещен на GitHub, данные могут храниться в облаке, а мультимедийная информация может помочь читателю улучшить понимание опубликованного контента.

В нашем случае: у нас есть функция, которая зависит от 3 входных параметров. У вас есть представление о том, как выглядит пространство решений параметра Tisserand?… я тоже. Итак, давайте улучшим наше понимание параметра Тиссеранда, создав анимацию, охватывающую все входные параметры.

Поддержка Python

Для этого урока нам потребуются наши уже известные библиотеки. Позже вводятся новые модули для новых целей и функций. pathlib понадобится для создания структуры папок (строка 1); у нас снова есть spiceypy для вычисления большой полуоси Юпитера (строка 5); строка 8 импортирует мета-файл ядра со всеми необходимыми путями ядра и numpy (строка 11), а также matplotlib ( строка 14) необходимы для обработки данных и построения графиков соответственно.

Для параметра Тиссерана нам нужна большая полуось Юпитера. Мы устанавливаем эфемеридное время (ET) в строке 2 путем преобразования строки UTC в ET (с помощью utc2et). Затем (строки с 6 по 9) мы определяем вектор состояния барицентра Юпитера (NAIF ID: 5) в ECLIPJ2000 с точки зрения Солнца (NAIF ID: 10) с помощью функции spkgeo . После извлечения значения G * M (гравитационная постоянная, умноженная на массу) Солнца в строках 12 и 13 (с помощью функции bodvcd), мы определяем элементы орбиты Юпитера в строке 16. Функция oscltx требует в качестве входных данных вектора состояния Юпитера, ET и значения G * M Солнца. Вторая последняя запись результирующего массива ORB_ELEM_JUPITER содержит большую полуось в км (строка 19). Строка 20 преобразует значение km в AU с помощью функции SPICE convrt.

Как мы можем визуализировать параметр Тиссерана, для которого требуются 3 разных входных параметра? Одно предложение: мы создаем двухмерный график с эксцентриситетом по оси x и наклоном по оси y. Цветная контурная карта представляет значение Тиссерана. Затем мы можем создать несколько цветных контурных графиков для разных значений большой полуоси. Полученные изображения затем объединяются в фильм или анимированный GIF.

Мы будем использовать функцию maplotlib contourf для создания этих графиков. Сначала с помощью numpy meshgrid (строка 17) мы устанавливаем сетку наклонов (строки 3 и 4 определяют наклон в градусах и радианах) и эксцентриситетов (строка 7). Строки с 12 по 14 определяют параметр Тиссеранда как лямбда-функцию.

Теперь мы устанавливаем общее форматирование для следующих сюжетов. Для цветных контурных графиков нам понадобится некая цветовая карта. Таким образом, мы импортируем matplotlib cm в строке 2. Графики темного режима выглядят довольно красиво, поэтому мы устанавливаем макет dark_background в строке 5 и увеличиваем в строке 8 шрифт по умолчанию. размер для лучшей читаемости.

Каждый контурный график будет представлять пространство решений для определенной большой полуоси. Диапазон этих значений определен в конце строк 12 и 13. Анимация должна быть создана от 1,0 AU до 8,0 AU с размером шага 0,1 AU.

Теперь мы создаем контурные графики для каждого шага большой полуоси. Все графики должны храниться в дополнительной папке, чтобы предотвратить переполнение файлов в нашей основной папке с обучающими материалами. Строка 2 создает папку temp /, если каталог еще не существует. Всего будет создано 71 изображение. Это может занять некоторое время, и печать каждого шага в предстоящем цикле for приведет к спаму вывода терминала. Чтобы получить чистый и динамичный рабочий статус, мы устанавливаем модуль tqdm, который позволяет создавать отличные индикаторы выполнения в терминале или в Jupyter Notebook:

pip3 install tqdm

Строка 5 импортирует tqdm, который используется в операторе for-loop в строке 12. Под кодом вы можете увидеть результирующий индикатор выполнения. Строка 8 создает начальную фигуру, которая используется в следующем цикле.

Цикл for выполняет итерацию по значениям большой полуоси (A_ARRAY). Сначала график очищается (строка 15), устанавливаются пределы x и y (строки 18 и 19), и вычисляется соответствующая матрица параметров Тиссерана большая полуось, эксцентриситет и наклон (строка 22). После установки заголовка (показывающего большую полуось) и меток (строки 25–27) контурный график создается (строки 30–33). Мы хотим четко различать значения Тиссерана меньше 2, между 2 и 3 (JFC) и больше 3. Таким образом, мы устанавливаем пределы с помощью vmin и vmax для отображения цветов. . Значения от 2 до 3 разделены на 10 шагов (конечная строка 32).

После этого отображается цветная полоса с описанием (строки 35 и 36), а полученное изображение сохраняется в папке temp /. Было выбрано значение 100 dpi, поскольку окончательный размер GIF не должен превышать 25 МБ (максимальный размер файла на Medium).

Matplotlib предоставляет встроенную поддержку анимации. Однако мы выбрали подход, чтобы сначала сохранить все графики. Таким образом, можно повторно использовать отдельные участки для других целей. Чтобы объединить графики в один GIF, нам нужно определить массив, который содержит порядок путей графиков. Сначала мы импортируем библиотеку glob, которая позволяет нам получить список путей созданных графиков (строки 4 и 5). В строке 13 создается список, содержащий путь по возрастанию. Мы добавляем небольшой перерыв в анимацию, добавляя 25 раз последнее изображение (строка 16). Добавлен перевернутый список имен путей для создания анимации вперед-назад с еще одним разрывом из 25 изображений самого первого изображения (строки 20 и 23).

С помощью библиотеки imageio теперь мы можем создавать GIF. Если вы еще не установили эту библиотеку, выполните следующую команду pip, чтобы установить ее:

pip3 install imageio

Импортируйте библиотеку (строка 2) и создайте пустой список (строка 5), который будет содержать всю информацию о графике. Цикл for в строках с 9 по 10 выполняет итерацию по всем именам путей и добавляет прочитанные изображения (с imageio imread) в исходный пустой список.

Теперь в строке 14 создается анимированный GIF-файл с помощью функции mimsave. Длительность каждого изображения установлена ​​на 0,04 с, в результате получается анимация 25 кадров в секунду.

Ниже вы можете увидеть результирующий GIF из пространства решений параметра Тиссерана как функцию большой полуоси, наклона и эксцентриситета. Эти виды анимации помогают понять сложные функции.

Заключение и следующий шаг

В прошлый раз мы узнали о параметре Тиссерана и его интерпретации (значение от 2 до 3 указывает на динамическую связь между кометой и Юпитером). Однако функция многомерна и трудна для понимания.

Дополнительные материалы здесь или в научных статьях помогают читателю (а иногда и самому себе!) почувствовать сложные функции и зависимости.

Создание простой анимации (например, показанной выше) может занять некоторое время и усилия, но картинка стоит тысячи слов, а анимация, вероятно, дороже.

В следующий раз мы вернемся к науке и рассмотрим важную научную проблему данных: эффекты смещения.

Томас

использованная литература

[1] Тиссеран, Ф.-Ф. (1896 г.). Traité de Mécanique Céleste IV. Готье-Виллар, Париж