Перевод поста Майкла Тротта (Michael Trott) "Making Formulas… for Everything—From Pi to the Pink Panther to Sir Isaac Newton".
Выражаю благодарность за помощь в переводе Сильвии Торосян.
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, можно здесь (архив, ~7 МБ).


В компании Wolfram Research и Wolfram|Alpha мы любим математику и вычисления. Наши любимые темы — алгоритмы, следующие из формул и уравнений. Например, Mathematica может вычислить миллионы интегралов (точнее бесконечное их количество, встречающихся на практике), а также Wolfram|Alpha знает сотни тысяч математических формул (от формулы Эйлера и BBP-формул для Pi до сложных определённых интегралов, содержащих sin (x)) и множество формул физики (например, от закона Пуазейля до классических решений механики для точечной частицы в прямоугольнике или потенциала обратного расстояния в четырехмерном пространстве, в гиперсферических координатах), так же как менее известные формулы, такие как формулы для частоты дрожащей мокрой собаки, максимальной высоты песочного замка, или времени приготовления индейки.

Недавно мы добавили формулы для множества разнообразных фигур и объектов. В Блоге Wolfram|Alpha были показаны некоторые примеры формирования фигур, которые были задавались с помощью математических уравнений и неравенств. Среди построенных кривых есть кривые образов вымышленных персонажей:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_1.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_2.png

Кривые очертаний объектов:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_3.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_4.png

и, наиболее популярные среди наших пользователей, кривые образов реальных людей:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_5.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_6.png

Так как эти кривые в математическом смысле, сходны с лемнискатой или листом Декарта, они более интересны с точки зрения их графического отображения, чем своими математическими свойствами.

После того как, была опубликована статья в блоге Ричарда, мой коллега спросил меня, “Как Вы составляете уравнение, описывающее лицо Стивена Вольфрама?” После минутного размышления над этим вопросом, я понял, что действительно поразительно, вопрос не в том, что существует аналитическое выражение: цифровое изображение (предположим для простоты, что оно черно-белое) представляет собой прямоугольный массив значений серого цвета. По такому массиву можно построить интерполирующую функцию, даже полином. Но такая явная функция была бы очень громадной, длиной в сотни страниц, и не была бы пригодна для какого-либо практического применения. На самом деле трудностью является то, как можно получить аналитическое выражение, которое имело бы сходство с лицом человека, так чтобы оно поместилось на одной странице и имело простую структуру. Аналитическое выражение для кривой, которая изображает лицо Стивена Вольфрама, длиной приблизительно в одну страницу, что сравнимо с размером сложной формулы физики, такой как, скажем, гравитационный потенциал куба.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_7.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_8.png

В этой статье я хочу показать, как сгенерировать такого рода уравнения. Совершенно не удивительно, что в статье в которой рассказывается “как выполнять вычисления...” вы увидите значительное количество кода Mathematica, но я начну с простых вступительных объяснений.

Предположим, что вы делаете линии рисунка карандашом на листке бумаги и допустим, что рисуете только линии; никакую штриховку и никакое заполнение не делаете. Тогда рисунок будет выполнен из ряда сегментов кривой. Математическое понятие, такое как ряды Фурье позволяет нам записывать конечную математическую формулу для каждого из этих линейных сегментов, которые будут описывать их как угодно точно.

В качестве простого примера рассмотрим ряд функций making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_9.png,

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_10.png

которые являются суммой синусоид различных частот и амплитуд. Вот первые несколько членов этой последовательности функций:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_11.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_12.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_13.png

Графическое построение этой последовательности функций показывает, что с увеличением n функция making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_14.png стремится к треугольной функции.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_15.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_16.png

Функция синуса является нечётной функцией, и в результате любые суммы функций вида sin(kx) также являются нечётными функциями. Если мы используем функцию косинуса, то вместо этого получим чётные функции. Композиция из значений синусов и косинусов позволяет нам аппроксимировать более общие формы кривых.

Обобщая вышесказанное, заменим множить в рассматриваемом ряду на making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_17.png, а также зададим два ряда, от синусов и косинусов, соответственно:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_18.gif

Данные функции позволяют аппроксимировать более широкий класс функций:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_19.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_20.png

Можно показать, что любая гладкая кривая y(x) может быть сколь угодно хорошо аппроксимирована на любом интервале making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_21.png с помощью рядов Фурье. Причем для гладких кривых значения коэффициентов sin(k x) и cos(k x) стремятся к нулю при больших значениях k.

Теперь, рассматривая параметрическую кривую making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_22.png, мы можем использовать такого рода суперпозиции функций синусов и косинусов независимые для горизонтальной making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_23.png и вертикальной making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_24.png составляющих.

