Спираль Фибоначчи¶
В этом примере мы разберем, как пользоваться интерактивными скриптами, чтобы удобно сравнивать результаты работы разных моделей – графических и заданных в виде текстовой программы.
Мы построим графическую модель, порождающую точки на спирали Фибоначчи, а затем сравним полученный график с результатом расчета модели золотой спирали.
Изучаемый объект¶
Спираль Фибоначчи является аппроксимацией золотой спирали. Ее описание дал Леонардо Пизанский (прозванный Фибоначчи) около 1202 г. Она задана при помощи кусочно-линейной кривой, состоящей из четвертей окружностей. Радиус каждой четверти окружности $n$ задается рекуррентным соотношением, которое образует знаменитую последовательность Фибоначчи:
$$F_0 = 0, ~ F_1 = 1, ~ F_n = F_{n-1} + F_{n-2}$$
где $n \geq 2, ~ n \in Z$.
(первые два термина 0, 1 обычно отбрасываются, спираль строится сразу с третьего термина: 1, 2, 3, 5, 7...)
Центр каждой окружности подбирается таким образом, чтобы спираль оставалась гладкой. Точки центра каждой окружности можно получить из модели fibonacci_spiral_model.engee
(сигналы cx
и cy
) наравне с их радиусами (сигналы r
). По выходным сигналам x
и y
мы будем строить график спирали Фибоначчи.
Общий вид модели представлен ниже:
Золотая спираль¶
Золотая спираль определена на всей числовой оси при помощи одной экспоненциальной функции. Эту функцию одинаково просто задать как при помощи математического выражения, так и при помощи графической модели. Речь идет о логарифмической спирали, радикс которой, за каждую половину оборота $\pi/2$, увеличивается на значение $\lambda = \frac{\sqrt{5}-1}{2} \approx 0.618$. Здесь $\lambda$ – число, обратное золотому сечению $\varphi \approx 1.618$.
Нам придется усложнить обычное уравнение логарифмической спирали $r = c \lambda^{(2/\pi)\theta}$. Дело в том, что точка сходимости $(s_x, s_y)$ спирали Фибоначчи находится не в начале координат и зависит от размеров прямоугольника, в который вписана спираль Фибоначчи. Для совпадения обеих спиралей нужно также ввести в уравнение золотой спирали ненулевой угол начального поворота $\alpha$.
За выводом формулы золотой спирали, максимально совпадающей со спиралью Фибоначчи, лучше обратиться к публикации [1]. Мы же здесь приведем лишь финальную формулу золотой спирали в полярных координатах:
$$r = \frac{a}{2 - \lambda}\sqrt{1 + \lambda^6} \lambda^{\frac{2}{\pi}(\theta + \alpha)}$$
где $(\theta, r)$ – ряд координат точек на спирали в полярной системе координатах, $a$ – ширина прямоугольника, в который вписана спираль Фибоначчи.
Запуск модели¶
Запустим модель fibonacci_spiral_model.engee
и проанализируем результаты.
modelName = "fibonacci_spiral_model";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
Эта конструкция позволила нам проверить, была ли модель загружена и открыта пользователем (тогда нам нужна команда open
), или ее нужно загрузить при помощи команды load
.
Запустить модель очень просто:
s = engee.run( modelName, verbose=false )
Выходной объект s
содержит таблицы с теми сигналами, которые в модели отмечены как "логируемые" (при помощи пиктограммы ).
Анализ результатов¶
Выберем окружение для отрисовки графиков.
using Plots
gr() # Статичные графики небольшого размера
#plotly() # Интерактивные графики по ширине экрана
Визуализируем ряд чисел Фибоначчи: сигнал r
. Этот вектор содержит довольно мало точек, потому что модели, порождающая их, имеет низкую частоту дискретизации.
plot( s["r"].time, s["r"].value, label="Ряд Фибоначчи", st=:stem )
# Зададим собственные подписи для шкалы X
plot!( xticks=( range( minimum(s["r"].time), maximum(s["r"].time), step=1),
Int.(range( minimum(s["r"].time), maximum(s["r"].time), step=1))) )
Построение золотой спирали¶
Как мы обсуждали, чтобы построить золотую спираль, совпадающую со спиралью Фибоначчи, нам сперва нужно получить несколько параметров из уже построенной спирали.
theta = range( -0.8*pi, 12*pi, step=0.01); # Область определения золотой спирали
λ = (sqrt(5)-1)/2; # Число, обратное золотому сечению
# Размеры прямоугольника, в который вписана спираль Фибоначчи
a = maximum(s["x"].value) - minimum(s["x"].value)
b = maximum(s["y"].value) - minimum(s["y"].value)
# Координаты центра спирали Фибоначчи
# - в системе координат этого прямоугольника)
x = (1 - λ)/(2 - λ) * a
y = (1 - λ)/(2 - λ) * b
# - в системе координат графика
sx = minimum(s["x"].value) + x;
sy = maximum(s["y"].value) - y; # (учтем, что ось y направлена вверх)
# Угол поворота золотой спирали относительно спирали Фибоначчи
α = atan( 2*λ - 1 );
Теперь можно рассчитать координаты точек, лежащих на золотой спирали
# Точки золотой спирали в полярной системе координат
R = @. (a/(2 - λ)) * sqrt(1 + λ^6) * λ^((2/pi)*(theta+α))
# Точки золотой спирали в декартовой системе координат
x,y = R .* cos.( theta ) .+ sx, R .* sin.( theta ) .+ sy;
Осталось вывести оба графика для визуального сравнения.
plot( s["x"].value, s["y"].value, lc=:skyblue, aspect_ratio=:equal, lw=4, label="Спираль Фибоначчи" )
plot!( x, y, lc=:black, ls=:dash, label="Золотая спираль", legend=:topleft )
Очевидно, что модели довольно хорошо совпадают.
Выводы¶
Мы использовали базовые блоки Engee, чтобы построить математическую модель, которая аппроксимирует золотую спираль. Затем, используя команды программного управления, мы визуализировали несколько сигналов и сравнили полученный результат с уравнением золотой спирали.
Ссылка:
[1] Duan J. S. Shrinkage points of golden rectangle, Fibonacci spirals, and golden spirals //Discrete Dynamics in Nature and Society. – 2019. – Т. 2019. – С. 1-6.