1. 벡터 공간과 부분 공간의 기본조건
- 벡터 공간 :
- 벡터들의 집합으로, 임의의 두 벡터 v와 w를 더한 결과 v + w가 항상 같은 공간 내에 있어야한다.
- 임의의 벡터 v에 대해, 어떤 상수 c를 곱합 cv 역시 그 공간 내에 있어야 한다.
- 두 벡터에 상수를 곱해 더한 선형 결합 cv + dw 역시 항상 같은 공간에 속해야 한다.
- 부분 공간(Subspace) :
- 벡터 공간 내의 '작은 공간'으로, 덧셈과 스칼라 곱 연산에 대해 닫혀있어야 한다.
- 반드시 원점을 포함해야 한다. (원점이 없는 집합은 선형 결합의 결과가 항상 그 집합에 머무르지 않으므로 부분 공간이 될 수 없다.)
import numpy as np
import matplotlib.pyplot as plt
# 벡터 플롯 함수
def plot_vector(ax, origin, vector, color, label):
ax.quiver(*origin, *vector, angles='xy',scale_units='xy',scale=1, color=color)
ax.text(*(origin +vector +0.3),label, color=color, fontsize=12)
# -----------------------------
# 1. 부분 공간(Subspace) : 원점을 지나는 선
fig,ax = plt.subplots(figsize=(6,6))
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)
ax.axhline(0, color='black',linewidth=0.5)
ax.axvline(0, color='black',linewidth=0.5)
ax.set_aspect('equal')
ax.grid(True)
v =np.array([2,4])
# 두 벡터 : v와 -v
v1 = 1*v
v2 = -1*v
v_sum = v1+v2
v_scalar = 2 * v
origin = np.array([0,0])
plot_vector(ax,origin,v1,'blue','v')
plot_vector(ax,origin,v2,'green','-v')
plot_vector(ax,origin,v_sum,'red','v+(-v)=0')
plot_vector(ax,origin,v_scalar,'purple','2v')
ax.set_title('Subspace line',fontsize=13)
plt.show()
# 2. 원점을 지나지 않는 직선의 두 점(벡터)
fig, ax = plt.subplots(figsize=(6,6))
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.set_aspect('equal')
ax.grid(True)
p1 = np.array([1,3])
p2 = np.array([-2,-3])
# 두 벡터의 합
p_sum = p1 + p2
plot_vector(ax,np.zeros(2),p1,'blue','p1')
plot_vector(ax,np.zeros(2),p2,'green','p2')
plot_vector(ax,np.zeros(2),p_sum,'red','p1+p2')
ax.set_title('Subspace line',fontsize=13)
plt.show()
2. 부분 공간의 합집합과 교집합
- 합집합 :
- 임의의 두 부분 공간 P와 L의 합집합은 일반적으로 부분 공간이 아니다. (예를 들어, P와 L을 단순히 합치면 덧셈이나 스칼라 곱을 했을 때 결과가 원래의 합집합에 머무르지 않을 수 있다.)
- 교집합 :
- 두 부분 공간 P와 L의 교집합은 항상 부분 공간이다. (두 공간 모두 반드시 원점을 포함하므로, 겹치는 부분은 선형 결합의 조건을 만족한다.)
- 수식표현 :
- 만약 P와 L을 한 공간으로 고려한다면, 그 합집합(혹은 P∪L)은 일반적으로 부분 공간의 조건을 위배한다.
- 반면, P∩L(교집합)은 항상 부분 공간이 된다.
# 1. 합집합(Union)
# x값 범위
x = np.linspace(-10,10,400)
# U : x축
y_u = np.zeros_like(x)
# V : y=x
y_v = x
fig,ax1 =plt.subplots(figsize=(6,6))
ax1.plot(x,y_u, 'b-',label='Subspace U (x-axis)')
ax1.plot(x,y_v,'g-',label='Subspace V (y=x)')
u= np.array([4,0])
v= np.array([2,2])
origin = np.array([0,0])
plot_vector(ax1,origin,u,'blue','u')
plot_vector(ax1,origin,v,'green','v')
uv_sum = u+v
plot_vector(ax1,origin,uv_sum,'red','u+v')
# u+v가 U 또는 V에 속하지 않음을 보여주는 화살표 표시
ax1.annotate('u+v not in U ∪ V',xy=(6,2),xytext=(6,3.5),
arrowprops=dict(arrowstyle='->',color='black'),fontsize=12)
ax1.axhline(0,color='black',linewidth=0.5)
ax1.axvline(0,color='black',linewidth=0.5)
ax1.grid(True)
ax1.legend(fontsize=10)
ax1.set_aspect('equal')
ax1.set_title('Union',fontsize=14)
# 2. 교집합 (Intersection) 시각화: U ∩ V (항상 부분 공간)
# -----------------------------
fig, ax2 = plt.subplots(figsize=(6,6))
ax2.plot(x, y_u, 'b-', label='Subspace U (x-axis)')
ax2.plot(x, y_v, 'g-', label='Subspace V (y = x)')
# U와 V의 교집합은 두 직선이 만나는 점, 즉 원점
ax2.scatter(0, 0, color='red', s=100, zorder=5, label='Intersection (Origin)')
ax2.axhline(0, color='black', linewidth=0.5)
ax2.axvline(0, color='black', linewidth=0.5)
ax2.grid(True)
ax2.legend(fontsize=10)
ax2.set_aspect('equal')
ax2.set_title('Intersection', fontsize=14)
plt.show()
3. 행렬의 Column Space와 Null Space
- Column Space :
- 행렬 A의 각 열(column)은 벡터이며, 이들의 선형 결합으로 만들어지는 집합을 C(A)라고 한다.
- 만약 A가 3개의 column을 가지며, 각 column은 4개의 원소로 이루어져 있을 때, C(A)는 R^4내의 부분 공간이다.
- 하지만 A의 모든 column의 선형 결합으로 R^4 전체를 채울 수 없고, 실제로 몇몇 column은 다른 column에 종속적이어서 C(A)는 2차원 평면과 같이 차원이 낮은 부분 공간을 형성한다.
- 선형 방정식 Ax=b에서 해가 존재하려면 b가 C(A)에 속해야 한다.
- Null Space :
- Ax=0를 만족하는 모든 해 x의 집합을 Null Space라고 한다.
- 모든 Null Space는 반드시 영벡터 x =[0,0,0]^T를 포함하므로 벡터 공간의 조건을 만족한다.
- 반면, b가 영벡터가 아닌 경우의 해 집합은 원점을 포함하지 않기 때문에 벡터 공간이 되지않는다.
# 3D 플롯을 위해 필요
from mpl_toolkits.mplot3d import Axes3D
# Null space의 기저 벡터
v = np.array([1, 1, -1])
t_vals = np.linspace(-5, 5, 100) # t 값 범위
null_points = np.outer(t_vals, v) # 각 t에 대해 t*v를 계산
# 3D 플롯 생성
fig = plt.figure(figsize=(12,6))
# 1. Null Space (Ax=0) 시각화
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot(null_points[:, 0], null_points[:, 1], null_points[:, 2], 'b-',
label='Null Space: span{[1, 1, -1]}')
ax1.scatter(0, 0, 0, color='red', s=50, label='Origin') # 원점 표시
ax1.set_title('Null Space of A: Ax = 0')
ax1.set_xlabel('x1')
ax1.set_ylabel('x2')
ax1.set_zlabel('x3')
ax1.legend()
# 2. Ax = b (b ≠ 0) 해집합 시각화 (Affine Space)
# 행렬 A와 b
A = np.array([[1, 1, 2],
[2, -1, 1]])
b = np.array([3, 1])
# 직접 구한 particular solution: x_p = [4/3, 5/3, 0]
x_p = np.array([4/3, 5/3, 0])
# 일반해: x = x_p + t*v
affine_points = x_p + np.outer(t_vals, v)
ax2 = fig.add_subplot(122, projection='3d')
ax2.plot(affine_points[:, 0], affine_points[:, 1], affine_points[:, 2], 'g-',
label='Solution Set: x_p + span{[1, 1, -1]}')
ax2.scatter(x_p[0], x_p[1], x_p[2], color='purple', s=50,
label='Particular Solution x_p')
ax2.scatter(0, 0, 0, color='red', s=50, label='Origin (Not in solution set)')
ax2.set_title('Affine Space of Solutions for Ax = b (b ≠ 0)')
ax2.set_xlabel('x1')
ax2.set_ylabel('x2')
ax2.set_zlabel('x3')
ax2.legend()
plt.show()
'MIT 18.06 Linear Algebra' 카테고리의 다른 글
7. Solving Ax=0 : Pivot Variables, Special Solutions (0) | 2025.04.01 |
---|---|
5.Transposes,_Permutations,_Spaces_R^n (0) | 2025.04.01 |
4.Factorization_into_A_=LU (0) | 2025.04.01 |
3. Multiplication_and_Inverse_Matrices (0) | 2025.04.01 |
Lecture 2. Elimination with Matrices (0) | 2025.03.02 |