Использование суммы трёх синусов и трёх косинусов в каждой из компонент уже охватывает большое разнообразие форм, включая круги и эллипсы:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_25.gif

Следующая интерактивная демонстрация позволяет нам исследовать пространство возможных форм. 2D слайдеры изменяют соответствующие коэффициенты перед функциями косинуса и синуса:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_26.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_27.png

Если мы оборвём разложение в ряд Фурье кривой, скажем на первых n членах ряда, мы получим 4n свободных параметров. В пространстве всех возможных кривых, большинство кривых будут выглядеть неинтересно, но при некоторых значениях коэффициентов, разложения будут иметь вид фигур, в которых можно будет увидеть знакомые формы. Однако, даже небольшие изменения в коэффициентах разложения сильно меняют фигуру. Следующий интерактивный пример позволяет менять начальные 4?16=64 коэффициента ряда Фурье кривой. Используя особые наборы коэффициентов рядов Фурье, мы можем получить различные узнаваемые фигуры.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_28.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_29.png

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

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_30.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_31.png

Теперь сделаем обратное: расположим ряд точек (синие крестики) так, чтобы образовалась линия, которую можно будет менять и построим кривую, которая будет приближать заданную кривую рядами Фурье:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_32.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_33.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_34.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_35.png

Примечание: ряды Фурье — это не единственный способ задания аппроксимирующих кривых. Мы могли бы использовать вейвлеты или сплайны, или кодировать кривые кусочно через круговые сегменты. Или при достаточном терпении, с помощью универсальности дзета-функции Римана, мы могли бы найти любую фигуру внутри критическую полосы. (Как ни удивительно, любое возможное (достаточно гладкое) изображение, такое как Иисус на тосте, существует при некоторых значениях дзета-функции Римана ?(s) в полосе 0?Re(s)?1, но у нас нет конструктивного способа, чтобы найти его.)

Чтобы продемонстрировать как найти простые, основанные на ряде Фурье формулы, которые приближают данные фигуры, мы начнём с примера: фигура с точными, чётко определёнными границами — короткая формула. Более конкретно, мы будем использовать известную формулу: теорему Пифагора.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_36.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_37.png

Растеризация уравнения даст исходное изображение, которое мы будем использовать:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_38.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_39.png

Легко можно получить набор всех точек, описывающих края символов, с помощью функции EdgeDetect.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_40.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_41.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_42.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_43.png

Теперь, когда у нас есть точки, которые задают края, мы можем соединить их прямыми (или криволинейными) сегментами. Следующая ниже функция pointListToLines осуществляет эту операцию. Мы начинаем со случайно выбранной точки и найдем все ближайшие точки к ней (используя быструю функцию Nearest). Мы продолжим этот процесс до тех пор, пока не найдем точки все достаточно близкие точки. Также сделаем так, чтобы не было разворотов на 180 градусов. Чтобы наблюдать за тем, как формируются кривые, мы используем функцию Monitor.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_44.png

Для изображения записи теоремы Пифагора мы получаем 11 конкретных кривых из граничных точек.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_45.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_46.png

Соединив наборы точек и раскрасив полученные кривые, мы увидим вполне ожидаемый набор кривых: внешние границы букв, внутренние границы букв a и b, три квадрата, плюс и знак равенства.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_47.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_48.png

Теперь для каждого сегмента кривой нам потребуется найти ряд Фурье (x и y компоненты), который аппроксимирует сегмент. Руководствуясь обычным определением ряда Фурье функции f(x), мы знаем, что коэффициенты ряда являются интегралами от функции f(x), умноженной на cos(k x) и sin(k x). Но пока мы имеем множество точек, а не функции. Чтобы преобразовать их в функции, которые мы сможем интегрировать, создадим B-сплайны кривой для каждого ее сегмента. Параметризованная переменная B-сплайна кривой будет переменной интегрирования. (Использование B-сплайнов вместо кусочно-линейной интерполяции между точками даст нам дополнительные преимущества при аппроксимации сильно ломаных кривых.)

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_49.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_50.png

Мы можем найти интегралы, необходимые для получения коэффициентов Фурье с помощью численного интегрирования, однако, более быстрый способ заключается в использовании быстрого преобразования Фурье (FFT) для получения коэффициентов Фурье.

Для получения более однородных кривых мы выполним ещё один шаг: повторно параметризуем интерполированную кривую сплайна, состоящую из набора сегментов кривой, с помощью нового параметра — длины дуги. Функция fourierComponents реализует создание B-сплайна кривой, повторную параметризацию длиной дуги и вычисляет FTT для получения коэффициентов Фурье. Мы также учитываем открыт ли сегмент кривой или закрыт, чтобы избежать явления Гиббса. (Приведенная выше демонстрация аппроксимации пентаграммы хорошо показывает явление Гиббса в случае, если флажок “замкнуть кривую” снят.)

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_51.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_52.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_53.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_54.png

