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

두 점에서 거리가 같은 직선상의 점 구하기

by hustler78 2023. 11. 28.
728x90
반응형

저번 글에서는

 

2023.11.17 - [파이썬으로 풀어보는 고딩수학/평면좌표] - 삼각형의 모양 판단?

 

삼각형의 모양 판단?

2023.11.17 - [파이썬으로 풀어보는 고딩수학] - 프롤로그 프롤로그 살면서 참 수학이 본의 아니게 많이 쓰여. 중고딩 때는 그토록 어려웠던 수학이 생활 곳곳에서 사용되는 거 같아. 반면 다행인 것

sine-qua-none.tistory.com

 

파이썬 내의 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 방정식의 해결

 

 

 

728x90
반응형

댓글