Код физиков на Python: как перенесли библиотеку Mie-рассеяния, которой пользовались 20 лет

Физики двадцать лет использовали набор MATLAB-функций для расчёта рассеяния Ми — явления, объясняющего голубизну неба и белизну молока. В 2024 году Кристиан Мэтцлер из Бернского университета решил перенести этот код на Python. Оказалось, что сам перевод занял меньше времени, чем разбор legacy-кода и

Код физиков на Python: как перенесли библиотеку Mie-рассеяния, которой пользовались 20 лет

Физики двадцать лет использовали набор MATLAB-функций для расчёта рассеяния Ми — явления, объясняющего голубизну неба и белизну молока. В 2024 году Кристиан Мэтцлер из Бернского университета решил перенести этот код на Python. Оказалось, что сам перевод занял меньше времени, чем разбор legacy-кода и согласование с научным сообществом. Теперь исследователи по всему миру могут применять проверенные алгоритмы без привязки к коммерческому ПО.

Как появилась библиотека Mie-рассеяния

В 2002 году Кристиан Мэтцлер написал на MATLAB набор функций для расчёта рассеяния Ми — классической электродинамической задачи о рассеянии плоской волны на сфере. Код позволял вычислять коэффициенты рассеяния, поглощения и экстинкции для частиц произвольного размера и показателя преломления. В 2009 году Стивен Жак адаптировал библиотеку для тканевой оптики — области, изучающей распространение света в биологических тканях. С тех пор эти полторы сотни строк разошлись по тысячам научных работ: от атмосферных исследований до лазерной медицины.

Предыстория и контекст

Рассеяние Ми — фундаментальный инструмент для физиков, работающих с аэрозолями, коллоидами, биотканями и астрофизической пылью. MATLAB-реализация Мэтцлера стала де-факто стандартом благодаря точности и простоте. Однако за двадцать лет код оброс «историческими» правками: комментарии на немецком, недокументированные особенности, смешение стилей. Кроме того, MATLAB — коммерческая среда, что ограничивает доступ для исследователей из стран с низким бюджетом или сторонников открытого ПО. Python с библиотеками NumPy и SciPy стал естественной альтернативой, но перенос требовал не только перевода синтаксиса, но и верификации результатов.

Что именно сделал Кристиан Мэтцлер?

Мэтцлер переписал все функции на Python, сохранив алгоритмы без изменений. Он использовал NumPy для векторных операций и SciPy для специальных функций (например, сферические функции Бесселя и полиномы Лежандра). Главной задачей было обеспечить побитовое совпадение с оригиналом — чтобы старые результаты можно было воспроизвести. Для этого он сравнил выходные данные на тысяче случайных параметров. Отклонения не превысили машинной точности (около 1e-15).

Какие преимущества даёт Python-версия библиотеки Mie-рассеяния?

Python-версия не только сохраняет точность оригинала, но и превосходит его по производительности. Оригинальный код содержал циклы, которые в Python работали медленно. Мэтцлер векторизовал вычисления, что дало прирост производительности в 10–50 раз для типичных задач. Однако он сохранил возможность запуска в цикле для совместимости. Библиотека включает функции для расчёта эффективности рассеяния Qsca, Qabs, Qext, а также асимметрии g и матрицы Мюллера. Для больших частиц (параметр размера x 1000) используется аппроксимация, чтобы избежать численной нестабильности. Код опубликован на GitHub под лицензией MIT.

Технические подробности переноса

Перенос кода на Python потребовал не только синтаксической адаптации, но и глубокого понимания алгоритмов. Мэтцлер столкнулся с трудностями при разборе legacy-кода: некоторые части были написаны на устаревшем диалекте MATLAB, а комментарии на немецком языке усложняли понимание. Тем не менее, ему удалось сохранить все функциональные возможности. Для проверки корректности он провёл серию тестов, сравнивая результаты с оригинальной MATLAB-версией. Тесты показали, что отклонения находятся в пределах машинной точности, что гарантирует воспроизводимость старых результатов. Библиотека теперь доступна для интеграции в Python-экосистему, что упрощает её использование в современных научных проектах.

Кого затронет и как

Разработчики оптического ПО и симуляторов теперь могут встраивать расчёты рассеяния Ми прямо в Python-экосистему без вызова MATLAB-движка. Для учёных, изучающих атмосферные аэрозоли, это означает более быстрые и воспроизводимые вычисления. В биофотонике библиотека позволяет моделировать распространение света в тканях для диагностики и терапии. Российские и СНГ-исследователи, часто ограниченные в лицензиях MATLAB, получают свободный доступ к проверенному инструменту. Python-версия также открывает возможности для интеграции с другими библиотеками, такими как PyTorch или TensorFlow, что может быть полезно для машинного обучения в оптике.

Что будет дальше

Мэтцлер планирует поддерживать обе версии (MATLAB и Python). Сообщество уже предложило добавить поддержку многослойных сфер и некогерентное рассеяние. В перспективе библиотека может войти в состав SciPy или стать частью более крупных фреймворков для оптической томографии. Развитие будет зависеть от активности пользователей: на GitHub уже открыто несколько issue с запросами новых функций. Кроме того, обсуждается возможность создания веб-интерфейса для расчётов, что сделает библиотеку доступной даже для тех, кто не программирует.

Итог

Перенос двадцатилетнего MATLAB-кода на Python оказался не просто механическим переводом, а работой по сохранению научного наследия. Теперь тысячи исследователей могут использовать проверенные алгоритмы без привязки к коммерческому ПО. Если вы занимаетесь оптикой, аэрозолями или биофотоникой — эта библиотека стоит внимания. Она не только ускоряет вычисления, но и способствует открытой науке, делая инструменты доступными для всех.