Начался новый учебный год, и преподавателям, студентам и школьникам, возможно, требуется (или просто хочется) посмотреть на то, как выглядят орбитальки, на которых сидят электроны в атомах: все эти завораживающие буковки s, p, d, f, и т.д. Да, картинок полно как в учебниках, так и в Интернете, но покрутить орбитальки на картинке не получится, а картинку из учебника/с левого сайта в презентацию/реферат без мороки с лицензией пихать (по-хорошему) не стоит. Поэтому в этом посте мы разберём одну из возможных реализаций рисовалки для этих самых орбиталек.  Саму концепцию того, что такое атомные орбитали я уже разбирал (https://habr.com/ru/post/443232/), то как рисовать эти орбитали при помощи метода Монте-Карло в варианте алгоритма Метрополиса тоже (https://habr.com/ru/post/548704/), спасибо за внимание.  Ладно, шучу, здесь мы ещё раз немного пройдёмся по тому, что такое орбитали, какие они бывают, и как их строить с помощью вышеприведённого скрипта.  Атомная орбиталь -- это волновая функция для выбранного электрона в атоме, поэтому будем обозначать их буковкой ψ. Согласно квантовой механике, мы не можем знать где электрон находится и как быстро он куда-то летит, но нам доступно знание (например) о вероятности нахождения этого электрона в пространстве. И орбитали это знание нам и предоставляют: найти электрон в месте с координатой x (p(x)) даётся квадратом волновой функции: p(x)=|ψ(x)|2. Сами атомные орбитали можно представить в виде двух компонент: радиальной (R, зависящей только от того, как далеко от ядра убежал электрон) и угловой (A, зависящей только от того, с какой именно стороны от ядра находится наша частица), так что ψ=R·A. Для наших целей визуализации мы вполне можем себе представить каждую орбиталь в виде: здесь радиальная часть дана как экспоненциально убывающая вероятность найти электрон вдали от ядра, где параметр R0 контролирует "размер" орбитали, а угловая часть дана как произведение координат в некоторых степенях n≥0. Собственно, тип орбитали, который даётся орбитальным квантовым числом l в данном представлении -- это просто сумма всех степеней для x,y,z координат: Т.е. для s-орбиталей (l=0) нам нужны nx=ny=nz=0, для p-орбиталей, которых у нас три штуки, нам нужны следующие комбинации: nx=1, ny=nz=0 (px-орбиталь), ny=1, nx=nz=0 (py-орбиталь), nz=1, nx=ny=0 (pz-орбиталь). Но дальше всё будет плохо. Для каждого орбитального квантового числа l у нас должна быть N=2l+1 орбиталь, и для s и p у нас всё удовлетворяло этому соотношению. А вот дальше, из условия l=nx+ny+nz у нас будет получаться слишком много допустимых комбинаций. Например, для d-орбиталей (l=2) по формуле у нас должно быть 5 функций, но возможных комбинаций у нас будет уже 6 штук. Что делать с лишними?  Весь сыр-бор будет заключаться в том, что лишние орбитали -- это будут какие-то комбинации некоторых N=2l+1-избранных, настоящих орбиталей, которые то нас и интересуют. Поэтому, чтобы их построить, нужно будет несколько обобщить угловую часть волновой функции, взяв взвешенную сумму различных форм орбиталей: где c -- это некие постоянные коэффициенты. И вот для окончательного изображения орбиталек мы и будем использовать выражение для волновой функции В скрипте все эти степени n и коэффициенты c задаются различными аргументами (о чём можно узнать запустив скрипт с опциями -h или --help): С этими знаниями попробуем нарисовать простейшие типы орбиталек. Как многие могут помнить (из курса школьной химии) -- это такие "шарики", когда электрон летает вокруг атома в виде шарообразного облака. Наша волновая функция имеет вид c1=1, nx1=ny1=nz1=0. Чтобы построить эту орбитальку скриптом, данным в самом начале поста, надо будет выполнить команду, где gen-plot_orb.py -- это название скрипта, а "--plot"  -- это опция, чтобы включить отрисовку полученной орбитали. В результате мы получим картинку, где число точек и их цвет будет отображать значение волновой функции: Я никакущий специалист по Matplotlib, поэтому отсюда и далее я буду приводить картинки, построенные при помощи Gnuplot косыми скриптами, типа того, что убран под спойлер.   Соответственно, перестроенная Gnuplot-ом s-орбиталь будет выглядеть так: Всё, как мы и привыкли, шарик. Здесь l=1, и, соответственно, три p-орбитали, мы можем построить командами:   В результате чего мы получим следующие изображения орбиталей: Вновь, всё выглядит как и ожидалось после изучения школьной программы: три "гантельки", направленные в три разные стороны, и каждая половинка орбитали имеет знак, противоположный другой половинке той же гантели.  l=3, и тут должно быть пять орбиталей. Три из них строятся просто (т.н. dxy, dxz, dyz): Выглядят они как две спаренные гантели p-орбиталей но с изменёнными знаками половинок, например: Ещё одна из таких спаренных гантелей получается как разность x2 и y2 орбиталей командой  А вот последняя орбиталь, называемая d(z2) -- самая сложная, она на самом деле состоит из трёх наших орбиталей-кирпичиков. Коэффициенты между положительными и отрицательными кусками на самом деле можно найти, но это надо или копать литературу, или поднимать зубодробительный матан, так что я их просто подобрал, чтобы было похоже на то, как эта орбиталь должна выглядеть: что даёт в результате искомую форму однозначной гантельки с надетым на неё бубликом тором: А более сложные виды орбиталей оставляю на самостоятельный разбор, ибо f-функций будет уже 7 штук, конструируемых из 10 простейших орбиталек.  Просто парочка комментариев, которые я не знаю куда запихать ещё. На самом деле, радиальная часть атомных орбиталей имеет существенно более сложный вид, но для целей визуализации это не очень важно, и в тех же квантово-химических расчётах по методу МО ЛКАО (молекулярные орбитали как линейные комбинации атомных орбиталей) используются именно выражения, аналогичные тому, что использовали мы, так что сильно мы от такого упрощения не соврали. Я понимаю, что мог уже достать всякими штуками типа орбиталек и Монте-Карло. Если это так, дайте знать в комментах (там можно как выразить своё "фи", так и добавить более конструктивных комментов, например, о чём бы хотелось видеть статьи). Много кому не нравится этот стиль изображения орбиталей (достаточно посмотреть на отклики к посту https://habr.com/ru/post/548704/). Мне этот стиль, очевидно, нравится, поскольку он, как мне кажется, отражает статистическую природу волновой функции, а ещё в моём больном мозгу, видимо, он ассициируется с чем-то типа импрессионизма. Этот скрипт и картинки я делал для своей образовательной деятельности, так что могу только сказать "не нравится -- не ешьте".  В качестве простой (и бесплатной!) альтернативы, могу посоветовать молекулярный визуализатор Jmol (http://jmol.sourceforge.net/). Помимо кучи реально полезных в работе функций, он умеет и просто строить орбитали водородоподобного атома в стандартном виде. Например, орбитали можно построить из консоли парочкой команд (см. например здесь). А ещё на YouTube есть классный ролик об изображении орбиталей в виде Бомовских траекторий: https://youtu.be/W2Xb2GFK2yc .  Чтобы не быть голословным по поводу Jmol, вот изображение d-орбитальки, полученное командами ниже: Спасибо за внимание.  Ламер