0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

大人向け。円に内接四角形から直径「高校入試チャレンジ問題 直径ACを求めよ」様を、sympy で計算と作図。

0
Last updated at Posted at 2026-10-18

・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 ソースコード表示省略)

image.png

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の回答は必ずしも正しいとは限りません。
 重要な情報は確認するようにしてください。
でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?