Здравствуйте, уважаемые хабровчане! Расскажу о своём небольшом опыте работы в проекте, который был посвящён астрономии, и о математике, с которой пришлось повозиться.
Дело было так - учился я в универе, изучал электронику, и после окончания курса по азам С++ , мне предложили подработку в одном проекте, где нужно было написать небольшую программу для моделирования рассеивания света звёздной пылью. Пришёл я на собеседование, которое проводили два доктора астрофизика, поспрашивали про математику и астрономию, поняли что не математик и уж тем более не астроном, но на работу взяли.
Первым моим заданием было подтянуть математику и боль-мень освоить фортран, так как на фортране был софт одного известного учёного М.И.Мищенко (Michael I. Mishchenko). Этот софт определял оптические свойства пыли в зависимости от её концентрации, формы пыли, длины волны и индекса преломления света.
Далее мне нужно было написать свою программу, которая моделирует рассеивание света. Модель простая - звезда, вокруг неё пылевое облако (параметры оптических свойств пылевого облака можно было рассчитать программой М.И.Мищенко), вдали от облака находится оптический телескоп. Моя программа моделирует полученное изображение на CCD матрице телескопа, а именно значение четырёх векторов Стокса, для каждого пикселя CCD матрицы. Метод, который использовался для моделирования рассеивания света - Монте-Карло. Я уговорил начальника - доктора астрофизики использовать C++, т.к. я не хотел писать её на фортране.
Задача была не сложной, начальник выводил формулы и уравнения, я решал их численными методами и ваял программу.
Упрощённая блок-схема программы, к которой я пришёл интуитивно, а после сравнил с одной публикацией (Three Monte Carlo programs of polarized light transport into scattering media: part I (Jessica C. Ramella-Roman, Scott A. Prahl, and Steve L. Jacques) ) о разных методах Монте-Карло для рассеивания света. И понял что моя совпадает с классическим методом Монте-Карло для поляризованного излучения.
Из звезды вылетают пакеты фотонов (каждый пакет фотонов состоит из 1000 фотонов), которые летят в случайном направлении, после часть энергии рассеивается, в зависимости от направления пакета фотонов и оптических свойств пыли рассчитывается дальнейшее направление пакета фотонов. Каждое рассеивание фиксируется на CCD матрицу телескопа. И так много миллионов раз. Чем больше пакетов фотонов рассеяно, тем точнее изображение.
Часть математики я вывел сам - это моделирование излучения пакетов фотонов из сферического источника света и моделирование проекции пылевого облака на плоскость телескопа.
Моделирование сферического источника света:
- Декартовы координаты центра звезды.
- сферические координаты точки, на поверхности звезды, из которой будет испускаться пакет фотонов.
- угол между нормалью к поверхности звезды и вектором эмиссии (испускания) пакета фотонов.
- полярный и азимутальный углы эмиссии пакета фотонов.
Программа генерирует углы и , радиус звезды - константа. Декартовы координаты точки эмиссии пакета фотонов рассчитываются по формуле (1.1)
Единичный вектор рассчитывается по формуле (1.2)
Угол между нормалью к поверхности звезды и вектором эмиссии .
Программа рассчитывает вектор эмиссии по формуле (1.3).
Поворачиваем вектор эмиссии вокруг вектора нормали к поверхности звезды на угол .
Используем матрицу поворота , чтобы рассчитать вектор эмиссии после поворота.
Когда вектор получен,
рассчитываются полярный и азимутальный углы эмиссии
В результате мы получили пакет фотонов, который испускается из точки поверхности звезды с координатами и летит в направлении которое задают полярный и азимутальный углы .
-
Моделирование проекции пылевого облака на плоскость телескопа:
Центр системы координат , центр сферического облака , радиус сферического облака 39. (Это описание математической модели, в программе соответственно используются астрономические расстояния).
Координаты телескопа до поворотов:
Первый поворот осуществляется вокруг оси которая параллельна Y оси ,
Телескоп поворачивается на угол (полярный угол позиции телескопа):
Первый поворот телескопа на угол совершён.
Далее будет произведён поворот вокруг оси параллельной Z оси , на угол (азимутальный угол позиции телескопа).
Второй поворот телескопа на угол совершён.
Далее необходимо рассчитать единичный вектор для плоскости телескопа (для проекции облака на плоскость телескопа):
Необходимо рассчитать константу для уравнения плоскости телескопа:
Уравнение плоскости телескопа:
Необходимо рассчитать рассчитать расстояния от точки облака до плоскости телескопа, - точки облака
Далее получаем точки проекции облака на плоскость телескопа:
Для того чтобы правильно отобразить все точки облака и векторы Стокса на CCD матрице телескопе, необходимо выполнить обратные повороты.
С математикой, которую выводил самостоятельно усё.
Написал я программу , которая рассчитана под линукс, используется C++11 concurency, распараллеливание на ядра процессора (сколько ядер, столько одновременно пакетов фотонов рассеиваются), запускал на кластере суперкомпьютера, у которого было 24 ядра. Получил результаты, но нужно было их как-то проверить.
Начальник принял решение - написать другую программу, которая решит систему интегральных уравнений Фредгольма для простой модели со звездой, сферическим облаком вокруг неё и Рэлеевским рассеиванием света. Для этой задачи я решил использовать питон, из-за удобства библиотек (да и интересно было что-то на питоне написать).
Далее была необходима нормализация параметров, т.к. разные программы давали результаты в разных величинах измерения. Результаты совпали, но для большей убедительности результаты сравнили также с программой известного учёного Cornelis Dullemond RADMC3D. Там результаты тоже совпали.
Были конференции, прикладываю презентацию одной.
А также видео другой (выступает мой бывший начальник) :
И также написана научная публикация (это уже после окончания моей работы, её к сожалению выложить не могу).
Ну вот - как-то так, поработал, написал свой первый софт, подтянул математику, мне понравилось :)
vkams
Навеяло трогательные воспоминания о начале моей работы в теоротделе ИВТ РАН: тоже писал на С программу, которая рассчитывала рассеяние методом Монте-Карло, и даже уравнения Фредгольма изучил, хотя не пригодились. Компьютеры тогда были - не чета нынешним: 386DX 25 МГц, а больше 286 16 МГц 1 Мб оперативки.