저번 글에서는
2023.11.17 - [파이썬으로 풀어보는 고딩수학/평면좌표] - 삼각형의 모양 판단?
파이썬 내의 sympy 라는 라이브러리를 사용하여 삼각형이 어떤 형태인지를 간단하게 알아봤어.
이번엔
두 점에서의 거리가 같은 직선상의 점 구하기
에 관련된 문제를 풀면서 sympy 기능들을 좀 더 소개해 볼게
문제
두 점 $A(8,-7), B(12,5)$에서 같은 거리에 있고, 직선 $x+2y-3=0$위에 있는 점 $P$의 좌표를 구하여라.
'수학의 정석'에 있는 문제야. 그림으로 그려보면 아래와 같지.
점과 좌표들의 규격이 좀 안맞더라고 이해 부탁해. 설명을 위해 대충 그려서..
일단, 학생의 풀이로 답을 알아보자구.
연습장 풀이
$P$는 직선 $x+2y-3=0$위에 있으므로 매개 변수 $t$를 도입하여
$$P(-2t+3, t)$$
라 놓을 수 있다. $AP=BP$이므로 $AP^2 = BP^2$이 성립하고
$$ (-2t+3-8)^2+ (t+7)^2 = (-2t+3-12)^2 +(t-5)^2$$ 을 만족한다. 따라서 이를 풀면 $t=4$이고 점 $P$는
$$ P(-5,4)$$이다.
이제 이 문제의 답을 파이썬 코딩으로 알아볼게
파이썬 풀이
import numpy as np
from sympy import *
import matplotlib.pyplot as plt
# 위의 libarary import는 편의상 의례적으로 써줌
a,b = symbols("a b") # a, b를 symbol(기호)로 인식한다.
x,y = symbols("x y") # x, y를 symbol로 정의
P = Point([a,b]) # 구하고자 하는 점을 P(a,b)라 놓는다.
A = Point([8,-7]) # 점 A 선언
B = Point([12,5]) # 점 B 선언
my_line = x+2*y-3 # 직선의 방정식
eq1 = Eq(P.distance(A), P.distance(B)) # PA의 길이와 PB의 길이가 같다는 뜻의 방정식
eq2 = my_line.subs({x:a,y:b}) # 점 P(a,b)는 직선 ln 위에 있다. sub는 substitution을 의미
res =solve([eq1,eq2],[a,b]) # 두 방정식을 a,b에 대해 푼다.
print(res) # 결과 출력
실행하면,
[(-5, 4)]
sympy의 함수나, 기능은 따로 설명하진 않을게. 예제를 보면 감이 올 거야.
distance
P.distance(A)
는 Point 형 변수 P와 Point 변수 A사이의 거리를 뜻함.
Eq( equation1, equation2)
equation1과 equation2가 같다는 뜻의 방정식이야. 위의 예에서
eq1 = Eq(P.distance(A), P.distance(B))
는 P.distance(A)라는 식과 P.distane(B)라는 식이 똑같다(Equal)라는 뜻이지.
subs({dict 형})
subs는 symbol로 정의된 문자에 다른 문자나 혹은 숫자를 집어넣는(substitute) 걸 뜻한다. 예를 들어
eq2 = my_line.subs({x:a,y:b})
는 my_line이라는 식에 x대신 a, y 대신 b를 대입하는 뜻이야. 즉 위에서는 점 $P(a, b)$가 직선 $x+2y-3=0$을 지난다는 의미로 해석할 수 있지.
그다음 마지막으로 이것을 풀어야 함
res =solve([eq1,eq2],[a,b])
이렇게 하면 방정식 liset인 [eqn1, eqn2]를 동시에 만족하는 해를 $a, b$에 관하여 풀어보라는 얘기임. 이것을 풀면 결과처럼 나오게 돼.
별해(직선 위 임의의 점 선택)
코딩으로 문제를 풀 경우, 다른 해법도 있어. 위에서 우리는 직선 위의 점 $P$를
$$P(a, b)$$
이렇게 변수 2개로 놨었잖아? 그런데 2차원의 점은 하나의 변수로 매개화가 되지. 예컨대 위의 직선
$$ x+ 2y -3=0$$
은 $x=t$로 놓으면 $y =-\frac12 t+ \frac32 $ 즉
$$ P\left(t, -\frac12 t+ \frac32 \right)$$
이다. 그러면 하나의 방정식만 하나의 변수로 풀면 된다. 아래를 보자.
import numpy as np
from sympy import *
import matplotlib.pyplot as plt
import numpy as np
t= symbols("t")
x,y = symbols("x y")
my_line = Line(x+2*y-3) # 식을 이용한 line 설정
P = my_line.arbitrary_point(parameter=t) # line에서 임의의(arbitraty) 점을 (Point) 선택(매개변수 $t$
print(P) # 출력
eq1 = Eq(P.distance(A), P.distance(B)) # PA의 길이와 PB의 길이가 같다는 뜻의 방정식
res = solve(eq1, t)
print(P.subs(t,res[0])) # res는 위의 방정식을 풀었을 때 해들의 list라 indexing하여 빼준다.
결과는
Point2D(t, 3/2 - t/2)
Point2D(-5, 4)
똑같이 나온다. 위의 $t$로 표현된 점은 직선 위의 임의의 점을 뜻한다.
arbitrary_point(parameter=t)
파라미터를 $t$로 하는 임의의 점을 구해준다. 따라서 원래 풀이에 등장한 변수 $a, b$보다 하나 줄어들어 계산하기가 편해진다.
본문의 sympy 함수
이 글에 등장한, 알아둘 만한 정의 및 함수는 아래와 같다.
Point | (2차원 좌표상의) 점 |
distance | 점과 점 사이의 거리 |
Eq | 두 개의 다른 식이 같다고 놓은 방정식 |
subs | symbol 기호에 숫자나 문자값 대입 |
solve | 방정식의 해결 |
'파이썬으로 풀어보는 고딩수학 > 평면좌표' 카테고리의 다른 글
파푸스의 중선 정리 with Sympy (0) | 2023.12.13 |
---|---|
삼각형의 무게중심을 sympy로 구하기 (0) | 2023.12.06 |
직각삼각형 만들기 (0) | 2023.12.01 |
삼각형의 외접원 구하기 (0) | 2023.11.29 |
삼각형의 모양 판단? (0) | 2023.11.17 |
댓글