선형 대수

Orthogonal 벡터 만들기

호재 P.B 2022. 3. 2. 02:56

orthogonal 개념

두 벡터가 "orthogonal하다"라는 것은 수직이라는 의미입니다.

두 벡터의 내적은 아래와 같으므로, orthogonal 한 두 벡터의 내적 값은 0 ($cos(\theta) = 0$)이 됩니다.

$$ u \cdot v = |u| |v| cos(\theta) $$

 

orthogonal한 벡터 만들기

하나의 벡터 $u$가 주어져 있고, 여기에 orthogonal하지 않은 벡터 $v$를 추가한다고 합시다

그리고 추가한 벡터 $v$로 기존에 있던 $u$와 orthogonal한 벡터를 만들고 싶다면 어떻게 하면 좋을까요?

이 두 개의 벡터 $u$, $v$를 이용하여 $u$에 orthogonal한 새로운 벡터를 만들 수 있습니다!

 

아래와 같이 2차원 평면에 $u = [3,1]$가 있고, 벡터 $v = [1,2]$를 추가하였습니다.

보이는 것처럼 두 벡터는 수직이 아니므로 orthogonal하지 않습니다

여기서 우리는 벡터 $v$에서 벡터 $u$로 수선의 발 $v_2$을 내릴 것입니다. 아래와 같이 말이죠

그렇게 되면, 우리는 $v_2$에서 $v$로 향하는 벡터를 구할 수 있게 되고 이는 기존에 존재한 벡터 $u$와 수직(orthogonal)이 됩니다. 해당 벡터를 $v_3$라고 한다면, $v_3 = (v - v_2) $와 같이 구할 수 있습니다.

 

그런데 여기서 $u$에 orthogonal한 벡터인 $v_3$를 구하기 위해서는 $v_2$가 필요합니다. 어떻게 구할 수 있을까요?

 

그림에서 보이는 것처럼 $v_2$는 $u$와 방향이 같은 벡터이기 때문에 $u$의 길이를 늘리거나 줄인다면 $v_2$를 만들 수 있습니다. 즉, 어떤 상수항 c를 $u$에 곱해주면 $v_2$를 만들 수 있습니다 (c는 상수)

$$ v_2 = c u $$ 

 

그렇다면 상수 c는 어떻게 구할 수 있을까요?

$u$와 방향이 같은 길이가 1인 unit 벡터 $u_{unit}$을 구하고 그 벡터에 $v_2$의 길이인 $|v_2|$를 곱해주면 됩니다.

아래의 식을 보면 위에서 말씀드린 상수항 c는 $\large\frac{|v_2|}{|u|}$가 되는 것이죠.

$$ v_2 = |v_2| u_{unit} = |v_2| \frac{u}{|u|} = \frac{|v_2|}{|u|} u$$

이제 마지막으로 $|v_2|$ 만 구하면 $v_2$를 구할 수 있겠네요

답은 바로 위에서 보이는 직각 삼각형에 있습니다. 벡터 $u$와 $v$ 사이의 각도를 $\theta$라고 한다면, 삼각 함수 공식을 이용하여 $|v_2|$를 구할 수 있습니다.

$$ |v_2| = |v| cos(\theta)$$

자, 최종적으로 식을 대입해보면 아래와 같습니다

$$ v_2 = \frac{|v_2|}{|u|} u = \frac{|v| cos(\theta)}{|u|} u = cos(\theta) \frac{|v|}{|u|}  u $$

 

여기서 $cos(\theta) = \large\frac{u \cdot v}{|u||v|}$ 이고, $|u|^2 = u \cdot u$ 이므로, 아래와 같이 식이 변형됩니다.

$$ v_2 = cos(\theta) \frac{|v|}{|u|} u = \frac{u \cdot v}{|u||v|}\frac{|v|}{|u|} u = \frac{u \cdot v}{|u|^2}u = \frac{u \cdot v}{u \cdot u} u$$

이제 진짜 진짜 마지막으로! 처음에 말씀 드린 $v_3 = (v - v_2)$를 이용하여 $u$와 orthogonal한 벡터를 만들 수 있게 됩니다

$$ v_3 = v - \frac{u \cdot v}{u \cdot u} u  $$

 

코드를 통한 예제

위의 두 벡터를 코드를 통해서 계산해보겠습니다

우선 numpy를 이용하여 위의 두 벡터 $u$, $v$를 만들어 줍니다.

import numpy as np

u = np.array([3,1])
v = np.array([1,2])

$v$에서 $u$에 수선의 발을 내린 $v_2$를 만들어 줍니다. 위의 수식을 참고하세요 :) 

# 새로 추가된 v를 u에 사영(수선의 발) 시키자
v2 =  (u.dot(v) / u.dot(u)) * u
print('vector v2 :', v2)

 

그리고, $v_2$와 $v$를 이용하여, $u$와 orthogonal한 벡터 $v_3$를 만들어 줍시다

# u와 orthogonal한 벡터를 만들자 
v3 = v - v2
print('vector v3 :', v3)

최종적으로 내적을 이용하여 $v_3$와 $u$가 orthogonal한지 확인합니다. 

내적 값이 0인 것으로 보아 orthogonal한 것을 알 수 있습니다 :)

# orthogonal한지 확인
print(u.dot(v3))

마치며

기존 벡터에 새로운 벡터를 추가할 때, orthogonal한 벡터를 만드는 방법에 대해 알아보았습니다

감사합니다.

 

 

글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :)

반응형