본문 바로가기
파이썬으로 풀어보는 고딩수학/평면좌표

원의 방정식

by hustler78 2023. 12. 21.
728x90
반응형

 

이번에는 원(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에 강력한 기능이 있었어. 예전 글 삼각형의 외접원 구하기

 

삼각형의 외접원 구하기

저번 글 두 점에서 거리가 같은 직선상의 점 구하기 두 점에서 거리가 같은 직선상의 점 구하기 저번 글에서는 2023.11.17 - [파이썬으로 풀어보는 고딩수학/평면좌표] - 삼각형의 모양 판단? 삼각형

sine-qua-none.tistory.com

에서 한번 했었지. 바로 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 삼각형의 외접원

 

 

 

 

728x90
반응형

댓글