코딩 더 매트릭스 - 4장 벡터공간 (2)

아핀 공간, 동차 선형시스템

2018년 11월 27일

필립 클라인의 저서 코딩 더 매트릭스 4장 벡터공간.


  1. 벡터의 평행이동 결과인 아핀 공간을 알아 봅니다.
  2. 앞서 살펴봤던 flat의 두 가지 표현법을 적용해봅니다.
  3. 선형시스템에 대응하는 동차 선형시스템을 알아봅니다.





아핀 공간

원점을 지나는 직선이자 벡터공간인 VV를 벡터 aa만큼 평행이동했을 때 다음과 같은 집합으로 표현할 수 있습니다.

{a+v:vV}\{a + v : v \in V\}

이러한 집합을 a+Va + V로 줄여 쓸 수 있습니다.

세 점을 지나는 평면을 벡터공간의 평행이동으로 표현하고자 합니다. 같은 직선상에 있지 않은 세점 u1=[1,0,4.4]u_1 = [1, 0, 4.4], u2=[0,1,4]u_2 = [0, 1, 4], u3=[0,0,3]u_3 = [0, 0, 3]가 있을때 이들을 지나는 평면은 벡터 u1u2\vec{u_1 u_2}, u1u3\vec{u_1 u_3}의 생성과 u1u_1 만큼의 평행이동으로 만들어집니다. 정리하면 V=Span{u1u2,u1u3}V = Span\{\vec{u_1 u_2}, \vec{u_1 u_3}\}일때 평면은 u1+Vu_1 + V입니다. matplotlib으로 생성자와 평면을 직접 그려보겠습니다. 평면의 방정식은 벡터 u1u2\vec{u_1 u_2}, u1u3\vec{u_1 u_3}의 법선벡터를 구하고 세개의 점 중 아무거나 하나를 골라 구할 수 있습니다. u1u2=[1,1,0.4]\vec{u_1 u_2} = [-1, 1, -0.4]이고 u1u3=[1,0,1.4]\vec{u_1 u_3} = [-1, 0, -1.4] 이므로 법선벡터를 외적으로 구하면

ijk110.4101.4=1.4i1j+1k\begin{vmatrix} i & j & k \\ -1 & 1 & -0.4 \\ -1 & 0 & -1.4 \end{vmatrix} = -1.4i - 1j + 1k

법선 벡터 [1.4,1,1][-1.4, -1, 1]과 점 [1,0,4.4][1, 0, 4.4]를 이용하면 평면의 방정식 1.4xy+z=3-1.4x -y + z = 3을 구할 수 있습니다.

# 생성자
origin = [1, 0, 4.4]			# u1
X, Y, Z = zip(origin, origin)
V = np.array([
    [-1, 1, -0.4],				# u1u2
    [-1, 0, -1.4]				# u1u3
])

# 평면
x, y = np.meshgrid(range(10), range(10))
z = 1.4 * x + y + 3

plt.figure()
ax = plt.subplot(projection='3d')
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([0.7, 0.7, 1.4, 1]))
ax.plot_surface(x, y, z)
ax.scatter([1, 0, 0], [0, 1, 0], [4.4, 4, 3], color='g', s=100)
ax.quiver(X, Y, Z, V[:, 0], V[:, 1], V[:, 2], color='r', linewidths=3)
plt.show()

이전에 점 uuvv를 지나는 직선을 아핀결합으로 표현한 적 있었습니다. {αu+βv:α,βR,α+β=1}\{\alpha u + \beta v : \alpha, \beta \in \Bbb{R}, \alpha + \beta = 1\} 아핀결합의 정확한 정의는 선형결합 α1u1+α2u2+...+αnun\alpha_1 u_1 + \alpha_2 u_2 + ... + \alpha_n u_n에 대해 계수들의 합이 1인 경우입니다. 세 점을 지나는 평면의 경우 u1+Vu_1 + V를 아핀결합 표현으로 바꿔 써 보겠습니다. V=Span{u1u2,u1u3}V = Span\{\vec{u_1 u_2}, \vec{u_1 u_3}\}이므로 VV에 있는 벡터들은 선형결합 α(u2u1)+β(u3u1)\alpha (u_2 - u_1) + \beta (u_3 - u_1) 으로 나타낼 수 있습니다. 위 식에 u1u_1을 더하면

u1+V=u1+α(u2u1)+β(u3u1)=(1αβ)u1+αu2+βu3=γu1+αu2+βu3\begin{aligned} u_1 + V & = u_1 + \alpha (u_2 - u_1) + \beta (u_3 - u_1) \\ & = (1 - \alpha - \beta) u_1 + \alpha u_2 + \beta u_3 \\ & = \gamma u_1 + \alpha u_2 + \beta u_3 \end{aligned}

