Python计算世界名画中的黄金分割率,你听过吗?快来看看
上次关于计算的章节是关于大名鼎鼎的π的
(你看了吗?去看看:π的计算)
π的计算是不是很复杂?[可爱]
今天,给大家讲一个简单一点的——黄金分割率
听这个名字就挺霸气的,“黄金”?难免太夸张了吧……[吃瓜群众]
还听说过,开普勒把它称为神圣分割率
这……[黑线]
但,这东西在艺术界十分出名:
世界名画《蒙娜丽莎》大家都知道吧,黄金分割率就存在与这幅画中。
蒙娜丽莎头顶到脖子下方的距离:眼底到肚脐的距离=0.618…… : 1
这就是黄金分割率,黄金分割率是一个无理数,约等于0.618
古希腊人认为,头顶到脖子下方的距离:眼底到肚脐的距离=0.618…… : 1
是一个形态完美的人
巨匠米开朗基罗的作品断臂维纳斯中也有黄金分割率:
这就是为什么《蒙娜丽莎》、断臂维纳斯看起来那么协调了。
那,我们来计算一下这个值吧[憨笑][吃瓜群众][思考]
计算这个值有2种办法:
1、斐波那契数列的商
人们发现,斐波那契数列第n项/第n+1,n越大,越接近黄金分割率。
斐波那契数列,第1项为0,第2项为1,第n项为第(n-1)项+第(n-2)项 (n>2)
求解斐波那契数列并不难,我们先定义求解斐波那契数列第n项为几的函数:
def fib(n):
if n==1:
return 0
elif n==2:
return 1
else:
return fib(n-1)+fib(n-2)
递归的思想
实现斐波那契数列,并存在列表里。
def fib(n):
if n==1:
return 0
elif n==2:
return 1
else:
return fib(n-1)+fib(n-2)
fiblst=[]
n=15
for i in range(1,16):
fiblst.append(fib(i))
n为列表长度,n越大黄金分割率越精确
计算黄金分割率
def fib(n):
if n==1:
return 0
elif n==2:
return 1
else:
return fib(n-1)+fib(n-2)
fiblst=[]
n=15
for i in range(1,16):
fiblst.append(fib(i))
gold=0
for i in range(len(lst)-1):
gold=lst[i+1]/lst[i]
print(gold)
大功告成![惊呆][跪了]
黄金分割率:0.6180371352785146
增加n,加上decimal库取精准值
(不知道decimal库?学一学:decimal库)
def fib(n):
if n==1:
return 0
elif n==2:
return 1
else:
return fib(n-1)+fib(n-2)
n=25
lst=[]
for i in range(1,n+1):
lst.append(fib(i))
gold=0
for i in range(len(lst)-1):
gold=lst[i]/lst[i+1]
gold=decimal.Decimal(gold)
decimal.getcontext()
print(gold)
精准的黄金分割率:0.61803398895790195854971216249396093189716339111328125
如果你觉得这个方法有点复杂,那么选择下一种就对了!
2、无限嵌套根号
这就是无限嵌套的根号,是不是很奇妙?[惊呆]
要实现这个很简单:
根号就是math库的sqrt(n)函数
嵌套用循环可以实现
代码:
gold=0
n=25
for i in range(n):
gold=sqrt(1+gold)
gold-=1
gold=decimal.Decimal(gold)
decimal.getcontext()
print(gold)
黄金分割率:0.618033988749504548110280666151084005832672119140625
关于黄金分割率的计算,就给大家讲到这里[小鼓掌]
大家还知道什么关于黄金分割率的知识吗?欢迎留言!