728x90
개발자를 위한 실전 선형대수학(파이썬 3.10 버전 대응, 구글 코랩 실습 가능) | 마이크 X 코헨 - 교
개발자를 위한 실전 선형대수학(파이썬 3.10 버전 대응, 구글 코랩 실습 가능) | 복잡한 증명과 수식 없이 파이썬을 이용해 직관적으로 배우는 선형대수학 * 연습문제 + 해답 + 해설 강의, 무료 샘
product.kyobobook.co.kr
하나의 벡터를 두 개의 벡터로 분해

벡터 a와 b
거리가 최소가 되도록 벡터 b를 벡터 a에 투영 = 직각이 되도록 내리면 된다
βa와 (b- βa)의 내적은 0(직교하는 벡터의 내적은 0)
즉 a와 (b-βa)의 내적은 0
직교 투영법: 점을 최소 거리로 투영하는 공식

# 벡터 정의
a = np.array([2, 0])
b = np.array([1, 3])
# 벡터 a에 대한 b의 정사영 계산
beta = (np.dot(a, b) / np.dot(a, a))
proj_b_on_a = beta * a # a에 스칼라 값 beta를 곱해서 a 확장/축소
# 그래프 설정
plt.xlim(-1, 3)
plt.ylim(-1, 4)
# 축 그리기
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
# 벡터 그리기
plt.quiver(0, 0, a[0], a[1], angles='xy', scale_units='xy', scale=1, color='blue')
plt.quiver(0, 0, b[0], b[1], angles='xy', scale_units='xy', scale=1, color='red')
plt.scatter(proj_a_on_b[0], proj_a_on_b[1], color='black')
# 정사영 점선 추가
plt.plot([b[0], proj_a_on_b[0]], [b[1], proj_a_on_b[1]], 'k--', alpha=0.7)
# 벡터 라벨 추가
plt.text(b[0], b[1], r'$\vec{b}$', fontsize=12, verticalalignment='bottom', horizontalalignment='left')
plt.text(a[0], a[1], r'$\vec{a}$', fontsize=12, verticalalignment='top', horizontalalignment='right')
plt.text(proj_a_on_b[0], proj_a_on_b[1], r'$\beta$', fontsize=12, verticalalignment='top', horizontalalignment='right')
plt.text((b[0]+proj_a_on_b[0])/2, (b[1]+proj_a_on_b[1])/2, r'$(b-\beta a)$', fontsize=12, verticalalignment='top', horizontalalignment='left')
# 격자 및 스케일 설정
plt.grid(True, linestyle='dotted', linewidth=0.5)
plt.gca().set_aspect('equal')
plt.show()
직교벡터 분해하기
목표 벡터와 기준벡터가 필요
목표벡터: 두 개의 다른 벡터로 분해될 벡터
분해될 두 개의 벡터
- 기준벡터와 직교
- 기준벡터와 평행
기준벡터와 직교한 벡터 + 기준벡터와 평행한 벡터 = 목표벡터

t = np.random.randn(2) # 목표벡터
r = np.random.randn(2) # 기준벡터
beta = np.dot(t,r) / np.dot(r,r)
t_para = beta*r # 평행 parallel
t_perp = t - t_para # 수직 perpendicular
beta, t_para, t_perp
# 벡터 그리기
plt.quiver(0, 0, t[0], t[1], angles='xy', scale_units='xy', scale=1, color='blue', label='목표벡터')
plt.quiver(0, 0, r[0], r[1], angles='xy', scale_units='xy', scale=1, color='red', label='기준벡터')
plt.plot([0,t_para[0]], [0,t_para[1]], 'k--', label='기준벡터와 평행')
plt.plot([0,t_perp[0]], [0,t_perp[1]], 'k:', label='기준벡터와 수직')
# plt.scatter(t_para[0]+t_perp[0], t_para[1]+t_perp[1])
plt.axis('equal')
plt.legend()

'혼자 공부 > 선형대수학' 카테고리의 다른 글
상관관계와 코사인 유사도 (0) | 2025.03.18 |
---|---|
벡터2 (0) | 2025.03.07 |
벡터1 (0) | 2025.03.03 |