Для непрерывной функции мы ожидаем среднее значение скорости убывания making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_55.png для k-ого коэффициента ряда Фурье. Этот эффект должен сохраняться и для рассчитываемых нами коэффициентов ряда Фурье. Это означает, что в среднем на 10-й коэффициент Фурье приходится только 1% абсолютной величины по сравнению с первым. Это даёт возможность обрезать ряд Фурье на не очень высоких порядках, поскольку мы не хотим получать формулы, которые будут слишком большими. Выражение ниже вычисляет средний показатель степени скорости убывания Фурье-компонентов для вышеприведённой кривой making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_56.png. (Значение немного меньшее 2 объясняется дискретизацией точек в кривых B-сплайна.)

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_57.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_58.png

Ниже показан график в логарифмическом масштабе по обеим осям с абсолютными значениями коэффициентов ряда Фурье для первых трёх кривых. Вместе с тем общая тенденция относительно, скажем, квадратичного затухания для коэффициентов Фурье показывает, что величина соседних коэффициентов часто колеблется больше, чем среднее значение убыли коэффициентов в целом.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_59.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_60.png

Умножение коэффициентов Фурье на cos(k t) и sin(k t) и суммирование этих выражений даёт нам желаемую параметризацию кривых.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_61.png

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

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_62.png

Для картинки, соответствующей теореме Пифагора, начиная с десятка эллипсов, мы быстро формируем исходное изображение, увеличивая количество членов ряда Фурье.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_63.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_64.png

Мы хотим определить аналитическое выражение для всего уравнения, даже если это выражение будет состоять из не пересекающихся сегментов кривой. Для достижения этого, мы используем периодичность членов ряда Фурье, имеющих период 2?, для того, чтобы изобразить каждый из сегментов на соответствующем отрезке: [0,2?], [4 ?, 6 ?], [8 ?, 10 ?], …, а в интервалах (2?,4?), (6 ?, 8 ?), …, мы будем иметь чисто мнимые координаты кривой. На этих отрезках кривая не может быть изображена, а значит, мы получаем набор не пересекающихся сегментов кривой. Ниже эта конструкция показана для набора из двух окружностей:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_65.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_66.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_67.png

График ниже показывает отдельно действительные и мнимые части из комплексозначной параметризации, построенной выше. Красная линия показывает чисто мнимые значения параметра из интервала [2?,4?].

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_68.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_69.png

Так как мы хотим, чтобы заключительная формула для кривых выглядела настолько коротко и просто насколько это возможно, мы заменяем сумму в формуле a cos(k t) + b sin(k t) на A sin(k t+?) используя функцию sinAmplitudeForm, а также округляем приближенные коэффициенты ряда Фурье до ближайших рациональных чисел. Вместо Piecewise, мы используем функцию UnitStep в окончательной формуле, чтобы отделить друг от друга разные сегменты кривой. Вещественные сегменты мы перечисляем в явном виде, а все сегменты, которые не должны быть нарисованы задаются через выражение making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_70.png.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_71.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_72.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_73.png

Теперь у нас есть всё, чтобы записать заключительную параметризацию {x(t),y(t)} картинки, на которой изображено равенство, задающее теорему Пифагора:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_74.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_75.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_76.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_77.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_78.png

После того, как мы обсудили основные идеи составления параметризации, давайте рассмотрим более забавный пример, скажем Розовую пантеру. Просматривая результаты поиска изображения поисковой системой Bing, мы быстро находим изображение, которое подходит для параметризации в виде "замкнутой формы".

Давайте используем следующее изображение:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_79.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_80.png

Применим функцию EdgeDetect для того, чтобы найти все границы лица пантеры.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_81.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_82.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_83.png

Соединяя края кривой, получаем около 20 сегментов. (Изменив дополнительный второй и третий аргумент функции pointListToLines, мы получим меньшее или большее количество сегментов.)

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_84.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_85.png

Ниже каждый сегмент показан различным цветом. Мы видим, что некоторые замкнутые кривые являются результатом двух соединённых сегментов кривой; мы могли бы отделить их изменяя второй аргумент в функции pointListToLines. Но в нашей задаче это не особо важно.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_86.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_87.png

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

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_88.png

Графическое изображение ряда показывает, что в случае, если берется 20 членов ряда на один сегмент, мы получим кривую, которая хорошо описывает о Розовую пантеру.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_89.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_90.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_91.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_92.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_93.png

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

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_94.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_95.png