여기서 γ+α+β=1\gamma + \alpha + \beta = 1입니다. 따라서 u1+Vu_1 + Vu1u_1, u2u_2, u3u_3의 아핀결합들로 구성된 집합입니다. 어떤 벡터 컬렉션의 모든 아핀결합으로 구성된 집합은 그 컬렉션의 아핀 hull 이라고 합니다. e.g.{αu1+βu2+γu3:αR,βR,γR,α+β+γ=1}e.g. \{\alpha u_1 + \beta u_2 + \gamma u_3 : \alpha \in \Bbb{R}, \beta \in \Bbb{R}, \gamma \in \Bbb{R}, \alpha + \beta + \gamma = 1 \}

아핀공간은 벡터공간을 평행이동한 결과입니다. 즉 집합 AA는 다음을 만족하는 벡터 aa와 벡터공간 VV가 있으면 아핀공간입니다. A={a+v:vV}A = \{a + v : v \in V\} A=a+VA = a + V로 쓸 수도 있습니다. 아핀공간과 아핀 hull 사이에는 어떤 관계가 있을까요? 임의의 벡터 u1,u2,...,unu_1, u_2, ..., u_n이 있을 때 다음이 성립합니다.

{α1u1+α2u2+...+αnun:i=1nαi=1}={u1+v:vSpan{u2u1,u3u1,...,unu1}}\{\alpha_1 u_1 + \alpha_2 u_2 + ... + \alpha_n u_n : \sum^{n}_{i=1}\alpha_i = 1\} = \{ u_1 + v : v \in Span\{u_2 - u_1, u_3 - u_1 , ..., u_n - u_1\} \}

등식의 좌변은 아핀결합으로 구성된 집합인 아핀 hull 을, 우변은 벡터의 생성에 대해 평행이동해 얻어지는 집합인 아핀공간을 의미합니다. 따라서 아핀공간은 두가지로 표현 가능합니다.

  • a+Va + V
  • 어떤 벡터들의 아핀 hull





flat을 나타내는 두 가지 표현법 - 적용

flat은 아래와 같이 두 가지로 표현할 수 있었습니다.

  1. 어떤 벡터들의 생성으로서 e.g.Span{u,v}e.g. Span\{u, v\}
  2. 동차 선형시스템의 해집합으로서 e.g.{x:a1x=0,a2x=0,...,anx=0}e.g. \{x : a_1 \cdot x = 0, a_2 \cdot x = 0, ..., a_n \cdot x = 0\}

이를 이용해 두 평면의 교선을 찾아보겠습니다. 예시로 두 개의 평면 {[x,y,z]:[4,1,1][x,y,z]}=0\{[x, y, z] : [4, -1, 1] \cdot [x, y, z]\} = 0, {[x,y,z]:[0,1,1][x,y,z]=0}\{[x, y, z] : [0, 1, 1] \cdot [x, y, z] = 0\}가 있습니다. 각 평면은 우변이 00인 선형시스템의 해집합으로 표현되어 있습니다. 교집합을 구성하는 점들의 집합은 다음과 같습니다.

{[x,y,z]:[4,1,1][x,y,z]}=0,[0,1,1][x,y,z]=0}\{[x, y, z] : [4, -1, 1] \cdot [x, y, z]\} = 0, [0, 1, 1] \cdot [x, y, z] = 0\}

교선을 그리기 위해서는 벡터의 생성으로 나타내는 것이 도움이 됩니다. 교선은 두 평면을 모두 지나므로 두 평면의 법선벡터로부터 수직입니다. 따라서 벡터의 외적을 이용해

ijk411011=1i2j+2k\begin{vmatrix} i & j & k \\ 4 & -1 & 1 \\ 0 & 1 & 1 \end{vmatrix} = -1i - 2j + 2k

생성자 벡터 [1,2,2][-1, -2, 2]를 구할 수 있습니다. 두 평면과 교선을 직접 그려보겠습니다. matplotlib에서 ax.plot3D 프로시저를 이용해 삼차원 공간안에 직선을 그릴 수 있는데 이때 직선의 두 점을 매개변수로 요구합니다. 두 점을 구하기 위해서 두 평면 모두 원점을 지난다는 사실을 이용할 수 있습니다 ([4,1,1][0,0,0]=0,[0,1,1][0,0,0]=0\because [4, -1, 1] \cdot [0, 0, 0] = 0, [0, 1, 1] \cdot [0, 0, 0] = 0). 두 평면의 교선 역시 원점을 지나므로 생성자 벡터에 두 개의 스칼라곱한 벡터를 이용해 두 점을 구하고 이를 교선으로 그릴 수 있습니다.

