
人間の無茶振りに付き合うModel: Code Interpreterが可愛い
Model: Code Interpreterに向かって無茶振りしすぎてハングしまくっている今日この頃。無茶振りの一例をご紹介します。以下、Model: Code Interpreterの事を MCIと省略して呼びます。
雪の結晶描いて
筆者問:雪の結晶って数式で表せるんですか?
MCI返答:
雪の結晶の形状を完全に数式で表現するのは非常に難しいです。雪の結晶は気温や湿度などの環境条件によって形状が大きく変わるため、これら全ての要素を考慮に入れた数式を作るのは現実的ではありません。
しかし、フラクタル幾何学の一部であるKochの雪片(Koch snowflake)は、数学的な手法を使用して雪の結晶の一部の特徴を模倣することができます。Kochの雪片は、繰り返しのプロセス(反復法)によって生成され、それぞれのステップで形状がますます詳細になります。
Kochの雪片を生成するための基本的な手順は次のとおりです:
平面上に正三角形を描きます。
それぞれの辺を3つの等しい部分に分割します。
中央の部分を取り除き、その場所に別の正三角形(取り除いた部分の辺の長さと同じ)を追加します。
ステップ2と3を無限に繰り返します。
このプロセスを続けると、最終的な形状は雪の結晶のようなフラクタルパターンを示します。これは、雪の結晶の自己相似性(すなわち、全体が部分に似ているという特性)を表現しています。
Koch snowflakeの数式を投げたら描いてくれる?
Koch snowflakeという言葉を聞いたので早速数式をネットで探してきて投げてみました。
するとMCIは早速下記のようなpython実行。
import matplotlib.pyplot as plt
import numpy as np
# Function to draw a Koch snowflake
def koch_snowflake(order, scale=10):
# Initial triangle side length
length = scale / np.sqrt(3)
# Initial triangle height (distance from base to apex)
height = length * np.sqrt(3) / 2
# Initial start coordinates (bottom left)
start_x = -length / 2
start_y = -height / 2
def draw_koch_curve(order, angle=0, x=start_x, y=start_y, length=length):
if order == 0:
# Draw a straight line
end_x = x + length * np.cos(angle)
end_y = y + length * np.sin(angle)
plt.plot([x, end_x], [y, end_y], color='black')
return end_x, end_y
else:
# Draw a Koch curve of order - 1 with one third of the length
x, y = draw_koch_curve(order - 1, angle, x, y, length / 3)
# Turn left 60 degrees and draw a Koch curve of order - 1 with one third of the length
x, y = draw_koch_curve(order - 1, angle + np.pi / 3, x, y, length / 3)
# Turn right 120 degrees and draw a Koch curve of order - 1 with one third of the length
x, y = draw_koch_curve(order - 1, angle - np.pi / 3, x, y, length / 3)
# Turn left 60 degrees and draw a Koch curve of order - 1 with one third of the length
x, y = draw_koch_curve(order - 1, angle + np.pi / 3, x, y, length / 3)
return x, y
plt.figure(figsize=(8, 8))
# Draw three Koch curves to make a Koch snowflake
draw_koch_curve(order, 0)
draw_koch_curve(order, -2 * np.pi / 3)
draw_koch_curve(order, 2 * np.pi / 3)
plt.gca().set_aspect('equal')
plt.axis('off')
plt.show()
# Draw a Koch snowflake of order 4
koch_snowflake(4)
上記のコードを使ってこんな画像を描いてくれました。

六角形にならないの?
筆者問:これは六角形にならないのですか?
MCI返答:
Kochの雪片は、その名の通り雪片(snowflake)のような形状を生成しますが、基本的には三角形です。Kochの雪片を3つ合わせることで、ある程度「六角形」に近い形状を作ることは可能です。これは、各Kochの雪片が三角形であるため、それらを3つ合わせることで全体として六角形に近い形状を形成することができます。ただし、これは完全な正六角形ではありません。
Kochの雪片を使って六角形の雪の結晶体を具体的に作成する方法は明確にはないようです。ただし、Kochの雪片の自己相似性とフラクタル性質を利用して、ある種の六角形に近い形状やパターンを作成することは可能であると考えられます。
筆者無茶振り:ちょっとやってみてください。
Kochの曲線を6つ組み合わせて作成した六角形の形状
無茶振りに答えてこのような画像を書いてくれた。

さらに無茶振り
筆者問:フラクタルってどんどん細部に入っていく様な形ですよね。 上の形を基本にして細部にフラクタルを形成していけば雪の結晶に近くなりそうですが。
MCI返答:
はい、その通りです。フラクタルは、どんなに細かく見ても自己相似性があり、その細部が全体の形状を再現します。したがって、上記のような基本的な形状から始めて、各辺に再帰的にKochの曲線を適用することで、より詳細なフラクタル形状を生成することができます。これは、実際の雪の結晶が形成されるプロセスを模倣しています。雪の結晶は、気温や湿度などの環境条件に応じて結晶構造が微細に変化し、複雑な形状を生成します。
それでは、上記の形状に対してさらにフラクタルパターンを適用し、より詳細な形状を生成してみましょう。次に示すのは、Kochの雪片を3次まで反復して生成した形状です。
ってことで描いてくれたのがこちら。

さらに無茶振りしたらお断りされた
筆者問:上記の「Kochの曲線を3次まで反復適用した結果」はより雪の結晶に近づきました。さらに反復したら雪の結晶に近づく気がします。12次まで反復適用をお願いできますか?
MCI返答:すみませんが、12次まで反復適用すると描画の計算量が非常に大きくなるため、プロセスが非常に時間がかかる可能性があります。また、それだけの詳細レベルは描画の解像度が高くないと視覚的にはほとんど変化が認識できないかもしれません。
Kochの曲線を4次まで反復適用した結果
12次まで反復適用を断った上で「理解のために、反復の度合いを増やしてみて、それが結果にどのような影響を及ぼすかを見てみましょう。以下に、Kochの曲線を4次まで反復適用した結果を示します。それ以上の反復は時間がかかりすぎるため、ここでは省略します。」との返答。そしてできた画像がこちら。

pythonは下記の様なシンプルなものだった。
# Draw a fractal snowflake of order 4
fig, ax = plt.subplots(figsize=(8, 8))
# Draw six Koch curves to make a hexagonal structure
for i in range(6):
draw_koch_curve(4, i * np.pi / 3, 0, 0)
ax.set_aspect('equal')
ax.axis('off')
plt.show()
そこでMCIに尋ねてみました。
筆者問:あなたが最初に描いた「Kochの曲線を6つ組み合わせて作成した六角形の形状」のためのpythonコードよりも、上記の「Kochの曲線を4次まで反復適用した結果」のpythonコードの方がシンプルなのですが、最初のコードを関数として呼び出しているのですか?
関数を使ってよりシンプルなコードに
MCI返答:はい、その通りです。最初のコードでは、koch_snowflakeという関数を定義し、その中でdraw_koch_curveという別の関数を定義しています。そして、koch_snowflake関数の中でdraw_koch_curve関数を呼び出してKochの雪片を描画しています。
一方、2つ目のコードでは、draw_koch_curve関数を直接呼び出しています。そのため、koch_snowflake関数を定義する必要がなく、コードがよりシンプルになっています。
つまり、最初のコードではkoch_snowflake関数が全体の描画を制御しており、その中でdraw_koch_curve関数を呼び出して各辺を描画しています。一方、2つ目のコードではdraw_koch_curve関数を直接6回呼び出して6辺を描画しています。
なるほど。わかりみが深い。pythonの勉強になります。