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?

大人用「数学チャレンジ問題 △AGFの面積を求めよ」(その1/2) 計算はsympyで。????三値論理(さんちろんり/Three-valued logic

Last updated at Posted at 2026-01-30

(その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つあります。

  1. 逆三角関数による解の不確定性(主な原因) ...
  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

ver0.1

ver1.1

ver1.2

ver1.3

ver1.4

ver1.5

ver2.1

ver2.2

ver3.1

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?