# 평면
x, y = np.meshgrid(range(-2, 8), range(10))
z1 = -4 * x + y
z2 = -1 * y

plt.figure()
ax = plt.subplot(projection='3d')
ax.plot_surface(x, y, z1)
ax.plot_surface(x, y, z2)

# 교선의 방향벡터 [ -2, -4, 4 ]
ax.plot3D([ -2, 8 ], [ -4, 16 ], [ 4, -16 ], linewidth=3)
plt.show()

한가지 문제를 더 풀어보겠습니다. 이번에는 꼭지점 세 개 u1=[1,1,1]u_1 = [1,1,1], u2=[2,2,3]u_2 = [2,2,3], u3=[1,3,0]u_3 = [-1, 3, 0]을 갖는 삼각형과 점 p=[2.2,0.8,0.7]p = [-2.2, 0.8, -0.7]를 지나고 방향벡터가 d=[1.55,0.65,0.7]d = [1.55, 0.65, -0.7]인 직선이 있을때 삼각형과 직선의 교점을 찾아 보겠습니다.

  • 삼각형 삼각형은 평면이므로 벡터의 생성으로서, 선형시스템의 해집합으로서 나타낼 수 있습니다. 삼각형이 포함된 평면은 두 개의 생성 벡터 u2u1=u1u2u_2 - u_1 = \vec{u_1u_2}u3u1=u1u3u_3 - u_1 = \vec{u_1u_3}의 생성 Span{u1u2,u1u3}Span\{\vec{u_1u_2}, \vec{u_1u_3}\}입니다. 따라서 u1+Span{u1u2,u1u3}u_1 + Span\{\vec{u_1u_2}, \vec{u_1u_3}\}입니다. 또 집합 {u:[5,3,4]u=4}\{u : [-5,-3,4] \cdot u = 4\}의 해집합입니다.(벡터 [5,3,4][-5,-3,4]를 구하는 과정은 세점을 지나는 평면의 방정식을 구할 때처럼 외적을 이용하면 됩니다.) 법선 벡터 [5,3,4][-5,-3,4]ll이라 하겠습니다.
  • 직선 직선 위의 한 점과 방향벡터를 알고 있으므로 아핀공간의 표현으로서 {p+v:vSpan{d}}\{p + v : v \in Span\{d\}\}와 같이 쓸 수 있습니다. 다시 쓰면 {p+αd:αR}\{p + \alpha d : \alpha \in \Bbb{R}\}와 같습니다.

삼각형과 직선이 한 점에서 만난다면 집합 {u:lu=4}\{u : l \cdot u = 4\}의 한 원소 xxx=p+αdx = p + \alpha d을 만족합니다. 따라서 해벡터 xx에 대해 두 개의 식을 만들 수 있습니다.

x=p+αdlx=4\begin{aligned} x &= p + \alpha d \\ l \cdot x &= 4 \end{aligned}

α\alpha를 알면 해벡터 xx를 구할 수 있습니다. 첫번째 식의 xx를 두번째 식에 대입하고 정리합니다. 계산과정을 코드로 작성해 보겠습니다.

from vecutil import list2vec

l = list2vec([-5, -3, 4])			# 평면의 법선벡터
p = list2vec([-2.2, 0.8, 3.1])		# 직선의 한점
d = list2vec([1.55, 0.65, -0.7])	# 직선의 방향벡터
b = 4								# 평면 방정식의 우변
alpha = (b - l * p) / (l * d)
x = alpha * d + p

>>> print(x)
                 0                   1                   2
----------------------------------------------------------
0.8999999999999999                 2.1  1.7000000000000002

교점 [0.9,2.1,1.7][0.9,2.1,1.7]을 구했습니다. 실제 삼각형과 직선, 교점을 그려보겠습니다.

from mpl_toolkits.mplot3d.art3d import Poly3DCollection

# 삼각형
x = [ 1, 2, -1 ]
y = [ 1, 2, 3 ]
z = [ 1, 3, 0 ]
verts = [list(zip(x, y, z))]

# 직선
origin = [-2.2, 0.8, 3.1 ]
X, Y, Z = zip(origin)
V = np.array([
    [ 1.55, .65, -0.7 ]
])
V *= 3

