はじめに
黄金比の定義や性質、黄金比を利用した図形やアルゴリズムについて、数式やプログラム、図を用いて理解を目指すシリーズです。
この記事では、黄金比の定義について、数式と図を使って解説します。
【前の内容】
【他の内容】
【今回の内容】
黄金比の計算式の導出
黄金比(golden ratio)の定義を数式とグラフで確認して、黄金数(golden number)の計算式を導出します。
黄金分割については「【R】黄金比の可視化 - からっぽのしょこ」を参照してください。
利用するライブラリを読み込みます。
# ライブラリを読込 import numpy as np import matplotlib.pyplot as plt
黄金数の計算式
まずは、黄金比率(黄金数)の計算式を導出します。
黄金比の定義をグラフで確認します。
作図コード(クリックで展開)
# 黄金比を計算 gr = 0.5 * (1.0 + np.sqrt(5.0)) # 線分の長さを指定 a = 1.0 b = a / gr # 線分の位置を設定 seg1, seg2 = 0.33, 0.66 seg_min, seg_max = 0.0, 1.0 # ラベル用の文字列を作成 fml_label = '$\\phi = \\frac{1 + \\sqrt{5}}{2} = 1.618..., ' fml_label += '(a+b) : a : b = \\phi : 1 : \\frac{1}{\\phi}$' # 黄金分割を作図 fig, ax = plt.subplots(figsize=(6, 5), dpi=100, facecolor='white', constrained_layout=True) ax.plot([0.0, a+b], [seg2, seg2], label=f'$a+b = {a+b:.3f}$') # 分割前 ax.plot([0.0, a], [seg1, seg1], label=f'$a = {a:.3f}$') # 分割後(長) ax.plot([a, a+b], [seg1, seg1], label=f'$b = {b:.3f}$') # 分割後(短) ax.text(x=0.5*(a+b), y=seg2, s='$a+b$', size=20, ha='center', va='bottom') # 分割前 ax.text(x=0.5*a, y=seg1, s='$a$', size=20, ha='center', va='bottom') # 分割後(長) ax.text(x=a+0.5*b, y=seg1, s='$b$', size=20, ha='center', va='bottom') # 分割後(短) ax.set_yticks(ticks=[seg1, seg2], labels='') ax.vlines(x=[0.0, a, a+b], ymin=seg_min, ymax=seg_max, color='black', linestyle='dotted') # 分割位置 ax.set_ylim(ymin=seg_min, ymax=seg_max) ax.grid() ax.legend() ax.set_title(fml_label, loc='left') fig.suptitle('golden ratio', fontsize=20) plt.show()
任意の線分(青色の実線)を二つの線分(オレンジ色と緑色の実線) に分割することを考えます。 は長さを表し、 の関係とします。元の線分の長さは で表わせます。
分かりやすいように、 のときのグラフを例にしています。長さに関わらず以降の関係は成り立ちます。
線分を2つに分割するとき、「分割前の長さ と分割後の長い方の長さ の比」と「分割後の長い方の長さ と短い方の長さ の比」が等しくなる分割比率を考えます。
比例式の性質より、前項の商と後項の商が等しいので、次の式が成り立ちます。この関係を満たす分割比を黄金比と言い、黄金比率 とおきます。
また、内項の積と外項の積が等しいので(または上の式の両辺に を掛けると)、次の式が成り立ちます。
両辺を短い方の長さ の2乗で割って、分割比率 に置き換えます。
について解き(二次方程式の解の公式に代入し)ます。
は長さ比なので正の値 より、次の式になります。
黄金比率 の計算式が得られました。 を黄金数とも呼びます。
黄金比率(黄金数) を用いると、分割前後のサイズは次の関係で表わせます。
黄金比による分割を黄金分割と呼びます。
黄金数の逆数の計算式
続いて、黄金比率(黄金数)の逆数の計算式を導出します。
黄金比の逆数の定義をグラフで確認します。
作図コード(クリックで展開)
# 黄金比の逆数を計算 recip_gr= 0.5 * (np.sqrt(5.0) - 1.0) # 線分の長さを指定 ab = 1.0 a = ab * recip_gr b = a * recip_gr # 線分の位置を設定 seg1, seg2 = 0.33, 0.66 seg_min, seg_max = 0.0, 1.0 # ラベル用の文字列を作成 fml_label = '$\\tilde{\\phi} = \\frac{\\sqrt{5} - 1}{2} = 0.618..., ' fml_label += '(a+b) : a : b = 1 : \\tilde{\\phi} : \\tilde{\\phi}^2$' # 黄金分割を作図 fig, ax = plt.subplots(figsize=(6, 5), dpi=100, facecolor='white', constrained_layout=True) ax.plot([0.0, a+b], [seg2, seg2], label=f'$a+b = {a+b:.3f}$') # 分割前 ax.plot([0.0, a], [seg1, seg1], label=f'$a = {a:.3f}$') # 分割後(長) ax.plot([a, a+b], [seg1, seg1], label=f'$b = {b:.3f}$') # 分割後(短) ax.text(x=0.5*(a+b), y=seg2, s='$a+b$', size=20, ha='center', va='bottom') # 分割前 ax.text(x=0.5*a, y=seg1, s='$a$', size=20, ha='center', va='bottom') # 分割後(長) ax.text(x=a+0.5*b, y=seg1, s='$b$', size=20, ha='center', va='bottom') # 分割後(短) ax.set_yticks(ticks=[seg1, seg2], labels='') ax.vlines(x=[0.0, a, a+b], ymin=seg_min, ymax=seg_max, color='black', linestyle='dotted') # 分割位置 ax.set_ylim(ymin=seg_min, ymax=seg_max) ax.grid() ax.legend() ax.set_title(fml_label, loc='left') fig.suptitle('golden ratio', fontsize=20) plt.show()
任意の線分(青色の実線)を二つの線分(オレンジ色と緑色の実線) に分割することを考えます。 は長さを表し、 の関係とします。元の線分の長さは で表わせます。
分かりやすいように、 のときのグラフを例にしています。長さに関わらず以降の関係は成り立ちます。
先ほどと同様に、分割前後の長さ比が等しくなる分割比率を考えます。
比例式の性質より、前項の商と後項の商が等しいので、次の式が成り立ちます。この比率を とおきます。
また、内項の積と外項の積が等しいので(または上の式の両辺に を掛けると)、次の式が成り立ちます。
両辺を長い方の長さ の2乗で割って、分割比率 に置き換えます。
について解き(二次方程式の解の公式に代入し)ます。
は長さ比なので正の値 より、次の式になります。
分割比率 の計算式が得られました。 は、黄金数 の逆数です。
は、黄金数の逆数 なので、次のようにも求められます。
の計算式が得られました。
この記事では、黄金数の定義と式を確認しました。次の記事では、黄金数の性質を確認します。
参考文献
おわりに
他の記事で黄金分割が登場したので、その解説のためにこの記事を書きました。けど黄金比の導出は前に書いた気がするんだよなぁ、それらしい記事が見当たらないなぁ、何かに詰まって書かなかったのかなぁ、とこの際に書いたのですが、やっぱり書いてました。
その記事もろとも黄金比シリーズを再構成しようかとも思ったのですが、以前に黄金比関連でいくつか書いた記事ではRを使っていたこともあり、これ以上脱線できないので今回は諦めました。くやしい。
黄金分割を行うなら逆数の方が直接的に関わる比率だから詳しく書いたのですが、ほとんど同じ展開の導出をわざわざ書いたのは、以前の記事ではやってなかった追加要素のためだったり、そんなこんなな気を紛らわせるためだったりもします。
2024年9月19日は、つばきファクトリーの八木栞さんの21歳のお誕生日です。
なんとも不思議な魅力を持つ方なので、とりあえず見てもらいたいです。パフォーマンスはこのMVを観てもらうとして、その次は八木メシクッキングで検索してみてほしいです。🐐
【次の内容】