スチュワートの定理「2023 慶応義塾大学医学部【1】(1)」をsympyでやってみたい。

パイソニスタの方へ
```python
#1つ教えて下さい。よろしくお願いします。
#辞書型を、一括で操作する方法を教えて下さい。(例.値の2倍です。今回.subsです。)
#以下参照　解法3です。
print("#",[val.subs({m:4,n:3} ) for val in list(ans.values())]  )

#(2023/09/08 追加)
#方法
#？？？辞書型→リスト-->操作→辞書型？？？　リストから辞書に戻す方法になりますか？
#？？？{s: n/(m + n), t: m/(m + n), u: n/m}-->
#？？？{s: 3/7      , t: 4/7      , u: 3/4}

# 途中からです。リストまでです。
print("#",ans)
print("#",[   val.subs({m:4,n:3} ) for val in list(ans.values())] )
print("#",[ans[i].subs({m:4, n:3}) for i   in ans.keys()        ] )
# {s: n/(m + n), t: m/(m + n), u: n/m}
# [3/7, 4/7, 3/4]
```

# 会話　
「君は、中学で習う、中線定理（ちゅうせんていり、英: parallelogram law）も
　理解していないのに大丈夫か？本当にできるのか?」
「sympyで」私

# オリジナル
(youtube 15:27) math karat 様より

https://youtu.be/fsgyDoF2Cxo

上と同じです。大学入試数学問題集成 様＞テキスト【1】(1)

https://mathexamtest.web.fc2.com/2023/202313338/2023133380800mj.html

# 参考
wikipedia

https://qiita.com/mrrclb48z/items/13289ae1dffc5a33e926


# sympyで(解法1-A)三角比
＞・解法1のｋを使う方法。
コメント欄で、Juliaで教えてもらいました。ありがとうございました。

# sympyで(解法1-B)三角比
・解法1のｋを使っていません。
・係数の決定方法は、2通り？
　①s,t,uの連立方程式
　②Polyのnth [(DOCへリンク)](https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polytools.Poly.nth)
　以下は,Polyのnthで実行しました。
・ADの係数を1にするため、一生懸命です。**いい方法がありますか？**
・m,nの値の4:3を、最初に代入してもよかったです。sympyらしく?最後に代入しています。
```python
from sympy import *
var('θ,AB,AC,AD,BD,DC',real=True,positive=True)
var('m,n'             ,real=True)
eq_ABD=Eq(AB**2,BD**2+AD**2-2*BD*AD*cos(θ)   )
eq_ACD=Eq(AC**2,DC**2+AD**2-2*DC*AD*cos(pi-θ))
eq_Hi =Eq(BD   ,m/n*DC                       )
# 
eq=eq_ACD.subs({θ:  solve(eq_ABD,θ)[0].subs({eq_Hi.lhs:eq_Hi.rhs})  })
eq=Eq(eq.lhs+AB**2*n/m, (eq.rhs).expand()+AB**2*n/m )
kAD=Poly(eq.rhs,AD).nth(2)
eq=Eq((eq.lhs/kAD).expand(),((eq.rhs/kAD).expand()).factor().expand() )
# 
print("#",eq)
print("#",Poly(eq.lhs,AB).nth(2),",",
          Poly(eq.lhs,AC).nth(2),",",
          Poly(eq.rhs,DC).nth(2))
mySubs={m:4,n:3}
print("#",Poly(eq.lhs,AB).nth(2).subs(mySubs),",",
          Poly(eq.lhs,AC).nth(2).subs(mySubs),",",
          Poly(eq.rhs,DC).nth(2).subs(mySubs))
# Eq(AB**2*n/(m + n) + AC**2*m/(m + n), AD**2 + DC**2*m/n)
# n/(m + n) , m/(m + n) , m/n
# 3/7 , 4/7 , 4/3
```
# sympyで(解法2)ベクトル
・勉強中。sympyのベクトルが苦手なため。

# sympyで(解法3)図形と方程式
・いつものお楽しみの?FreeCADの作図は、今回省略です。
・A=Point(a,b)で十分です。私は。最近mapを覚えました。[(DOCへリンク)](https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.angles)
・ans[s].subs({m:4,n:3}で十分です。[(DOCへリンク)](https://docs.sympy.org/latest/tutorials/intro-tutorial/basic_operations.html#substitution)
**・辞書型を、一括で操作する方法を教えて下さい。(例.値の2倍です。今回.subsです。)**
```python
from sympy import *
var('a'    ,real=True)
var('b'    ,real=True,positive=True)
var('m,n'  ,real=True,nonnegative=True)
var('s,t,u',real=True)
A,B,C,D=map(Point,[(a,b),(-m,0),(n,0),(0,0)])
pol=Poly (((s*A.distance(B)**2+t*A.distance(C)**2)
            -(A.distance(D)**2+u*B.distance(D)**2)).expand(),a,b)
ans=solve( [Eq(pol.nth(2,0),0),Eq(pol.nth(1,0),0),
            Eq(pol.nth(0,2),0),Eq(pol.nth(0,1),0),
            Eq(pol.nth(0,0),0) ],[s,t,u])
# 
print("#",ans)
print("#",[val.subs({m:4,n:3} ) for val in list(ans.values())]  )
# {s: n/(m + n), t: m/(m + n), u: n/m}
# [3/7, 4/7, 3/4]
```

# sympyで(追加解法:解法４) Stewart's theoremで
・スチュワートの定理の公式に代入して、式の変形です。
```python
from sympy import *
var('AB,AC,AD,BD',real=True,positive=True   )
var('m,n'        ,real=True,nonnegative=True)
var('a,b,c,d'    ,real=True,positive=True   )
eq_ST=Eq(b**2*m+c**2*n,(d**2+m*n)*(m+n))
# 
mySubs={b:AB,c:AC,d:AD,m:BD,n:BD*n/m}
eq =eq_ST.subs(mySubs)
eq =Eq(eq.lhs.expand(),eq.rhs.expand())
kAD=Poly(eq.rhs,AD).nth(2)
eq =Eq((eq.lhs/kAD).expand(),(eq.rhs/kAD).expand())
# 
mySubs={m:4,n:3}
eq =Eq((eq.lhs.subs(mySubs)).expand(),(eq.rhs.subs(mySubs)).expand()  )
print("#",eq)
# Eq(4*AB**2/7 + 3*AC**2/7, AD**2 + 3*BD**2/4)
```



# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考

以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E