이번에는 원(Circle)에 대한 이야기를 해볼까 해. sympy에서는 원에 대한 함수와 계산툴들을 어느 정도 제공해 주고 있지.
간단한 문제들을 풀어보며 sympy 사용법을 알아보자고.
문제 1
두 점 $A(1,2), B(-3,-2)$를 지름 양 끝 점으로 하는 원의 방정식을 구하여라.
아주 평이한 문제지. 두 점 $A, B$가 지름의 양 끝점이니, $AB$의 중점
$$ M(-1,0)$$
이 원의 중심이 되는 건 당연하고, 또 반지름을 구해보면
$$ AM = \sqrt{ (-1-(1))^2 + (0-2)^2} = 2\sqrt {2}$$
이므로 원의 방정식은
$$ (x+1)^2 + y^2 = 8$$
이 될 거야. 이걸 python code로 풀어보면,
from sympy import *
import numpy as np # numpy library를 안쓰더라도 습관처럼 써줌
A, B = Point(1, 2), Point(-3, -2) # 두 점 A,B 정의
ct = A.midpoint(B) # A,B의 중점을 ct로 정의
r = A.distance(ct) # A와 ct 사이의 거리를 r
c_equation = Circle(ct, r).equation() # ct를 중심, r을 반지름으로 하는 원 선언하고 equation 출력
print(c_equation)
간단하지? 결과를 보면,
y**2 + (x + 1)**2 - 8
손으로 푼 것과 똑같은 결과!
한 가지 사실! 만일 코드의 밑에서 두 번째 줄에 equation()을 빼면 어떨까?
c_equation = Circle(ct, r)
print(c_equation)
이렇게 하면 결과는
Circle(Point2D(-1, 0), 2*sqrt(2))
이렇게 Circle 클래스의 형식으로 출력해 준다는 것
문제 2
세 점 $A(3,1), B(1,-3), C(4,0)$을 꼭짓점으로 하는 삼각형의 외심의 좌표와 외접원의 반지름을 구하여라.
이번엔 세 점을 지나는 원을 구하는 문제야. 세 점이 일직선 위에만 있지 않으면 이 세 점은 삼각형을 이루고 삼각형은 항상 외접원을 가지므로 원의 존재성은 당연한 거지.
우선 손으로 풀어보자. 원의 중심을 $(a, b)$라 하면,
$$ (a-3)^2 + (b-1)^2 = (a-1)^2 + (b+3)^2 = (a-4)^2+b^2 $$
을 만족하지, 각 변을 전개했을 때 튀어나오는 $a^2+ b^2$ 등을 날려보면
$$ -6a -2b +10 = -2a +6b +10 = -8a+16$$
이 성립하고, 이 연립방정식의 해는
$$ (a,b) = (2, -1)$$ 이고 얘가 곧 원의 중심이야. 반지름은 얘랑 $A, B, C$ 중 어느 하나와의 거리를 구해주면 되므로 구해보면 $\sqrt {5}$가 나오고. 따라서 원의 방정식은
$$ (x-2)+(y+1)^2 = 5$$
가 되지요.
하지만 sympy에 강력한 기능이 있었어. 예전 글 삼각형의 외접원 구하기
에서 한번 했었지. 바로 circumcircle!
from sympy import *
import numpy as np
A, B, C = Point(3, 1), Point(1, -3), Point(4, 0) # 세 점 A,B,C 선언
tr = Triangle(A, B, C) # 세 점으로 이루어진 삼각형
circ = tr.circumcircle # 삼각형의 외접원 구하기
print(circ) # 외접원 정보 출력
print(circ.equation()) # 외접원 방정식 출력
결과를 한번 볼까?
Circle(Point2D(2, -1), sqrt(5))
(x - 2)**2 + (y + 1)**2 - 5
Circle 객체정보를 그대로 뿌려주고, 방정식도 제공해 주지 (equaton()을 붙이면)
문제 3
아쉬우니까, 한 문제 더 풀어보자.
중심이 직선 $y=2x+3$ 위에 있고, 두 점 $(1,2) , (-2,3)$을 지나는 원의 방정식
아주 전형적인 문제야. 원의 중심이 $y=2x+3$위에 있으니 원의 중심은
$$(a, 2a+3)$$이라 놓을 수 있을 거고, 얘랑 문제의 두 점까지의 거리가 같으므로
$$ (a-1)^2+(2a+3-2)^2 = (a+2)^2 +(2a+3-3)^2$$ 을 풀어버리면 됨. 그러면 $a=-1$이 나와. 또 이 값을 식에 대입하면, 반지름은 $\sqrt {5}$이지.
따라서 원의 방정식은
$$ (x+1)^2 + (y-1)^2 = 5$$
x, y = symbols("x y")
a, b= symbols("a b") # (a,b)는 구하려는 원의 중심, r: 반지름
r= symbols("r", positive =True)
eqn = (x-a)**2 + (y-b)**2 - r # 원의 방정식
eqn1= b-2*a-3 # 원중심의 x,y좌표인 a,b가 만족하는 방정식
eqn2= eqn.subs({x:1,y:2}) # 원의 방정식이 점(1,2)를 지난다. dictionary 형식으로..
eqn3 = eqn.subs({x:-2,y:3}) # 원의 방정식이 점(-2,3)을 지난다.
res = solve([eqn1, eqn2, eqn3], [a, b, r]) # 위 3종류 방정식을 a,b,r에 대하여 푼다.
print(res) # 결과 출력
참고로, subs를 이용하여 두 변수 이상의 값을 넣을 땐, 위처럼 dictionary 형식으로 넣어주면 됨. 결과를 보자면,
[(-1, 1, 5)]
요렇게 나오지. 순서대로 a, b, r인 거야. 따라서 원의 방정식이 얻어지지.
정리
이 글에서 나온 sympy 함수들을 다뤄보면 아래표와 같아. 다른 글들에서도 이미 소개가 되었지만 정리도 할 겸 한 번 써볼게
Circle(point, radius) | 중심이 pt 이고 반지름이 radius인 원 |
Circle.equation() | 원의 방정식 표시 |
subs( {x:a, y:b}) | 두 변수 이상을 대입할 때, dictionary 형으로 |
Triangle.circumcircle | 삼각형의 외접원 |
'파이썬으로 풀어보는 고딩수학 > 평면좌표' 카테고리의 다른 글
수직으로 만나는 점, 직선 구하기 (0) | 2023.12.18 |
---|---|
육각형 속 마름모(@puzzlist의 기하문제) (0) | 2023.12.15 |
파푸스 정리의 일반화, 스튜어트 정리 (0) | 2023.12.13 |
파푸스의 중선 정리 with Sympy (0) | 2023.12.13 |
삼각형의 무게중심을 sympy로 구하기 (0) | 2023.12.06 |
댓글