Python计算世界名画中的黄金分割率,你听过吗?快来看看

liftword3周前 (12-15)技术文章20

上次关于计算的章节是关于大名鼎鼎的π的

(你看了吗?去看看:π的计算)

π的计算是不是很复杂?[可爱]

今天,给大家讲一个简单一点的——黄金分割率

听这个名字就挺霸气的,“黄金”?难免太夸张了吧……[吃瓜群众]

还听说过,开普勒把它称为神圣分割率

这……[黑线]

但,这东西在艺术界十分出名:

世界名画《蒙娜丽莎》大家都知道吧,黄金分割率就存在与这幅画中。

蒙娜丽莎头顶到脖子下方的距离:眼底到肚脐的距离=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

关于黄金分割率的计算,就给大家讲到这里[小鼓掌]

大家还知道什么关于黄金分割率的知识吗?欢迎留言!

相关文章

「Python算术运算符」计算一个数的平方数和平方根数

功能要求编写一个Python应用程序,从键盘上输入一个整数,计算这个数的平方数(2次方)和平方根数(0.5次方),并将结果在控制台打印输出。实现步骤1.创建一个Python文件,从键盘上读取一个整数,...

全网第一个讲清楚CPK如何计算的Step by stepExcel和Python同时实现

在网上搜索CPK的计算方法,几乎全是照搬教材的公式,在实际工作做作用不大,甚至误导人。比如这个又比如这个:CPK=min((X-LSL/3s),(USL-X/3s))还有这个,很规范的公式,也很清晰很...

Hilbert解调在振动信号处理中的应用

1、Hilbert解调原理我们知道信号解调是信号调制的反过程。解调就是从已调制的高频信号中解调出原始调制信号。信号调制包括调幅、调频、调相,因此信号解调的目的就是:根据已有信号,提取出信号中的包络、相...