如何根据斐波纳契比制作阻尼/阻尼正弦波?
我可以使用Octave / Matlab创建一个基于Fibonacci比率的图,请参阅下面的代码以及图。
clear all,clf reset, clc,tic
more off
fib1=[1,1,2,3,5,8,13,21]
fib2=[1,2,3,5,8,13,21,34]
y=fib1./fib2
x_end=size(fib1,2);
x=[1:x_end]
plot(x,y)
我试图让情节看起来像一个阻尼的sin波,但基于Fibonacci比率。参见示例阻尼图。
Ps:我正在使用Octave 4.0,就像Matalb
答案 0 :(得分:3)
我想我理解你在寻找什么。基本上,这个问题背后的主要概念是从Fibonacci序列中提取的连续数的比率可以接近golden number(也称为phi
),并且你越高入到序列,可以近似phi
。从这个假设开始,您希望表明这些比率与phi
的关联方式遵循damped sine wave定义的模式。
你的情节的主要问题来自于用于绘图的点太少的事实,因此得到的线看起来是分段的而不是显示典型的正弦形状。此外,被一个(fib2
)偏移的序列应该是被另一个(fib1
)除的那个,而不是相反的......只要我没有误解你的目标。
如果范围x = 0:0.01:9
包含足够的点以允许使用正确的形状绘制线条,那么让我们从构建和绘制波浪本身开始:
x_max = 9;
x = 0:0.01:x_max;
gr = (1 + sqrt(5)) / 2;
w = (gr - 2) .* exp(1 - x) .* cos(pi() .* x) + gr;
plot(x,w);
seq = 1:(x_max+2);
fib = fibonacci(seq);
p = fib(2:end) ./ fib(1:end-1);
y = NaN(size(x));
y(ismember(x,seq-1)) = p;
hold on;
plot(x,y,'or');
hold off;
最终输出:
如果您的唯一目标是绘制您计算的波浪...正如我之前所说,主要问题是缺少积分。仅有8
个点,由于精度差,线条会失去形状。为了解决这个问题,请按照以下方式编写代码(正如Cris建议的那样spline,在这种情况下是一个非常好的工具):
fib1 = [1,1,2,3,5,8,13,21];
fib2 = [1,2,3,5,8,13,21,34];
y = fib1 ./ fib2;
y = spline(0:7,y,0:0.01:7);
plot(y);