Спектроскоп Салтана: лапласіани для фана

Спектроскоп Салтана: лапласіани для фана

Різдвяні дні - час відкласти звичні справи і згадати забави - калейдоскопи, мозаїки, сніжинки... Хто намалює найкрасивішу зірку?

Симетрія тішить око. Створити красу допомагає математика, мова Пітон і його бібліотеки - математичний numpy і графічний matplotlib.

Спектри неможливих грат

КДПВ отримана візуалізацією значень власних векторів якоїсь симетричної матриці.

В основі - спектри регулярних решіток. Деякі їхні властивості вже розглядалися раніше. Тут формули попрацюють на естетику.

Отже, припустимо, є якийсь базовий набір точок, розташованих на площині. Вимог небагато - конфігурація повинна бути центрально симетричною. Наприклад, гарним вибором буде шестикутна сітка:

Вже красиво, тільки дещо одноманітно.

Гуртки - це точки. Кожна характеризується двома координатами. Для вказаного набору точок можна обчислити власні координати на основі матриці квадратів відстаней між точками. Про це говориться в згаданій вище статті. Для розрахунку спектру треба матрицю квадратів відстаней перетворити на лапласіан (яким в даному випадку є матриця кореляції) і обчислити спектр даного лапласіана, тобто знайти його власні числа і відповідні їм вектори.

Якщо розрахувати спектр для набору точок, розташованих на площині, у спектрі буде лише дві компоненти - одна відповідає координаті x, а інша - y.

А треба зробити так, щоб спектр «задзвенів», але при цьому зберіг симетрію. Домогтися цього нескладно. Достатньо змінити (або обурити) функцію відстані між точками. Наприклад, можна покласти, що відстань між точками дорівнює не квадрату відстані, а його кубу, або зворотній відстані - можна використовувати будь-яку функцію, залежну від відстані.

Для такої «матриці відстаней» спектр вже не може бути почесним. Алгоритм розкладання матриці відстаней у спектр повинен якимось чином підібрати кожній точці такий набір координат, щоб задовольнити нестандартну відстань. Такий спектр починає дзвеніти, - кількість його компонент в загальному випадку дорівнює загальній кількості точок (правда, нульовий можна виключити).

Якщо набір точок має симетрію, частину компонента буде вироджено. Це означає, що одному і тому ж значенню власного числа будуть відповідати різні власні вектори. У нашому випадку вихідна конфігурація точок почесна, - відповідно і ступінь виродження буде кратна двом (напевно, для цього твердження існує якась теорема). А це означає, що такі дворазово вироджені рівні - проекції - можна намалювати на площині. У найпростішому варіанті - також крапками.

Припустимо, що функція відстані має такий вигляд:

f(R2) = w*Rd + 1/Rd, где w = dist/n^2, Rd = R2^degree.

Тут dist і degree - два варіюються параметри обурення. Тоді перші 9 вироджених рівнів для представленої вище базової конфігурації (гексагональної решітки розміру 7) при параметрах обурення dist = -2, degree = 1 мають вигляд:

У лівому верхньому куті є початкова конфігурація. Значення параметрів підібрані таким чином, щоб вона була майже не спотвореною.

Всі візерунки гарантовано різні, - це випливає з властивостей власних векторів (хоча іноді на око не відрізняються). Декотрі здаються незвичайнішими, ніж інші. Ось, наприклад, одна з химерних конфігурацій:

Можна взяти в якості вихідного набору квадратну решітку. Тоді симетрія буде квадратною:

Оскільки симетрія знижена, то кількість невироджених спектрів тут удвічі більша, ніж вироджених.

Додавання кольору та розміру

Якщо додати точкам колір і розмір, то сніжинки (візерунки) стануть веселішими і різноманітнішими. Фішка в тому, що колір та розмір точок можна також формувати на основі власних векторів даного набору.

Алгоритм формування кольору простий. Використовуємо якусь колірну карту (з доступних наборів у matplotlib), яка перетворює значення точки на колір, а саме значення точки беремо з якогось невиродженого власного вектора. Те саме і для розміру точки. Тоді можна отримати приблизно таке веселе мереживо:

Якщо варіювати тільки колір, то можна пограти в дитячу мозаїку:

Це математика прикрасила базову конфігурацію точок у різні кольори.

Павутинки

Якщо близькі точки з'єднати лініями, то отримаємо щось на зразок павутини. За науковим така операція називається триангуляцією. Гідність пакета matplotlib в тому, що там така операція доступна «з коробки». Павутинки красиві:

Можна вилучити частину трикутників на основі масок:

Мозаїки

Триангуляція стає кольоровою, якщо трикутники залити різними кольорами:

Вибір кольорової карти та кольорового вектора сильно впливає на сприйняття однієї та тієї самої конфігурації:

Використання масок загострює контури візерунків:

Кількість комбінацій і варіацій практично нескінченно, гра візерунків дуже химерна.

Контури

Можливо, найбільш вишуканими є візерунки, отримані за допомогою малювання контурів на основі триангуляції. Дані візерунки отримуються за допомогою методу tricontour () бібліотеки matplotlib. Навіть найнепоказніші і нудні набори точок набувають абсолютно несподіваних варіацій.

Симетрія може бути будь-якою, наприклад, 5-го порядку:

Магія якась.

Спектроскоп

Всі наведені візерунки створювалися за допомогою програми "Spectroscope" "написаної на Пітоні. Код програми не ідеальний, але доступний.

З її допомогою кожен може створювати візерунки, варіюючи параметри через нескладний інтерфейс.

Вгорі панелі керування можна вибрати один з базових наборів розподілів точок (Base). Базовий розподіл завжди має індекс один, якщо параметри обурення рівні відповідно -2 (Disturb) і 1 (Degree), тому на нього можна завжди подивитися.

Найбільш потужними є базові набори Hex (гекс) і Square (квадрат), оскільки в них найбільше точок. Тому й різноманітних візерунків вони дають більше. А ось набори x-border (межі багатокутників) і особливо Circle (окружність) навпаки - вихолощені і цікаві більше для дослідницьких цілей.

Для базового набору можна вказати його розмір (Order) за допомогою слайдера (повзунка). Наступне поле (Index) визначає номери спектрів (рівнів) з доступних для цього набору. У цій версії можна виводити 1, 4 або 9 візерунків одночасно.

Важливий параметр - тип візерунка (Plot type). Саме він задає спосіб (режим) відображення наших власних векторів. Доступні вище (Points, Web, Mosaic, Contour).

Прапорець Titles виводить над кожним спектром його числові параметри, порядковий номер у загальному складі рівнів і значення власного числа даного рівня. Це для тих, кому цікава не тільки графіка.

Нижче розташовано два слайдери для параметрів варіювання. При їх зміні спектри оживають. Нагадаємо, що права кнопка миші на слайдері - зрушує його до поточного положення, ліва - інкрементує.

Далі слідують параметри, що впливають на вигляд спектрів - колір, маркери та маска. Вони не задіяні у всіх режимах відображення. Маркери, наприклад, мають значення тільки для «точкового» режиму, а маски - навпаки, - для всіх, крім точкового.

Найбільш важливий, мабуть, колір (Color). Для його завдання необхідно вказати колірну карту (Map). Але грають кольором за допомогою вектора (слайдер з позначкою Use). Вектор кольору (і розміру маркерів також) вибирається, як зазначалося раніше, з невироджених рівнів.

У меню програми доступні стандартні функції для збереження спектрів у файли та експорту як зображень.

Є багато напрямків, куди можна розвивати спектроскоп. Крім очевидних поліпшень інтерфейсу, розвитку можливостей (анімація, наприклад, або веб-доступ) потрібно спробувати побудувати тривимірні візерунки. Їх можна не тільки дивитися, а й ліпити).

Математичні аспекти

Під час ігор зі спектрами виникає кілька цікавих питань різного ступеня важливості.

Розрахунок кількості вироджених спектрів