plt.figure()
ax = plt.subplot(projection='3d')
ax.set_xlim3d(-1, 2)
ax.set_ylim3d(1, 3)
ax.set_zlim3d(0, 3)
ax.quiver(X, Y, Z, V[:, 0], V[:, 1], V[:, 2], linewidths=1, color='r')
ax.add_collection3d(Poly3DCollection(verts))
ax.scatter([0.9], [2.1], [1.7], color='g', s=100) # 교점
plt.show()





선형시스템에 대응하는 동차 선형시스템

u1u_1을 선형시스템의 해라고 하겠습니다.

a1u1=β1a2u1=β2...anu1=βn\begin{aligned} a_1 \cdot u_1 &= \beta_1 \\ a_2 \cdot u_1 &= \beta_2 \\ &. \\ &. \\ &. \\ a_n \cdot u_1 &= \beta_n \end{aligned}

이 때 u1u_1과 다른 벡터 u2u_2도 선형시스템의 해라면 다음 식들이 성립할 것입니다.

a1(u2u1)=β1β1=0a2(u2u1)=β2β2=0...an(u2u1)=βnβn=0\begin{aligned} a_1 \cdot (u_2 - u_1) &= \beta_1 - \beta_1 = 0 \\ a_2 \cdot (u_2 - u_1) &= \beta_2 - \beta_2 = 0 \\ &. \\ &. \\ &. \\ a_n \cdot (u_2 - u_1) &= \beta_n - \beta_n = 0 \end{aligned}

위 선형시스템은 동차 선형시스템이고 해집합은 벡터공간 VV입니다. u2u1=vu_2 - u_1 = v라 치환해서 정리하면 아래와 같습니다.

a1v=0a2v=0...anv=0\begin{aligned} a_1 \cdot v &= 0 \\ a_2 \cdot v &= 0 \\ &. \\ &. \\ &. \\ a_n \cdot v &= 0 \end{aligned}

u2u_2가 원래의 선형시스템의 해가 될 필요충분조건은 u2u1u_2 - u_1, 즉 vv가 동차 선형시스템의 해집합 VV안에 있는 것입니다. 이것은 아래와 같이 말할 수 있습니다.

{원래의 선형시스템에 대한 해}={u1+v:vV}\{원래의\text{ }선형시스템에\text{ }대한\text{ }해\} = \{u_1 + v : v \in V\}

우변은 아핀공간입니다. 모든 선형시스템의 해집합은 아핀공간입니다.

한편 선형시스템이 해를 가질 때 해가 유일하게 될 필요충분조건은 대응하는 동차 선형시스템의 유일한 해가 영벡터일 때입니다. 선형시스템의 해집합 {u1+v:vV}\{u_1 + v : v \in V\}에 대해 vv가 영벡터일때 유일한 해 u1u_1만을 가지기 때문입니다.





체크섬 함수

체크섬은 송신된 자료가 무결한지 확인하는 검사 방법입니다. 대략적인 검사 절차 예는 다음과 같습니다.

  1. 0x250x25, 0x620x62, 0x3F0x3F, 0x520x52 바이트의 데이터를 수신합니다. 이때 수신자가 데이터를 무결하게 받았는지 여부를 검사해야 합니다.
  2. 데이터의 바이트를 모두 더합니다. 0x25+0x62+0x3F+0x52=0x1180x25 + 0x62 + 0x3F + 0x52 = 0x118
  3. 모두 더한 값을 2진수로 변환한 뒤 가장 앞 4비트를 버립니다. 0x118=0001 0001 1000(2)0001 1000(2)0x118 = 0001\text{ }0001\text{ }1000_{(2)} \to 0001\text{ }1000_{(2)}
  4. 4비트를 버린 수의 2의 보수를 구합니다. 이 숫자를 체크섬 바이트라고 합니다. 1110 1000(2)=0xE81110\text{ }1000_{(2)} = 0xE8
  5. 원래 데이터의 바이트 총합과 체크섬 바이트를 더한 후 가장 앞 4비트를 버리고 결과값을 확인합니다. 결과값이 0이라면 무결하고 아니면 에러가 있는 것입니다. 0x118+0xE8=0x200=0010 0000 0000(2)0000 0000(2)0x118 + 0xE8 = 0x200 = 0010\text{ }0000\text{ }0000_{(2)} \to 0000\text{ }0000_{(2)}

체크섬의 경우 검사 결과가 0이더라도 에러가 있을 수 있습니다. 예를 들어 데이터 수신 중 0x100=0001 0000 00000x100 = 0001\text{ }0000\text{ }0000바이트의 데이터를 잃어버려도 결과값은 0입니다. 파일 수신에 에러가 있지만 결과가 0이될 확률은 얼마나 될까요?

