python黄金分割数
1/ 黄金分割数
黄金分割数 golden_ratio
黄金比例,又称黄金分割,是一个数学常数,一般以希腊字母
ϕ
\phi
ϕ表示。
代数式定义:
ϕ = a + b a = 1 + b a = a b \phi=\frac{a+b}{a}=1+\frac{b}{a}=\frac{a}{b} ϕ=aa+b=1+ab=ba
1 ϕ = ϕ − 1 = Φ \frac{1}{\phi}=\phi -1=Φ ϕ1=ϕ−1=Φ
∴ 1 + b a = 1 + 1 ϕ = ϕ 1+\frac{b}{a}=1+\frac{1}{\phi}=\phi 1+ab=1+ϕ1=ϕ
∴ ϕ = = 1 + 5 2 ≈ 1.618 \phi==\frac{1+\sqrt5}{2}≈1.618 ϕ==21+5≈1.618 (负舍)
Φ ≈ 0.618 Φ≈0.618 Φ≈0.618
2/ 贵金属分割
贵金属分割连分数:
n
+
1
n
+
1
n
+
1
n
+
1
.
.
.
n+\frac{1}{n+\frac{1}{n+\frac{1}{n+\frac{1}{...}}}}
n+n+n+n+...1111
n=1 黄金分割
1
+
5
2
\frac{1+\sqrt5}{2}
21+5
n=2 白银分割
1
+
2
1+\sqrt2
1+2
n=3 青铜分割
3
+
1
3
2
\frac{3+\sqrt13}{2}
23+13
3/ 计算分割数
计算 ϕ \phi ϕ, ϕ = 1 + 5 2 \phi = \frac{1 + \sqrt{5}}{2} ϕ=21+5
import decimal
# 设置精度
decimal.getcontext().prec = 110 # 适当增加精度以确保计算准确
# 计算黄金分割数
sqrt_5 = decimal.Decimal(5).sqrt()
phi = (decimal.Decimal(1) + sqrt_5) / decimal.Decimal(2)
# 输出结果,精确到小数点后100位
print(f"{phi:.100f}")
# 1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
计算 Φ, Φ = 1 1 + Φ Φ = \frac{1}{1 + {Φ}} Φ=1+Φ1
fài = 1.0
for i in range(100):
fài = 1 / (1 + fài)
print("{:.3f}".format(fài)) # 0.618
print("{:.4f}".format(fài)) # 0.6180
print("{:.5f}".format(fài)) # 0.61803
print("{:.7f}".format(fài)) # 0.6180340
"""
def golden_ratio(depth):
fài = 1.0
for i in range(depth):
fài = 1 / (1 + fài)
return fài
depth = 100 # 设置迭代深度
print(f"Golden ratio (approximated to depth {depth}): {golden_ratio(depth)}")
# Golden ratio (approximated to depth 100): 0.6180339887498948
"""
精确到小数点后百位
import decimal
decimal.getcontext().prec = 110 # 适当增加精度以确保计算准确
phi = decimal.Decimal(1)
for _ in range(100):
phi = 1 / (1 + phi)
print(f"{phi:.100f}") # 输出结果,精确到小数点后100位
#0.6180339887498948482045868343656381177203096998094118264936291294152016354093729191617385189497190563
4/ 画黄金螺旋
r
=
a
e
b
θ
r = a e^{b \theta}
r=aebθ
在黄金螺旋中,比例常数 b ≈
ln
(
θ
)
90
\frac{\ln(\theta)}{90}
90ln(θ) ,
θ
\theta
θ 是黄金分割数(约为1.618)。
import numpy as np
import matplotlib.pyplot as plt
# 黄金分割数
phi = (1 + np.sqrt(5)) / 2
# 定义参数
a = 0.1 # 可以调整螺旋的起始半径
n_points = 1000 # 点的数量
theta = np.linspace(0, 4 * np.pi, n_points) # 角度
# 计算 r
r = a * np.exp(np.log(phi) * theta / (np.pi / 2))
# 转换到笛卡尔坐标
x = r * np.cos(theta)
y = r * np.sin(theta)
# 绘制图形
plt.figure(figsize=(8, 8))
plt.plot(x, y)
plt.title('Goldene Spirale')
plt.axis('equal')
plt.grid()
plt.show()