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?

More than 1 year has passed since last update.

内積「静岡大学2022年後期MA・MB第3問」をsympy でやってみた

Last updated at Posted at 2022-06-10

オリジナル

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

参考

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?