데이터의 바이트 총합을 n-비트 벡터 pp라 하고 오류가 있는 바이트 총합을 p+ep + e라 하겠습니다. 체크섬 바이트에 대해 각각의 체크섬 비트를 만드는 선형시스템이 아래와 같이 존재한다고 가정합니다.

a1p=β1a2p=β2...anp=βn\begin{aligned} a_1 \cdot p &= \beta_1 \\ a_2 \cdot p &= \beta_2 \\ & . \\ & . \\ & . \\ a_n \cdot p &= \beta_n \end{aligned}

p+ep + e가 선형시스템의 해가 되기 위해서는 대응하는 동차 선형시스템의 해집합 VV내에 (p+e)p(p + e) - p가 있어야 합니다. (p+e)p=e(p + e) - p = e이므로 아래와 같이 쓸 수 있습니다.

a1e=0a2e=0...ane=0\begin{aligned} a_1 \cdot e &= 0 \\ a_2 \cdot e &= 0 \\ & . \\ & . \\ & . \\ a_n \cdot e &= 0 \end{aligned}

ee가 동차 선형시스템의 해집합 VV내에 속하면 p+ep + e가 원래 선형시스템을 만족합니다. 이로써 짐작할 수 있는 것은 ee가 자명한 해 영벡터일 때(에러가 없을때) 원래 선형시스템을 만족합니다. 또는 영벡터가 아닌 eeVV내에 속할때(에러가 있지만 결과가 0일때) 원래 선형시스템을 만족합니다. 따라서 에러가 있어도 결과가 0이될 확률은

해집합 V내 벡터의 개수1n비트 벡터의 개수\frac{해집합 \text{ } V내 \text{ } 벡터의 \text{ } 개수 - 1}{n-비트 \text{ }벡터의 \text{ }개수}

입니다.





평면의 방정식을 벡터의 선형결합으로 나타내기

앞서 flat을 벡터의 생성으로서, 동차 선형시스템의 해집합으로서 표현하는 법을 보았습니다. 이번에는 평면의 방정식, 즉 해집합으로 표현가능한 식을 바탕으로 생성자 벡터들을 찾아보겠습니다.

aa, bb를 실수라 하고 방정식 z=ax+byz = ax + by가 있습니다. 두 개의 3-벡터 uu, vv에 대해 이 방정식을 만족하는 점들 [x,y,z][x,y,z]의 집합이 uu, vv의 선형결합들로 구성된 집합임을 어떻게 증명할 수 있을까요? 우선 방정식을 해집합의 표현으로 바꿔보겠습니다.

{[x,y,z]R3:z=ax+by}\{ [x,y,z] \in \Bbb{R}^3 : z = ax + by\}

위 표현을 통해 [x,y,z][x,y,z][x,y,ax+by][x,y,ax + by]로 바꿔 쓸 수 있습니다. [x,y,ax+by][x,y,ax + by]은 다시 다음과 같이 표현 가능합니다.

x[1,0,a]+y[0,1,b]x[1,0,a] + y[0,1,b]

그리고 이 식은 두 3-벡터의 선형결합입니다. u=[1,0,a]u = [1,0,a], v=[0,1,b]v = [0,1,b]

이번에는 원점을 지나지 않는 평면의 방정식입니다. aa, bb, cc를 실수라 하고 방정식 z=ax+by+cz = ax + by + c가 있습니다. 방정식을 만족하는 점들의 집합 [x,y,z][x,y,z]가 세 개의 3-벡터 uu, vv, ww의 선형결합들로 구성된 집합임을 증명해 보고자 합니다. 방정식 z=ax+by+cz = ax + by + c을 해집합 표현을 바꾸면

{[x,y,z]R3:z=ax+by+c}\{ [x,y,z] \in \Bbb{R}^3 : z = ax + by + c\}

이고 3-벡터 [x,y,ax+by+c][x,y,ax + by + c]로 쓸 수 있습니다. 따라서 해집합을 다음과 같은 선형결합으로 표현할 수 있습니다.

x[1,0,a] + y[0,1,b]+c[0,0,1]u=[1,0,a]v=[0,1,b]w=[0,0,1]\begin{aligned} x[1,0,a] \text{ } + & \text{ }y[0,1,b] + c[0,0,1] \\ u & = [1,0,a] \\ v & = [0,1,b] \\ w & = [0,0,1] \end{aligned}