exponenta event banner

Создание кода MEX для расчета геодезических данных в криволинейном пространстве-времени

Эти примеры используют общую относительность Эйнштейна для вычисления геодезики в криволинейном пространстве-времени.

Предпосылки

Предпосылки для этого примера отсутствуют.

Пример: Вычисление прецессии планеты Меркурий

Этот пример численно вычисляет прецессию планеты Меркурий. Прецессия представляет собой небольшое вращение эллиптической орбиты вокруг Солнца. Аналитически, используя уравнения общей относительности значение чрезвычайно мало, лишние 43 "(дуговые секунды) за век. Секунда дуги равна 1/3600 одной степени (считая 360 градусов для полного оборота). Хотя дополнительная прецессия чрезвычайно мала, она точно совпадает с наблюдением. Чистая ньютоновская механика (если мы решим игнорировать все другие планеты нашей Солнечной системы) предсказывает отсутствие прецессии.

Это приложение использует метод Эйлера с переменным временным шагом, где основной временной шаг составляет 0,5 секунды. Мы сокращаем временной шаг по мере приближения к одной полной революции. Прецессия вычисляется по мере достижения планетой максимального расстояния от Солнца, для которого мы вычисляем её относительный угол к координатной оси.

Создание функции MEX: прецессия планеты Меркурий

Создание функции MEX с помощью команды codegen за которым следует имя файла MATLAB для компиляции.

codegen gr_mercury_precession
Code generation successful.

gr_mercury_precession функция вызывает другие функции MATLAB, но при вызове необходимо указать только функцию начальной точки codegen.

По умолчанию codegen генерирует функцию MEX с именем gr_mercury_precession_mex в текущей папке. Это позволяет протестировать код MATLAB и функцию MEX и сравнить результаты.

Запустить функцию MEX: прецессия планеты Меркурий

Запустите сгенерированную функцию MEX.

gr_mercury_precession_mex
Progress: 5%
Progress: 10%
Progress: 15%
Progress: 20%
Progress: 25%
Progress: 30%
Progress: 35%
Progress: 40%
Progress: 45%
Progress: 50%
Progress: 55%
Progress: 60%
Progress: 65%
Progress: 70%
Progress: 75%
Progress: 80%
Progress: 85%
Progress: 90%
Progress: 95%
Progress: 100%

precession: 0.10468" (0 years 87.87009 days) => 43.481"/century

Пример: Трассировка лучей черной дыры

Уравнения движения Эйнштейна в общей относительности могут обрабатывать любой объект с любой скоростью, поэтому применим его к фотонам, которые движутся со скоростью света. В этой конфигурации перед фоновым изображением имеется черная дыра. Чтобы сделать эффект более заметным, мы увеличиваем массу черной дыры до астрономических пропорций, а также фоновое изображение. Таким образом мы можем изучить эффекты гравитационного линзирования; фоновое изображение искажается искривленным пространственным временем, создаваемым черной дырой.

Создание функции MEX: трассировка лучей черной дыры

codegen gr_raytrace
Code generation successful.

Запуск функции MEX: трассировка лучей черной дыры

Трассировка изображения занимает минуту или две на машине x86 с тактовой частотой 2 ГГц. На экране вы видите оригинальную картинку (торговый центр Vittorio Emanuele в Милано, Италия) и справа тонированное изображение той же картины с черной дырой перед ней.

gr_raytrace_mex('mall.jpg');

Figure Original Picture contains an axes. The axes contains an object of type image.

Progress: 5%
Progress: 10%
Progress: 15%
Progress: 20%
Progress: 25%
Progress: 30%
Progress: 35%
Progress: 40%
Progress: 45%
Progress: 50%
Progress: 55%
Progress: 60%
Progress: 65%
Progress: 70%
Progress: 75%
Progress: 80%
Progress: 85%
Progress: 90%
Progress: 95%
Progress: 100%

Figure Ray-traced with Black Hole contains an axes. The axes contains an object of type image.