・(本日の)ChatGPT先生が、いつもと違ってステキです。
もしかしたら、新任の先生かも。
私はついていけません。
(以下抜粋)
方程式の導出(参考)
【もし希望があれば】
k を動かせるアニメーション版
任意の A, B, k を入力してすぐ描画する関数化
円の中心・半径を直接計算する版
必要なら、このアニメーションを GIF や MP4 として保存するコードも付けられます。
🚀 もし発展させたいなら
…
GPT-4o. の Free プランの制限に達しました。
(本日の)ChatGPT先生へ
質問リスト
・質問リストの追番は無視して下さい。1個ずつです。途中の回答表示は省略しています。
# 質問リスト
1. アポロニウスの円を教えて下さい。
2. 上記をsympyのソースコードで教えて下さい。
3. k を動かせるアニメーション版で
4. 追加で、複素数平面をsympyのソースコードで教えて下さい。
5. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。
6. 上記に追番を付けて下さい。
7. 回答リスト形式もお願いします。
8. 質問+回答セットの一覧 (Q&A形式) もお願いします。
9. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。追番も追加して。
10. 全部お願いします。このコメントも含めて下さい。
...では Matplotlib の FuncAnimation を使って、k を動かしながらアポロニウスの円がどう変化するか見えるアニメーション版を作ります。
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 設定: 点 A, B
A = np.array([0, 0])
B = np.array([4, 0])
# 円の中心・半径を計算する関数
def apollonius_circle(A, B, k):
a, b = A, B
d = np.linalg.norm(a - b)
center = (k**2 * b - a) / (k**2 - 1)
radius = (k * d) / abs(k**2 - 1)
return center, radius
# 描画準備
fig, ax = plt.subplots()
circle_artist = plt.Circle((0, 0), 1, fill=False, color='blue')
ax.add_artist(circle_artist)
ax.plot(A[0], A[1], 'ro', label='A')
ax.plot(B[0], B[1], 'go', label='B')
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_aspect('equal')
ax.legend()
title = ax.set_title('k = 1')
# アニメーション更新関数
def update(frame):
k = 0.2 + frame * 0.05 # kを0.2から徐々に増やす
if abs(k - 1) < 0.1: # k ≈ 1 のときは飛ばす(円が無限大)
k += 0.1
try:
center, radius = apollonius_circle(A, B, k)
circle_artist.center = center
circle_artist.set_radius(radius)
title.set_text(f'Apollonius Circle (k = {k:.2f})')
except:
pass
return circle_artist, title
# アニメーション実行
ani = FuncAnimation(fig, update, frames=100, interval=100, blit=False)
plt.show()
...今度は 複素数平面 を使ったアポロニウスの円の定義と、SymPy を使ったソースコードをお伝えします。
import sympy as sp
import matplotlib.pyplot as plt
# シンボル定義
z = sp.symbols('z')
a = 0 + 0j # 点A (複素数)
b = 4 + 0j # 点B (複素数)
k = 2 # 距離比
# アポロニウスの条件式
eq = sp.Eq(sp.Abs((z - a) / (z - b)), k)
# z = x + iy として実数成分で展開
x, y = sp.symbols('x y', real=True)
z_sub = x + sp.I * y
eq_real = eq.subs(z, z_sub)
# 展開・簡単化
lhs = sp.simplify(sp.Abs((z_sub - a) / (z_sub - b)))
eq_final = sp.Eq(lhs, k)
# 確認
print("複素数平面でのアポロニウスの円の方程式:")
sp.pprint(eq_final)
# グラフ描画
sp.plot_implicit(eq_final, (x, -2, 6), (y, -4, 4))
plt.title(f"Apollonius Circle in Complex Plane (k={k})")
plt.show()
Gemini先生へ
copilot先生へ
いつもの? sympyの実行環境と 参考のおすすめです。
いつもと違うおすすめです。
wikipedia