Engee 文档
Notebook

斐波那契螺旋

在这个例子中,我们将看看如何使用交互式脚本来方便地比较不同模型的结果–图形和指定为文本程序的结果。

我们将建立一个在斐波那契螺旋上生成点的图形模型,然后将得到的图形与计算黄金螺旋模型的结果进行比较。

研究对象

斐波那契螺旋是黄金螺旋的近似值。 它由比萨的莱昂纳多(绰号斐波那契)在1202周围描述。 它是使用由四分之三圆组成的分段线性曲线定义的。 每个四分之一圆的半径 它由形成着名斐波那契数列的复发关系设置。:

哪里 .

前两项0,1通常被丢弃,螺旋从第三项立即构建: 1, 2, 3, 5, 7...)

选择每个圆的中心以使螺旋保持光滑。 每个圆的中心的点可以从模型中获得 fibonacci_spiral_model.engee (信号 cxcy)连同它们的半径(信号 r). 通过输出信号 xy 我们将绘制斐波那契螺旋图。

模型的一般视图如下所示:

image.png

黄金螺旋

黄金螺旋使用单个指数函数在整个数字轴上定义。 使用数学表达式和图形模型设置此函数同样简单。 我们正在谈论一个对数螺旋,其基数为每个半转 ,按值增加 . 这里 -黄金比例倒数的数字 .

我们将不得不使通常的对数螺旋方程复杂化。 . 重点是收敛点 斐波那契螺旋不位于原点,取决于斐波那契螺旋被刻在矩形的大小。 要匹配两个螺旋,您还需要在黄金螺旋方程中输入初始旋转的非零角度。 .

对于与斐波那契螺旋最大重合的黄金螺旋公式的推导,最好参考出版物[1]。 在这里,我们只给出极坐标的黄金螺旋的最终公式。:

哪里 -极坐标系中螺旋上点的一系列坐标, -斐波那契螺旋刻有矩形的宽度。

启动模型

让我们启动模型 fibonacci_spiral_model.engee 让我们分析一下结果。

In [ ]:
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.

运行模型非常容易:

In [ ]:
s = engee.run( modelName, verbose=false )
Out[0]:
Dict{String, DataFrame} with 3 entries:
  "x" => 1001×2 DataFrame…
  "r" => 11×2 DataFrame…
  "y" => 1001×2 DataFrame

输出对象 s 它包含表与那些信号,标记为"记录"在本模型(采用的图标 ).

结果分析

让我们选择一个绘制图形的环境。

In [ ]:
gr() # Статичные графики небольшого размера
#plotly() # Интерактивные графики по ширине экрана
Out[0]:
Plots.GRBackend()

可视化一系列斐波那契数:信号 r. 该向量包含相当多的点,因为生成它们的模型具有低采样率。

In [ ]:
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))) )
Out[0]:

建造黄金螺旋

正如我们所讨论的,为了构建与斐波那契螺旋相匹配的黄金螺旋,我们首先需要从已经构建的螺旋中获取几个参数。

In [ ]:
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 );

现在你可以计算出躺在黄金螺旋上的点的坐标。

In [ ]:
# Точки золотой спирали в полярной системе координат
R = @. (a/(2 - λ)) * sqrt(1 + λ^6) * λ^((2/pi)*(theta+α))
# Точки золотой спирали в декартовой системе координат
x,y =  R .* cos.( theta ) .+ sx, R .* sin.( theta ) .+ sy;

它仍然显示两个图形进行视觉比较。

In [ ]:
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 )
Out[0]:

显然,这些模型非常匹配。

结论

我们使用Engee的基本块构建了一个近似黄金螺旋的数学模型。 然后,使用软件控制命令,我们可视化了几个信号,并将结果与黄金螺旋方程进行了比较。

连结:

[1]段J.S.黄金矩形、斐波那契螺旋和黄金螺旋的收缩点//自然界和社会中的离散动力学。 – 2019. -卷。 2019. -第1-6页。