(その1/2) 本ページ
(その2/2) 私の感想 と FreeCADのマクロで作図
・(その1/2)は長文です。(その2/2)私の感想 だけでも見てもらうと助かります。
・SymPy の「実数判定が三値論理(さんちろんり/Three-valued logic)になっている」は、 本ページの後半です。
・SymPy の arctan が多価関数??? も出ていました。(再現なし)
オリジナル
Youtube
YUUU0123 様 (0:00〜5:59) いつもお世話になっております。
↓数学チャレンジ問題 △AGFの面積を求めよ
https://youtu.be/ql0HlpL806s
sympyで(Youtbeオリジナル 様の方法を参考に)
ver0.1
・丸写しです。
・>線対称にパタンと...
・私は、図形の証明を省略しています。二等辺三角形 BP=BA
# ver0.1
from sympy import *
var('PB,x',positive=True)
var('AB' ,positive=True)
BD,EM=9,12
PB=solve(Eq(PB ,EM+x-BD ) ,PB)[0] #;print(PB)
x =solve(Eq(AB**2,x**2+BD**2).subs({AB:PB}),x )[0] #;print(x)
print("#",x*(x/2)/2)
# 36
ver1.1
・WolframAlphaで(Youtube の私のコメントより)
・wolframalpha を sympy に書き換えた。
# ver1.1
from sympy import *
var('x',positive=True)
BD,EC=9,12
x =solve(Eq(x/BD,(2*x/(EC+x)) /(1-(x/(EC+x))**2)),x)[0]
print("#",x*(x-EC*EC/(EC+x))/2)
# 36
ver1.2
・Youtube のコメント様より。
# ver1.2
from sympy import *
var('x',positive=True)
BD,EM=9,12
x =solve(Eq(x/BD,(2*x/(EM+x)) /(1-(x/(EM+x))**2)),x)[0]
print("#",x*(x-x*12/(12+x))/2)
# 36
ver1.3
・TR12(sympyのtanの2倍角の公式)で、できませんでした。
# ver1.3
from sympy import *
from sympy.simplify.fu import TR12
var('θ,x')
# tan2θ=2tanθ/(1-tan²θ)=x/9
# tanθ=x/(12+x)
sol=solve([Eq(TR12(tan(2*θ)),x/9 ), \
Eq( tan( θ ),x/(12+x))], \
[θ,x])
print(sol)
# [(0, 0), (pi, 0), (I*(log(5)/2 - log(-2 - I)), 12*tan(I*(log(5) - 2*log(-2 - I))/2)/(1 - tan(I*(log(5) - 2*log(-2 - I))/2))), (I*(log(5)/2 - log(2 + I)), 12*tan(I*(log(5) - 2*log(2 + I))/2)/(1 - tan(I*(log(5) - 2*log(2 + I))/2)))]
ver1.4
・Youtube のコメント様より。
# ver1.4
# tan2θ=2tanθ/(1-tan²θ)=x/9
# tanθ=x/(12+x)
from sympy import *
from sympy.simplify.fu import TR12
var('θ,x')
var('a,b,tanθ')
BD,EM=9,12
rep={tan(θ):tanθ}
x =solve([Eq(TR12(tan(a+b)).subs({a:θ,b:θ}).subs(rep),x/BD ), \
Eq( tan( θ ) .subs(rep),x/(EM+x))], \
[tanθ,x])[1][1]
print("#",x*(x/2)/2)
# 36
ver1.5
・Youtube のコメント様より。ver1.4と同じです。
・sympy の TR12:tan の2倍角 の公式に代入です。
# ver1.5
from sympy import *
from sympy.simplify.fu import TR12
var('a,b')
var('x,θ',positive=True)
BD,EC=9,12
rep={tan(2*θ):x/BD,tan(θ):x/(x+EC)}
x =solve(Eq(tan(2*θ),TR12(tan(a+b)).subs({a:θ,b:θ})).subs(rep),x)[0]
print("#",x*(x-x*12/(x+12))/2)
# 36
ChatGPT先生へ。
ver2.1
x=12 を出力して下さい。
from sympy import *
var('x,θ')
BD,EC=9,12
sol =solve([Eq(tan(2*θ),x/ BD ) , \
Eq(tan( θ),x/(x+EC))], \
[x,θ] ) ;print(sol)
# [(0, 0), (0, pi), (12*tan(I*(log(5) - 2*log(-2 - I))/2)/(1 - tan(I*(log(5) - 2*log(-2 - I))/2)), I*(log(5)/2 - log(-2 - I))), (12*tan(I*(log(5) - 2*log(2 + I))/2)/(1 - tan(I*(log(5) - 2*log(2 + I))/2)), I*(log(5)/2 - log(2 + I)))]
今のコードは 厳密解(複素対数を含む形)をそのまま出している ため,
見た目がややこしくなっていますが,
実数解として意味のある解は x = 12 です。
ポイントを順に整理します。
...
原因は SymPy の「実数判定が三値論理になっている」ことです。
結論から言うと、
x = 12 であることは数学的に正しいが,SymPy はそれを
「実数だ」と証明できなかった
これが 解 x の値: [] になった 本当の原因です。
三値論理 は何ですか
三値論理(さんちろんり/Three-valued logic)とは,...(本ページ後半でwikipediaへリンク)
ver2.2
x=12 を出力して下さい。solveset を使って下さい。
from sympy import *
var('x,θ')
BD,EC=9,12
sol =solve([Eq(tan(2*θ),x/ BD ) , \
Eq(tan( θ),x/(x+EC))], \
[x,θ] ) ;print(sol)
# [(0, 0), (0, pi), (12*tan(I*(log(5) - 2*log(-2 - I))/2)/(1 - tan(I*(log(5) - 2*log(-2 - I))/2)), I*(log(5)/2 - log(-2 - I))), (12*tan(I*(log(5) - 2*log(2 + I))/2)/(1 - tan(I*(log(5) - 2*log(2 + I))/2)), I*(log(5)/2 - log(2 + I)))]
・代数方程式に変換します。
from sympy import *
x, t = symbols('x t', real=True)
BD, EC = 9, 12
# t = tan(θ)
eq1 = 2*t/(1 - t**2) - x/BD
eq2 = t - x/(x + EC)
# t を消去(eq2 → t を代入)
eqx = simplify(eq1.subs(t, x/(x+EC)))
# solveset で x を解く
solx = solveset(eqx, x, domain=S.Reals)
print(solx)
・出力
{0, 12}
??? あきらめて Gemini先生へ。
ChatGPT先生へ。
ver3.1
方法①:x だけを消去して解く(最も安全・推奨)
# ver3.1
from sympy import *
x = symbols('x', real=True)
BD, EC = 9, 12
t = x/(x+EC) # tanθ
eq = Eq(2*t/(1-t**2), x/BD)
solx = solve(eq, x)
print(solx)
[0, 12]
まとめ
[] は コードミスではない
θ を消去して x のみで解くのが最強
正解は常に
✅ x = 12
原因を教えて
ご提示いただいたSymPyのコードにおいて、期待した結果([12]など)が正しく表示されない、あるいはエラーが出る場合に考えられる主な原因は2つあります。
- 逆三角関数による解の不確定性(主な原因) ...
- $x=0$ や未定義な解の混入 ...
???
ver3.2
x=12 を出力して下さい。solveset を使って下さい。
from sympy import *
var('x,θ')
BD,EC=9,12
sol =solve([Eq(tan(2*θ),x/ BD ) , \
Eq(tan( θ),x/(x+EC))], \
[x,θ] ) ;print(sol)
# [(0, 0), (0, pi), (12*tan(I*(log(5) - 2*log(-2 - I))/2)/(1 - tan(I*(log(5) - 2*log(-2 - I))/2)), I*(log(5)/2 - log(-2 - I))), (12*tan(I*(log(5) - 2*log(2 + I))/2)/(1 - tan(I*(log(5) - 2*log(2 + I))/2)), I*(log(5)/2 - log(2 + I)))]
...倍角の公式の利用: solve や solveset にそのまま三角関数を渡すと、周期性や複素平面上の解を考慮してしまい、出力が複雑になりがちです。今回のように $x$ を求めたい場合は、$\tan(\theta)$ を $x$ の式で置き換えるのが近道です。
from sympy import *
# 変数と定数の定義
x = symbols('x', real=True, positive=True)
theta = symbols('θ', real=True)
BD, EC = 9, 12
# tan(2θ) の公式: tan(2θ) = 2*tan(θ) / (1 - tan(θ)**2)
# 第2式から tan(θ) = x / (x + 12) を代入する
tan_theta = x / (x + EC)
lhs = (2 * tan_theta) / (1 - tan_theta**2) # tan(2θ) の展開
rhs = x / BD # 第1式の右辺
# solveset で x について解く
equation = Eq(lhs, rhs)
sol = solveset(equation, x, domain=S.Reals)
print(f"解の集合: {sol}")
# 実際の値を取り出す
final_x = [val for val in sol if val > 0]
print(f"x = {final_x[0]}")
解の集合: {0, 12}
x = 12
いつもの? sympyの実行環境と 参考のおすすめです。
sympyのweb上での実行方法
SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7
いつもと違うおすすめです。
wikipedia