Може, це і не найважливіше питання, але можливо, найпростіше. Очевидно, що частка вироджених спектрів залежить від базового розподілу точок. Для основних решіток (гексагональної і квадратної) є явні формули.

Для гексагональної решітки кількість «сніжинок» Ns пов'язана із загальною кількістю точок (вузлів) N як:

Ns = (N-1)/3

У свою чергу кількість точок квадратично залежить від розміру решітки a:

N(a) = 3a(a-1) + 1. Звідси Ns (a) = a (a-1).

У квадратній решітці кількість вироджених спектрів пов'язана з кількістю точок аналогічним чином:

Ns = N/4 = a^2/4

Як отримувати такі формули для довільних конфігурацій - не дуже зрозуміло. Можливо, що загального алгоритму і не існує.

Ідентифікація рівнів спектра

Мабуть, найбільш цікаве питання. Основним способом ідентифікації рівнів спектра є величина власного числа. Якщо відсортувати дані числа в порядку зростання, то можна кожному рівню (значенню власного числа) присвоїти індекс. Цей індекс начебто і ідентифікує спектр.

Насправді це не дуже надійний спосіб. При варіюванні параметрів обурення спектри оживають - візерунки починають дихати (можна бачити, наприклад, як «плющить» базовий розподіл при зміні параметра Disturb), і їх власні числа теж змінюються. При цьому виникають ситуації, коли власні числа різних рівнів наближаються до один одного і проходять далі. Тобто спектри міняються місцями. При цьому за характером малюнка спектра можна бачити, де який спектр. Цей «характер» і треба якимось чином хешувати в ідентифікатор спектру.

Фазові переходи

Явище бурхливої зміни візерунків відбувається у вузькій смузі параметра обурення. Схоже чимось на фазовий перехід. Можливо, це відоме явище. При фазовому переході змінюється як вид спектрів, так і їх відносне розташування. У програмі вибрано вигляд обуреної функції таким, щоб при зміні параметра обурення Disturb функція змінювала знак. Можна бачити, що базовий розподіл при зміні параметра з мінімального на максимальний переходить з першого індексу на останній. Цей перехід здійснюється начебто переміщенням базового візерунка за індексами від меншого до більшого. Через якийсь час змінений базовий візерунок виникає на останньому індексі. Який потім еволюціонує до початкової базової конфігурації.

Однак у великих конфігураціях, схоже, ніхто нікуди не переміщається (ну або це неможливо відстежити). Просто в певний момент виникає зачаток нової базової конфігурації в потрібному місці (на максимальному індексі). Коротше, кому цікаво - подивіться).

Якби був якийсь параметр ідентифікації власних рівнів - можна було б більш точно відстежувати переміщення (або смерть і народження?) спектрів. І показувати на картинці завжди задані спектри незалежно від значень їх власних чисел.

Стабілізація зображення

теж поки не особливо вдалася. Візерунки періодично обертаються праворуч/ліворуч. Незрозуміло, яким чином найпростіше зорієнтувати їх завжди в одному напрямку.

Ділителі

Коли базовою конфігурацією є просте коло (точки в вершинах правильних багатокутників), то виникає феномен ділителів цілих чисел. У такому налаштуванні всі точки рівноправні. Відповідно всі вироджені рівні (а інших тут і немає) також є координатами вершин багатокутників (лежать на кола). Але при цьому спектри простих багатокутників (число вершин просте число) відрізняються від складених. У спектрах простих всі рівні - це теж прості багатокутники з таким же числом вершин. А у спектрах складових рівні складаються з ділителів вершин базового багатокутника.

Наприклад, спектр 30-вугільника складається з 14 вироджених рівнів (проекцій). З них чотири 30-вугільники, чотири 15-вугільники, два 10-вугільники, один 6-вугільник, два 5-вугільники і один 3-вугільник. Чому саме такий розподіл рівнів по ділниках - не ясно (але сильно і не вникали). Можливо, це вже пояснено десь у теорії груп.

На цьому поки все. Удачі в творчому пошуку і з Різдвом!

Image