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

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

Симетрія радує око. Створити красу нам допомогли математика лапласианов, мову Пітон і його бібліотеки — математичний 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.

Павутинки
Якщо близькі точки з'єднати лініями, то ми одержимо щось на зразок павутини. По науковому така операція називається триангуляцией. Перевага пакету 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-косинець. Чому саме такий розподіл рівнів за делителям — нам не зрозуміло (але ми сильно і не вникали). Можливо, це вже пояснено десь в теорії груп.

На цьому поки все. Успіхів у творчому пошуку і Різдвом!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.