이번 글은 수직으로 만나는 직선에 관련된 내용이야. sympy에서는 수직과 관련된 몇몇 툴을 제공해 주는데, 예제를 통해서 어떤 기능들이 있는지 한번 보자고.
문제 1
직선 $y= \frac12 x+4$와 $x$축에서 수직으로 만나는 직선을 구하여라.
아주 간단한 내용이야. 거의 암산으로도 될 지경이지. 일단 $y=\frac12x+4$와 수직으로 만나는 직선의 기울기는 $-2$가 되어야 하고, $x$축에서 수직으로 만난다고 했으므로 위 직선의 $x$절편인 $(-8,0)$을 지나야 함. 따라서
$$ y= -2(x+8)$$
이 정답이야. 그럼 이것을 sympy로는 어찌 풀어야 되나?
from sympy import *
x, y = symbols("x y") # x,y 를 symbol 로 정의
f = Line((1 / 2) * x - y + 4) # y = 1/2 * x + 4 직선
x_axis = Line(y) # x축의 방정식은 y=0 이므로 Line(y)라 설정
x_intercept = x_axis.intersection(f) # f와 x축의 교점
res = f.perpendicular_line(x_intercept[0])
# 늘 나오듯. intersection 함수는 list를 반환해 주므로 index를 통하여 점을 끄집어 내줘야 함
# x_intercept[0]
# res = res.equation() # 이 주서은 차후 설명 (아래처럼 x=x, y=y)로 해줘야 함
res = res.equation(x=x, y=y) # (x=x, y=y)를 해주어야지만, 위의 symbols x,y와 매치된다.
res_equation = solve(res, y) # 해당 결과를 y에 대해서 품
print(res_equation)
결과는 아래와 같지.
[-2.0*x - 16.0]
손으로 푼 답이랑 똑같네. 위 코드에서 설명을 더 붙이자면,
res = f.perpendicular_line(x_intercept[0])
print(res)
일단 위 코드에서 구한 res 라는 변수를 출력해 보면,
Line2D(Point2D(-8.0, 0), Point2D(-8.5, 1))
위와 같은 형태로 표현이 되지. 우리가 익숙한 방정식으로 볼 수가 없다는 뜻이야. 그래서
아래와 같이 equation이라는 함수를 써서 방정식 형태로 보여줘야 해
res = res.equation(x=x, y=y) # (x=x, y=y)를 해주어야지만, 위의 symbols x,y와 매치된다.
그런데 주석에서 보듯 (x=x , y=y)를 해 줘야 하는 이유가, 그냥
res = res.equation()
이렇게만 하면, 물론 출력은 x, y로 되지만, 위에서 symbol로 정의된 x, y와 매치가 되지 않아서 그 이후의 방정식이 안 풀리게 되지. 실제로, 이렇게 코딩을 하면 답이 안나오게 됨! 즉,
res = res.equation()
print(res)
게 하면 출력결과는
-x - 0.5*y - 8.0
와 같이 찍혀서 나오지만, 위의 x,y 가 우리가 선언한 symbol x, y와 매치가 안돼서 안 풀린다는 것! 그래서 (x=x , y=y) 이렇게 정의해줘야 한다는 것이야.
문제 2
두 점 $A(1,3), B(-3,7)$을 지나는 직선에 수직이고, 선분 $AB$를 $3:1$로 내분하는 점 $C$를 지나는 직선의 방정식을 구하여라.
이것도 수직인 직선을 찾는 문제네. 점 $A, B$를 3:1로 내분한 점 $C$는
$$ C\left( \frac{3\cdot(-3)+1\cdot1}{3+1} ~,~ \frac{3\cdot 7+1\cdot 3}{3+1} \right) = (-2,6)$$
이고 기울기는 $-1$이므로 점 $C$ 를 지나며 기울기 1인 직선의 방정식은
$$ y=x+8$$
이지. 이제 python으로 방정식을 찾아보겠어.
from sympy import *
A, B = Point(1, 3), Point(-3, 7) # 점 A,B 정의
C = B.scale(3 / 4, 3 / 4, pt=A) # 3:1로 내분한 점 구하기
line = Line(A, B).perpendicular_line(C) # A,B를 잇는 직선과 수직이고 점 C를 지나는 직선
print(line.equation()) # 직선의 방정식 출력
결과를 볼까?
4*x - 4*y + 32
여기서 scale함수를 좀 더 구체적으로 알아볼 필요가 있을 것 같아.
scale 함수
sympy의 scale함수는 다음과 같이 정의되지.
B.scale(x=1, y=1, A=None)
A, B는 둘 다 Point 형
위 함수의 정의는
B에서 A 점을 뺀 벡터의 $x, y$좌표를 각각 $x$배, $y배$ 하여 얻은 뒤 다시 그 벡터에 A를 더해준 것임
scale의 parameter인 x, y인 각 방향에 대한 비율을 뜻해. 그림으로 설명하면,
step1. 점 A, B에 대하여
step2. 점 B에서 점 A를 뺀 벡터 B-A (원점이 종점이 되게 만듦)를 $x$으로 $x$배, $y$축으로 $y$배 함
step3. 이 결과( step2의 빨간 점)에 다시 점 A를 더해서 빨간 점의 위치 원복
따라서 scale를 통해, 선분 $AB$를 내분할 수도 있는 것이지. 예컨대 선분 $AB$를 3:1로 내분하면 위의 python code같이 됨.
정리
이번 글에서 쓰였던 함수, 개념들을 정리해 볼게
line1.intersection(line2) | line1과 line2의 교차점 : list형을 반환함 |
Line.perpendicular_line(pt) | 점 pt를 지나고 Line에 수직인 직선 |
Line.equation() | Line의 방정식을 표시한다. default변수는 $x, y$ |
B.scale(x,y,A) | 선분 AB를 $x$축으로 $x$ 비율, $y$축으로 $y$비율만큼 스케일링 |
'파이썬으로 풀어보는 고딩수학 > 평면좌표' 카테고리의 다른 글
원의 방정식 (0) | 2023.12.21 |
---|---|
육각형 속 마름모(@puzzlist의 기하문제) (0) | 2023.12.15 |
파푸스 정리의 일반화, 스튜어트 정리 (0) | 2023.12.13 |
파푸스의 중선 정리 with Sympy (0) | 2023.12.13 |
삼각형의 무게중심을 sympy로 구하기 (0) | 2023.12.06 |
댓글