0
0

More than 1 year has passed since last update.

3点を通る円「ますいしいからの挑戦状(16)!!」をwolframAlphaとsympyでやってみた。

Last updated at Posted at 2022-09-15

sympyで7通りになりました。
3点A(8,5),B(1,-2),C(9,2)を通る円....

オリジナル

wolframAlphaで

作図が見れます。

sympyで(ますいしい様の手順で)

(勉強中)
“三元連立一次方程式”
“二元連立一次方程式”
“一元一次方程式”

sympyで(解4がいいですね。)

(解1)“円の方程式の一般形“

from sympy import *
var('x y a b c')
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
eq=x**2+y**2+a*x+b*y+c
ans=solve([eq.subs({x:A.x,y:A.y}),
           eq.subs({x:B.x,y:B.y}),
           eq.subs({x:C.x,y:C.y})
          ],[a,b,c])
print("#",       eq.subs({a:ans[a],b:ans[b],c:ans[c]}) )
print("#",Circle(eq.subs({a:ans[a],b:ans[b],c:ans[c]})))
# x**2 - 8*x + y**2 - 4*y - 5
# Circle(Point2D(4, 2), 5)

(解2)“円の中心は弦の垂直二等分線上にある”

from sympy import *
var('x y a b c')
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
O=               Line(A,B).perpendicular_line((A+B)/2) \
   .intersection(Line(B,C).perpendicular_line((B+C)/2))[0]
print("#",Circle(O,O.distance(A)))
print("#",Circle(O,O.distance(A)).equation().expand())
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5

(解3)“円束” ??????(えんそく、英: pencil of circles)

from sympy import *
x,y,k=symbols("x,y,k",real=True)
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
P=Point(x,y)
eq1=(P-B).dot(P-C)
eq2=Line(B,C).equation()
eq2=eq2/eq2.coeff(x)
eq3=eq1+k*eq2
eq4=eq3.subs({k:solve(eq3,k)[0].subs({x:A.x,y:A.y})}).expand()
print("#",       eq4 )
print("#",Circle(eq4))
# x**2 - 8*x + y**2 - 4*y - 5
# Circle(Point2D(4, 2), 5)

(解4) “sympyのCircleで”

from sympy import *
print("#",Circle(Point(8, 5),Point(1,-2),Point(9, 2)))
print("#",Circle(Point(8, 5),Point(1,-2),Point(9, 2)).equation().expand())
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5

全部確かめていませんが,
インストール不要で、以下のweb上で実行できます。

(解4)は、実行できました。貼り付けて、evaluateです。

(解5) 後から値を代入が、最もsympyらしいと思います。“sympyのCircleで”

計算時間。私のパソコンだと、2分かかりますが、答えがでました。

from sympy import *
Ax,Ay,Bx,By,Cx,Cy=symbols("Ax,Ay,Bx,By,Cx,Cy",real=True)
A=Point(Ax,Ay)
B=Point(Bx,By)
C=Point(Cx,Cy)
print("#",Circle(A,B,C))
print("#",Circle(A,B,C).equation().expand())
mySubs={
        Ax:8,Ay: 5,
        Bx:1,By:-2,
        Cx:9,Cy: 2,
}
print("#",Circle(A,B,C)                    .subs(mySubs))
print("#",Circle(A,B,C).equation().expand().subs(mySubs))
# Circle(Point2D(((Ax + Bx)*(Ax*By .... 250文字?以下省略
# Ax**3*By/(Ax*By - Ax*Cy -        .... 250文字?以下省略     
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5

他の解答方法

以下,値は異なりますが,(0,3)(-1,0)(-3,4)
他にもエクセルVBAソルバーあります。解は、小数点表示です。ルート(√)表示できません。

(解6)

(解7) 

これも、後から値を代入。
Tuple

入試問題

今回、以下を書き換えました。

参考

円束(えんそく、英: pencil of circles)

英語版が見当たりませんでした。

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