Для простых случаев мы можем теперь свернуть всю вышеупомянутую функцию в одну функцию. Заданная ниже функция makeSilhouetteFourierResult берет изображение в качестве своего аргумента. Данная функция в соответствии со следующей последовательностью действий: 1) вычисляет ряд Фурье; 2) возвращает в качестве результата участки ряда Фурье и интерактивную версию, которая позволяет нам изменить порядок ряда Фурье. Для простоты мы ограничиваем программу только для единственной кривой.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_96.png

Вот четыре примера показывающие работу этой функции. Мы берем 4 изображения: паука; логотипа человека-паука; пары, танцующей танго и русалки.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_97.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_98.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_99.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_100.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_101.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_102.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_103.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_104.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_105.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_106.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_107.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_108.png

До сих пор начальные линейные сегменты были вычислены из изображений. Но мы также можем начать с нарисованных от руки кривых. Предположим, что мы хотим формулу для Исаака Ньютона. Так как я не силён в рисовании лиц, я немного смухлевал и использовал инструмент рисования кривых, чтобы нарисовать характерные линии лица и волос изображения сэра Исаака. (О алгоритмическом подходе к извлечению характерных линий лиц см. недавнюю статью Чжао и Чжу.) Вот изображение, которое мы будем использовать:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_109.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_110.png

К счастью, небольшие случайные покачивания в нарисованной от руки кривой не будут иметь значения, так как они будут удалены, при опускании членов высших порядков в ряде Фурье.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_111.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_112.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_113.png

Чтобы лучше увидеть нарисованные от руки кривые, мы отделяем изображение и линии.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_114.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_115.png

На этот раз, у нас есть 16 сегментов. Мы создаём их ряд Фурье.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_116.png

Ниже мы снова видим изображения, полученные с использованием различного количества членов ряда Фурье каждого из сегментов изображения:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_117.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_118.png

Теперь используем различное количество членов ряда на разных сегментах. Для волос, мы используем довольно много членов ряда, а для глаз относительно мало. Это позволит гарантировать, что полученные уравнения лица не будут слишком большими.

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_119.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_120.png

Ниже на одном графике показаны первые 50 приближений:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_121.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_122.png

Итак, мы получили следующую формулу, описывающую образ сэра Исаака Ньютона:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_123.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_124.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_125.png

А вот и график последнего параметрического представления:

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_126.png

making-formulas-for-everything-from-pi-to-the-pink-panther-to-sir-isaac-newton_127.png

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

Комментарии (11)


  1. rbobot
    03.04.2015 13:36
    +6

    image


    1. MichaelBorisov
      04.04.2015 00:19
      +2

      Как доказать, что крокодил более длинный, чем широкий?

      Доказательство производится в два этапа: сначала доказывается, что крокодил более длинный, чем зеленый, а потом — что он более зеленый, чем широкий. Из этого следует, что крокодил более длинный, чем широкий.

      1. Докажем, что крокодил более длинный, чем зеленый. Посмотрим на крокодила сверху. Он и длинный, и зеленый. Теперь посмотрим на крокодила снизу. Он длинный, но не зеленый. Следовательно, крокодил более длинный, чем зеленый.

      2. Докажем, что крокодил более зеленый, чем широкий. Посмотрим на крокодила сверху. Он зеленый и в длину, и в ширину, а широкий он только в ширину. Следовательно, крокодил более зеленый, чем широкий.

      ч.т.д.


  1. Psychopompe
    03.04.2015 14:03

    Сделано в 10.1 версии?


    1. OsipovRoman Автор
      03.04.2015 14:25
      -1

      Да, но код будет работать полностью и в 8, скажем.


      1. Psychopompe
        06.04.2015 12:21

        Не подскажете, когда будет релиз?


  1. lany
    03.04.2015 15:11


    — чем-то на Масяню похоже.


    1. OsipovRoman Автор
      03.04.2015 15:32
      +8

      При увеличении количества членов ряда Фурье, точность отрисовки изображения вырастет.


  1. BubaVV
    03.04.2015 19:42

    Изначальное лого Хабра надо так, возможно получится интересно


  1. mkot
    03.04.2015 21:11

    Было б время, мог бы целую пачку хабрастатей нагенерить как в этом блоге. А если б ещё знал математику… :)


    1. OsipovRoman Автор
      03.04.2015 21:34

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

      Некоторые ваши посты, скажем, «Ёжик во фрактальном тумане», просто потрясающие.


  1. cjfynjy
    04.04.2015 05:13

    Мне одному кажется, что тут изображен логотип Хабра? :)

    image