1 說明
====
1.1 斐波那契數列的介紹。
1.2 斐波那契數列是上帝的指紋,大自然中隨處可見,目前廣泛應用到黃金分割線的佈局美和股市等預測等等。
1.3 斐波那契數列的python的matplotlib和turtle的可視化。
1.4 本文為整理後的資料,小白易懂,適合收藏。
2 斐波那契數列
===========
2.1 斐波那契數列(Fibonacci sequence),又稱黃金分割數列。
2.2 因他以兔子繁殖為例子而引入,故又稱為“兔子數列”。
2.3 數列為:1、1、2、3、5、 8、13、21、34、55、89、144......
2.4 數列中的數為斐波那契數。
2.5 斐波那契數列是上帝的指紋,是一切自然紋理的規律線,文末有圖。
3 先看看python的可視化效果圖
=======================
3.1 圖1
3.2 圖2:
3.3 圖3
3.4 圖4
3.5 圖5
4 圖片的代碼
==========
4.1 圖1的代碼:
import matplotlib.pyplot as plt
#定一個空列表,存放斐波那契數列的數
#作為可視化y座標軸值
y_data=[]
#數列產生
def fib(n):
a=0
b=1
while a<=n:
#將產生的數列的數添加到列表中
y_data.append(a)
a,b=b,a+b
#自定義輸入自然整數範圍
n=int(input('請輸入非0任意整數:,推薦500:'))
#調出函數產生數列
fib(n)
#定義x座標軸數列個數序號
x_data=[i for i in range(len(y_data))]
#標題名
plt.title('該數列的個數:'+str(len(y_data)))
#作圖
plt.plot(x_data,y_data,'r',marker='o')
#數值標註
for xy in zip(x_data, y_data):
plt.annotate("(%s,%s)" % xy, xy=xy, xytext=(-20, 10), textcoords='offset points')
#圖片展示
plt.show()
4.2 圖2代碼
#參考文章:https://blog.csdn.net/cd_don/article/details/87212314
#導出模塊
import numpy as np
import matplotlib.pyplot as plt
#定義數列產生的函數
def fibo(n):
if n == 0:
fibo_list = np.array([0])
#修改源代碼bug
elif n == 1:
fibo_list = np.array([0,1])
else:
f_0, f_1 = 0, 1
fibo_list = np.array([f_0,f_1])
for i in np.arange(n-2):
fibo_num = f_0 + f_1
fibo_list = np.append(fibo_list,fibo_num)
f_0, f_1 = f_1, fibo_num
return fibo_list
#定義劃線函數,由列表找到xy座標
def find_o_xy(f_list):
#起始圓心座標
x_n, y_n = 0, 0
o_x_array, o_y_array = np.array([x_n]), np.array([y_n])
for n in np.arange(1,len(f_list)):
#需要注意pyhton中計數是從0開始
#第一項作為起始點已經給出
y_n=y_n+np.mod(n+1,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)
x_n=x_n+np.mod(n,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)
#橫縱座標(x,y)
o_x_array = np.append(o_x_array, x_n)
o_y_array = np.append(o_y_array, y_n)
return o_x_array, o_y_array
#畫圓弧設置
#以下繪圖以n=7為例
count = 7
f_list = fibo(count)
x0_array,y0_array = find_o_xy(f_list)
#各個正方形對應的邊長,如例圖半徑從1,2...開始
f_list_r = fibo(count+2)[2::]
#畫出各個正方形內的1/4圓
start_angle, end_angle = np.pi, 1.5*np.pi
for n in np.arange(len(f_list)):
t=np.arange(start_angle,end_angle,0.001)
circle_x = (f_list_r[n])*(np.sin(t))+x0_array[n]
circle_y = (f_list_r[n])*(np.cos(t))+y0_array[n]
start_angle += 0.5*np.pi
end_angle += 0.5*np.pi
#畫圓弧形
plt.plot(circle_x,circle_y,color='r')
#標題
plt.title('斐波那契數列螺旋線')
#圖片展示
plt.show()
4.3 圖3代碼
#導入模塊
from turtle import *
#輸入自定義數列的個數
amount=int(input("請輸入斐波那契數列的而個數,推薦15:"))
#數列產生
a1=0
a2=1
tem_he=0
shulie=[]
for i in range(1,amount):
#終端輸出數列的數值
print(a1,end=',')
tem_he=a1+a2
a1=a2
a2=tem_he
#數列添加數值
shulie.append(tem_he)
#turtle畫圖
for i in range(1,amount-1):
for n in range(4):
forward(shulie[i])
left(90)
#畫圓
circle(shulie[i],90)
#輸出數列數值
write(shulie[i],font=("微軟雅黑",i*2))
mainloop()
4.4 圖4代碼
# encoding:utf-8
#參考文章
#https://blog.csdn.net/jiyeguhong/article/details/108020193?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-2&spm=1001.2101.3001.4242
import turtle
from random import random
def draw_square(r):
t.fillcolor(random(), random(), random())
t.begin_fill()
for _ in range(4):
t.fd(r)
t.left(90)
# 填充關鍵點,正方形填充一半就結束,然後立即開始圓形填充
if _ == 1:
t.end_fill()
t.fillcolor(random(), random(), random())
t.begin_fill()
t.circle(r, 90)
t.end_fill()
return
if __name__ == '__main__':
t = turtle.Turtle()
t.hideturtle()
t.up()
t.goto(-130, 50)
t.down()
t.pensize(3)
# 黃金比例
scale = 0.618
# 初始半徑
r = 50
for _ in range(5):
draw_square(r)
r /= scale
turtle.mainloop()
4.5 圖5
#參看文章:https://blog.csdn.net/cd_don/article/details/87212314
#導出模塊
import numpy as np
#其實就是matplotlib模塊
import pylab as plt
# 產生菲波那切數列
def fibo(n):
f_0 = 0
f_1 = 1
fibo_list = np.array([f_0,f_1])
for i in np.arange(n-2):
fibo_num = f_0 + f_1
fibo_list = np.append(fibo_list,fibo_num)
f_0, f_1 = f_1, fibo_num
return fibo_list
#找出各個圓心
def find_o_xy(f_list):
x_n, y_n = 0, 0 #起始圓心座標
o_x_array, o_y_array = np.array([x_n]), np.array([y_n])
for n in np.arange(1,len(f_list)):
#需要注意pyhton中數組計數是從0開始
#第一項作為起始點已經給出
y_n=y_n+np.mod(n+1,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)
x_n=x_n+np.mod(n,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)
o_x_array = np.append(o_x_array, x_n)
o_y_array = np.append(o_y_array, y_n)
return o_x_array, o_y_array
count = 6 #為7是需要調整figsize=(10,10)大小
f_list = fibo(count)
x0_array,y0_array = find_o_xy(f_list)
#------------------------頭像4----------------------------
f_list_r = fibo(count+2)[2::]
start_angle, end_angle = np.pi, 1.5*np.pi
fig = plt.figure(num=1,facecolor='k',figsize=(10,10))
#增加座標軸對象,顯示box
ax = fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=True,aspect=1)
x_min, x_max, y_min, y_max = 0, 0, 0, 0
for n in np.arange(len(f_list_r)):
#圓心座標
x0 = x0_array[n]
y0 = y0_array[n]
#得到對角頂點座標
x2 = x0+f_list_r[n]*(-1)**((np.mod(n+1,2)+n+1)/2)
if n == 0:
y2 = -1 #起始點特殊目前只想到這麼整了
else:
y2 = y0+f_list_r[n]*(-1)**(1+(np.mod(n,2)+n)/2)
#畫出圓弧
t=np.arange(start_angle,end_angle,0.001)
circle_x = (f_list_r[n])*(np.sin(t))+x0_array[n]
circle_y = (f_list_r[n])*(np.cos(t))+y0_array[n]
start_angle += 0.5*np.pi
end_angle += 0.5*np.pi
#畫圖,在座標軸上畫圖
ax.plot(np.append(x0_array[n],np.append(circle_x,x0_array[n])),
np.append(y0_array[n],np.append(circle_y,y0_array[n])),
color='k',linewidth=5)
ax.fill(np.append(circle_x,x0_array[n]),
np.append(circle_y,y0_array[n]),
facecolor='gold',alpha = 1)#f5bf03
#設置axes內的填充顏色
ax.patch.set_facecolor('k')
#調節座標範圍
x_min,x_max=8.5,-11.5
y_min,y_max=10,-10
mul_times = 1.5
ax.set_xlim(x_min*mul_times, x_max*mul_times)
ax.set_ylim(y_min*mul_times, y_max*mul_times)
#不顯示座標軸刻度以及刻度線
ax.tick_params(axis='both',labelsize=0,length=0)
#圖片展示
plt.show()
5 大自然
閱讀更多 易三一世 的文章