・ver3.1の計算がラクだと思います。
他もラクに考えていたら、作成に時間がかかりました。
・ver1.1 が動かないと Gemini先生に言ったら、ver2.1 とver2.2 を出されました。
オリジナル
YUUU0123 様 (0:00〜2:58) いつもお世話になっております。
↓高校入試チャレンジ問題 直径ACを求めよ
https://youtu.be/FHUrZyVW65Q
いつものsympyで(オリジナル Youtbe様の方法を参考に)
ver0.1
・先生の丸写しです。相似 ステキです。ソースコード内で、図形の証明は省略です。
・補助線2本でした。線分DP,CPです。
# ver0.1
from sympy import *
var('AC',real=True,positive=True)
BC,CD,degA=6,3,60
BP=BC*2
AB=BP/sqrt(3) #;print(AB)
AC=sqrt(AB**2+BC**2) #;print(AC)
print("#",AC)
# 2*sqrt(21)
ver1.2
・三角関数で連立方程式を考えましたが、
つぎのバージョンを見てあきらめました。
sympyで
ver1.1
・できませんでした。
・3つの円(既存1個+新規2個) が見えました。デキルハズ?
# # ver1.1
# from sympy import *
# var('r',real=True,positive=True)
# BC,CD,degA=6,3,60
# O,A,C=map(Point,[(0,0),(-r,0),(r,0)])
# D =Circle(O,r).intersection(Circle(C,CD))[1]
# B =Circle(O,r).intersection(Circle(C,BC))[0]
# sol =solve(Eq( Line(A,C).angle_between(Line(A,D)) \
# +Line(A,B).angle_between(Line(A,C)), \
# rad(degA)),r) ;print(sol)
ver2.1
(ver1.1を) solve が解けるようにするにはどうしたら。
SymPy の solve で動かない主な理由は、angle_between や intersection などの図形オブジェクト(Geometry モジュール)の抽象的な計算式が solve が扱える代数方程式の形(多項式や代数的な式)に自動で整理されないため です。
特に angle_betweenは逆三角関数($\arccos$ など)を含み 、さらに intersection は記号的な $r$ を含んだまま解こうとすると非常に複雑な表現になるため、SymPy の solve は代数的に解を見つけることができません。解決策(推奨):代数方程式に定式化し直す図形モジュールの関数を使う代わりに、余弦定理やベクトルの内積・外積を利用して代数的な方程式に落とし込む のが SymPy では最も確実です。...
・nsolve,nsimplify でした。r半径です。
実数で求めて(nsolve),実数を大体の?無理数(nsimplify)です。
# ver2.1
from sympy import *
var('r', real=True, positive=True)
BC, CD, degA = 6, 3, 60
O, A, C = map(Point, [(0, 0), (-r, 0), (r, 0)])
D = Circle(O, r).intersection(Circle(C, CD))[1]
B = Circle(O, r).intersection(Circle(C, BC))[0]
# 方程式の定義
f = Line(A, C).angle_between(Line(A, D)) + Line(A, B).angle_between(Line(A, C)) - rad(degA)
# 1. 数値解を求める
numerical_sol = nsolve(f, r, 5.0)
# 2. nsimplify で数式(分数やルートなど)に変換する
exact_like_sol = nsimplify(numerical_sol)
print("数値解:", numerical_sol)
print("nsimplify による変換:", exact_like_sol)
計算結果
数値解: 4.58257569495584
nsimplify による変換: sqrt(21)
ver2.2
・???
# ver2.2
from sympy import *
# 変数の定義
r = symbols('r', real=True, positive=True)
# 円周角の定理と直角三角形の辺の関係から、
# 角DACの余弦 cos(alpha) と、角CABの余弦 cos(beta) を定義する
# 直角三角形ADC において AD = sqrt(4*r**2 - 9)
# 直角三角形ABC において AB = sqrt(4*r**2 - 36)
cos_alpha = sqrt(4*r**2 - 9) / (2*r)
cos_beta = sqrt(4*r**2 - 36) / (2*r)
sin_alpha = 3 / (2*r)
sin_beta = 6 / (2*r)
# 2つの角の和が 60° (pi/3) であるという条件
# cos(alpha + beta) = cos(alpha)cos(beta) - sin(alpha)sin(beta) = cos(pi/3) (= 1/2)
eq = Eq(cos_alpha * cos_beta - sin_alpha * sin_beta, 1/2)
# ルートを消すために、根号部分を移行して両辺を二乗できる形に整えるか、
# 式を代数的に簡約化して solve に渡す
# ここではルートを孤立させて二乗する方程式に変換する
# sqrt((4*r**2 - 9)*(4*r**2 - 36)) / (4*r**2) - 18 / (4*r**2) = 1/2
# 両辺に 4*r**2 をかけると: sqrt(...) - 18 = 2*r**2
# 移行して: sqrt(...) = 2*r**2 + 18
eq_poly = Eq(sqrt((4*r**2 - 9)*(4*r**2 - 36)), 2*r**2 + 18)
# 両辺を二乗した多項式方程式を解く(これによりSymPyが一瞬で計算を完了します)
sol = solve(Eq((4*r**2 - 9)*(4*r**2 - 36), (2*r**2 + 18)**2), r)
# 正の解のみをフィルタリング
valid_sol = [s for s in sol if s.is_real and s > 0]
print(valid_sol)
[sqrt(21)]
ver3.1
・(再)ver3.1の計算がラクだと思います。 ソースコード完全版は省略です。
・Cyclic quadrilateral theorem の証明省略です。
①次行を、(本日の)Gemini先生、ChatGPT先生に貼り付けると、英語がでます。
2*Triangle(sas=(3,180-60,6).circumradius
②次行を、貼り付けると、日本語の解説がでます。sympy と判断?されています。
2*Triangle(sas=(3,180-60,6).circumradius 日本語で
③次行を、(本日の)Gemini先生、ChatGPT先生に貼り付けると、... 。
∞種類の解法だそうです。
2*Triangle(sas=(3,180-60,6).circumradius 100通りの解法の見出しのみを出力して。1〜100 の追番で。
④後は、n番目を詳しく。作図して。(symyのソースコード、計算結果を背景黒で)
Gemini先生、ChatGPT先生への質問は、いくらでも?(ソレデモタイヘンカモ)
Gemini先生へ。作図。
ver2.1
・(再)nsolve,nsimplify でした。r半径です。
以下の、PNG図のみ出力して下さい。
(ver2.1 ソースコード表示省略)
ver3.1
・無理でした。コレガネ。
(私の)情報不足で、Gemini先生、ChatGPT先生でできませんでした
以下の、PNG図のみ出力して下さい。
2*Triangle(sas=(3,180-60,6).circumradius
いつもの? sympyの実行環境 と 参考のおすすめです。
sympyのweb上での実行方法
SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
いつもと違うおすすめです。
wikipedia で
・(Gemini先生より)この定理は、一般に「内接四角形の定理」(または、四角形が円に内接するための共円条件)と呼ばれています。
(Gemini先生より翻訳)
Cyclic quadrilateral theorem
円に内接する四角形
...凸四角形 □ABCD が内接四角形となるための必要十分条件は、その向かい合う角が互いに補角となることである。...
sympy のdoc
ver0.1
ver1.1
ver2.1
・sympy.simplify.simplify.nsimplify(
expr,
constants=(),
tolerance=None,
full=False,
rational=None,
rational_conversion='base10',
)
https://docs.sympy.org/latest/modules/simplify/simplify.html#sympy.simplify.simplify.nsimplify
ver2.2
ver3.1
・class sympy.geometry.polygon.Triangle(*args, **kwargs)
keyword: asa, sas, or sss to specify sides/angles of the triangle
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle
・property circumradius < Circle
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.RegularPolygon.circumradius
後記
>GeminiはAIであり、不正確な情報を表示することがあります
>ChatGPTの回答は必ずしも正しいとは限りません。
重要な情報は確認するようにしてください。
でした。
