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

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

Необходимые условия

Для этого примера нет необходимых условий.

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

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

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

Сгенерируйте MEX-функцию: Прецессия Планеты Ртуть

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

codegen gr_mercury_precession
Code generation successful.

The 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.