Найти тему
Блокнот математика

Поворот координат на сфере: не всё так просто

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

Итак, на сфере, я про Земной шар, традиционно используются сферические координаты. Точка на сфере описывается долготой φ и широтой ψ, которые связаны с декартовыми координатами трехмерного пространства (начало отсчета в центре Земли, ось z проходит через полюса) формулами
x=cosφcosψ
y=sinφcosψ
z=sinψ

Отметим, что координаты криволинейные: координатные линии кривые (прямых на сфере вообще нет). Более того, координатные линии не геодезические, часть из них: параллели (кроме экватора).

Широта Северного полюса равна п/2, долготы там теряют смысл и сливаются.

При моделировании динамики атмосферы и океана это обстоятельство создает проблемы. Сетка с постоянными шагами в градусах существенно разная вдали у полюса и близ него, и вообще на полюсе все ломается. Атмосферу никуда не денешь, там применяются весьма хитрые методы; а с океаном можно выкрутиться проще: ввести координаты, у которых полюс окажется где-нибудь на Экваторе, лучше на суше.

Самое простое --- повернуть оси на 90 градусов так, чтобы ось z протыкала экватор. Пересчет координат тогда довольно прост, хотя и не совсем тривиален: нужно перейти из сферических в декартовы, умножить на матрицу поворота, и вернуться в сферические; при этом приходится аккуратно обходиться с полюсом.

А как быть с векторами? Допустим, есть ветер. Это векторное поле, заданное в географических координатах, а нам нужно --- в модельных. Мы берем точку в модельных, преобразуем в географические, берем в этой точке вектор скорости ветра (двумерный, касательный к сфере) и...

Преобразовать координаты вектора так, как мы поступаем с координатами точки, мы не можем (хотя это не очевидно). Не можем потому, что параллельный перенос вектора в криволинейных координатах --- довольно сложная вещь, и это не чья-то выдумка. Контрпример очень простой.

Представим себе циклон с центром на полюсе: ветер дует вокруг полюса. Векторы скорости направлены вдоль параллелей.

Слева --- вид на полюс "сверху". Справа --- вид на полюс в новых координатах (он на экваторе). Географический полюс обозначен кружком, в модельных координатах --- прямоугольничком. Стрелочки указывают направление ветра, "реальное" и после неправильного переноса вектора. Слева круги --- параллели, радиусы --- меридианы. Справа меридиан только один, параллели --- параллельные отрезки. Правльно перенесенный ветер выглядит таким же антициклоном вокруг прямоугольничка.
Слева --- вид на полюс "сверху". Справа --- вид на полюс в новых координатах (он на экваторе). Географический полюс обозначен кружком, в модельных координатах --- прямоугольничком. Стрелочки указывают направление ветра, "реальное" и после неправильного переноса вектора. Слева круги --- параллели, радиусы --- меридианы. Справа меридиан только один, параллели --- параллельные отрезки. Правльно перенесенный ветер выглядит таким же антициклоном вокруг прямоугольничка.

В новых координатах, естественно, циклон никуда не денется: мы не можем влиять на погоду, просто поменяв систему координат! Вокруг той точки на экваторе, в которую перешел полюс, будет дуть ветер.

Однако если мы перенесем вектор так, как поступаем с координатами точек, получится ветер, дующий вдоль параллелей. Они там, близ экватора, все длинные, от экватора мало отличаются. Получится не циклон, а ровный ветер, дующий на восток. Противоречие.

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

Вопрос --- а что такое "малый"? Нет, понятно, что малый по сравнению с радиусом Земли, но тут возникает два вопроса.

Первое. Параллели вблизи полюса могут быть очень короткие; что, если длина вектора такая, что численно она равна длине параллели? Тогда начало и конец "вектора" совпадут, с самыми неприятными последствиями.

Второе. Размерность вектора-то не такая, как размерность радиуса Земли! Ветер в м/с, а радиус в метрах. Конечно, численно даже 100м/с --- немного по сравнению с 6400км, но всяко бывает. За этим тоже приходится следить.

Следить можно так. Длина вектора --- инвариант, который при переносе не меняется. Вместе с размерностью (я про единицу измерения). Поэтому мы расщепляем вектор на длину, с которой забот нет, и направление, котрое задает "маленький" вектор. Малость его мы выбираем так, чтобы он был реально мал по сравнению с радиусом Земли. Переносим начало и конец этого маленького бифштекса вектора, и восстанавливаем его длину и размерность.

Конечно, можно выписать метрический тензор и через него --- символы Кристоффеля (об этом будет отдельная заметка совсем скоро) и переносить вектора по науке, но это сложно; а задача совсем уж вспомогательная.

Кстати, если надо моделировать весь Мировой океан, надо оба полюса загнать на сушу. Насколько мне известно, поворотом этого не добиться. Приходится прибегать к помощи неортогональных координат, где "все сложно". Но люди это делают.