オリジナル
b=sqrt(2),c=2,a=2
解答の方針
sympyを勉強すると、内積、外心、外接円、余弦定理、ベクトルが同じ?だんだん区別がつかなくなりました。
ニワトリが先か、タマゴが先か状態です。
小問が4つで、それぞれ解法4通り?(T氏様の解答より)さらに、sympyのモジュール4パターン(思い付くところで),
sympyの解き方だけで 全部で4×4×4=約64通り。無理ですね?
そこで、sympyのモジュール4パターンで、解きやすい解法にしました。
もっと短くなるようアドバイスをお願い致します。
(パターン1)sympyのベクトルモジュールで
T氏様の手順になるべく従っています。
(3)「外心から辺に垂線」
(4)2段階に分けた解答にしています。(参考と別解は使っていません。)
①点Aを原点にしました。
②iとjが消えました。
➂途中、iとjから、solveを使ってベクトルABとベクトルACの1次結合?に変換しました。
④値を最後に代入しました。subsの代入は、最初でも途中でもできるはずです。途中のチェックにも使えます。
from sympy import *
from sympy.vector import CoordSys3D
var('ABx ABy ACx ACy AOx AOy s t r k u v ')
N = CoordSys3D('N')
AB = ABx*N.i+ABy*N.j
AC = ACx*N.i+ACy*N.j
# (1)(2)
my_ABAC =(Rational(1,2)*(AB.magnitude()**2+AC.magnitude()**2-(AC-AB).magnitude()**2)).expand()
my_Area = Rational(1,2)*sqrt(AB.magnitude()**2*AC.magnitude()**2-my_ABAC**2)
# (3)
AO = AOx*N.i+AOy*N.j
my_oxoy =solve([AB.dot(AO-Rational(1,2)*AB),AC.dot(AO-Rational(1,2)*AC)],[AOx,AOy])
AO =my_oxoy[AOx]*N.i+my_oxoy[AOy]*N.j
ans=solve([(s*AB+t*AC-AO).components[N.i],(s*AB+t*AC-AO).components[N.j]],[s,t])
s,t=ans[s],ans[t]
# (4)
AQ = (1-r)*AB+r*AC
AQ =((1-r)*AB+r*AC).subs({r:solve(AQ.dot(AB-AC),r)[0]})
AP=k*AQ
AP=solve(AO.magnitude()**2-(AP-AO).magnitude()**2,k)[1]*AQ
ans=solve([(u*AB+v*AC-AP).components[N.i],(u*AB+v*AC-AP).components[N.j]],[u,v])
u,v=ans[u],ans[v]
# 解答
mySubs={ABx:sqrt(2),ABy:0,ACx:sqrt(2)/2,ACy:sqrt(2*2-(sqrt(2)/2)**2)}
print("#(1)",my_ABAC.subs(mySubs))
print("#(2)",my_Area.subs(mySubs))
print("#(3)",s.subs(mySubs),t.subs(mySubs))
print("#(4)",u.subs(mySubs),v.subs(mySubs))
#(1) 1
#(2) sqrt(7)/2
#(3) 2/7 3/7
#(4) 15/14 5/14
(パターン2)ijを使わない方法。
views数をふやすため、近日?公開予定です。
(パターン3)
(パターン4)sympyのgeometryで
こちらの方がイメージしやすいと思います。
①点Oを原点にしました。
②外接円の半径を先に計算して、二等辺三角形を配置し、各点の座標計算です。
➂後は垂線計算、交点計算です。
from sympy import *
var('a b c s t u v')
def herons(a, b, c):
s = (a+b+c) / 2
return sqrt(s*(s-a)*(s-b)*(s-c))
b,c,a=sqrt(2),2,2
myS=herons(a,b,c).simplify()
myR=(a*b*c/4/myS).simplify()
myO=Point( 0.0,0.0)
myA=Point(-b/2,-sqrt(myR**2-(b/2)**2))
myB=Point( b/2,-sqrt(myR**2-(b/2)**2))
myC=Point( 0.0,myR)
myst=solve([((myO-myA)-(s*(myB-myA)+t*(myC-myA))).x,
((myO-myA)-(s*(myB-myA)+t*(myC-myA))).y],[s,t])
myQ = Line(myB, myC).projection(myA)
myP = Circle(myO, myR).intersection(Line(myA, myQ))[1]
myuv = solve([((myP - myA) - (u * (myB - myA) + v * (myC - myA))).x,
((myP - myA) - (v * (myB - myA) + v * (myC - myA))).y], [u, v])
# 解答
print("#(1)",(myB-myA).dot(myC-myA))
print("#(2)",myS,Polygon(myA,myB,myC).area) # Polygonは、大きなお世話でした。
print("#(3)",myst[s],myst[t])
print("#(4)",myuv[u],myuv[v])
#(1) 1
#(2) sqrt(7)/2 sqrt(7)/2
#(3) 2/7 3/7
#(4) 15/14 5/14
参考