원점을 지나는 직선이자 벡터공간인 V를 벡터 a만큼 평행이동했을 때 다음과 같은 집합으로 표현할 수 있습니다.
{a+v:v∈V}
이러한 집합을 a+V로 줄여 쓸 수 있습니다.
세 점을 지나는 평면을 벡터공간의 평행이동으로 표현하고자 합니다. 같은 직선상에 있지 않은 세점 u1=[1,0,4.4],
u2=[0,1,4], u3=[0,0,3]가 있을때 이들을 지나는 평면은 벡터 u1u2, u1u3의 생성과 u1 만큼의 평행이동으로 만들어집니다. 정리하면 V=Span{u1u2,u1u3}일때 평면은 u1+V입니다. matplotlib으로 생성자와 평면을 직접 그려보겠습니다. 평면의 방정식은 벡터 u1u2, u1u3의 법선벡터를 구하고 세개의 점 중 아무거나 하나를 골라 구할 수 있습니다. u1u2=[−1,1,−0.4]이고 u1u3=[−1,0,−1.4] 이므로 법선벡터를 외적으로 구하면
∣∣∣∣∣∣∣i−1−1j10k−0.4−1.4∣∣∣∣∣∣∣=−1.4i−1j+1k
법선 벡터 [−1.4,−1,1]과 점 [1,0,4.4]를 이용하면 평면의 방정식 −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()
이전에 점 u와 v를 지나는 직선을 아핀결합으로 표현한 적 있었습니다.
{αu+βv:α,β∈R,α+β=1}
아핀결합의 정확한 정의는 선형결합 α1u1+α2u2+...+αnun에 대해 계수들의 합이 1인 경우입니다. 세 점을 지나는 평면의 경우 u1+V를 아핀결합 표현으로 바꿔 써 보겠습니다. V=Span{u1u2,u1u3}이므로 V에 있는 벡터들은 선형결합
α(u2−u1)+β(u3−u1)
으로 나타낼 수 있습니다. 위 식에 u1을 더하면
여기서 γ+α+β=1입니다. 따라서 u1+V는 u1, u2, u3의 아핀결합들로 구성된 집합입니다. 어떤 벡터 컬렉션의 모든 아핀결합으로 구성된 집합은 그 컬렉션의 아핀 hull 이라고 합니다.
e.g.{αu1+βu2+γu3:α∈R,β∈R,γ∈R,α+β+γ=1}
아핀공간은 벡터공간을 평행이동한 결과입니다. 즉 집합 A는 다음을 만족하는 벡터 a와 벡터공간 V가 있으면 아핀공간입니다.
A={a+v:v∈V}A=a+V로 쓸 수도 있습니다. 아핀공간과 아핀 hull 사이에는 어떤 관계가 있을까요? 임의의 벡터 u1,u2,...,un이 있을 때 다음이 성립합니다.
이를 이용해 두 평면의 교선을 찾아보겠습니다. 예시로 두 개의 평면 {[x,y,z]:[4,−1,1]⋅[x,y,z]}=0, {[x,y,z]:[0,1,1]⋅[x,y,z]=0}가 있습니다. 각 평면은 우변이 0인 선형시스템의 해집합으로 표현되어 있습니다. 교집합을 구성하는 점들의 집합은 다음과 같습니다.
{[x,y,z]:[4,−1,1]⋅[x,y,z]}=0,[0,1,1]⋅[x,y,z]=0}
교선을 그리기 위해서는 벡터의 생성으로 나타내는 것이 도움이 됩니다. 교선은 두 평면을 모두 지나므로 두 평면의 법선벡터로부터 수직입니다. 따라서 벡터의 외적을 이용해
∣∣∣∣∣∣∣i40j−11k11∣∣∣∣∣∣∣=−1i−2j+2k
생성자 벡터 [−1,−2,2]를 구할 수 있습니다. 두 평면과 교선을 직접 그려보겠습니다. matplotlib에서 ax.plot3D 프로시저를 이용해 삼차원 공간안에 직선을 그릴 수 있는데 이때 직선의 두 점을 매개변수로 요구합니다. 두 점을 구하기 위해서 두 평면 모두 원점을 지난다는 사실을 이용할 수 있습니다 (∵[4,−1,1]⋅[0,0,0]=0,[0,1,1]⋅[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], u2=[2,2,3], u3=[−1,3,0]을 갖는 삼각형과 점 p=[−2.2,0.8,−0.7]를 지나고 방향벡터가 d=[1.55,0.65,−0.7]인 직선이 있을때 삼각형과 직선의 교점을 찾아 보겠습니다.
삼각형
삼각형은 평면이므로 벡터의 생성으로서, 선형시스템의 해집합으로서 나타낼 수 있습니다. 삼각형이 포함된 평면은 두 개의 생성 벡터 u2−u1=u1u2와 u3−u1=u1u3의 생성 Span{u1u2,u1u3}입니다. 따라서 u1+Span{u1u2,u1u3}입니다. 또 집합 {u:[−5,−3,4]⋅u=4}의 해집합입니다.(벡터 [−5,−3,4]를 구하는 과정은 세점을 지나는 평면의 방정식을 구할 때처럼 외적을 이용하면 됩니다.) 법선 벡터 [−5,−3,4]는 l이라 하겠습니다.
직선
직선 위의 한 점과 방향벡터를 알고 있으므로 아핀공간의 표현으로서 {p+v:v∈Span{d}}와 같이 쓸 수 있습니다. 다시 쓰면 {p+αd:α∈R}와 같습니다.
삼각형과 직선이 한 점에서 만난다면 집합 {u:l⋅u=4}의 한 원소 x가 x=p+αd을 만족합니다. 따라서 해벡터 x에 대해 두 개의 식을 만들 수 있습니다.
xl⋅x=p+αd=4
α를 알면 해벡터 x를 구할 수 있습니다. 첫번째 식의 x를 두번째 식에 대입하고 정리합니다. 계산과정을 코드로 작성해 보겠습니다.
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)012----------------------------------------------------------0.89999999999999992.11.7000000000000002
교점 [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()
위 선형시스템은 동차 선형시스템이고 해집합은 벡터공간 V입니다. u2−u1=v라 치환해서 정리하면 아래와 같습니다.
a1⋅va2⋅van⋅v=0=0...=0
u2가 원래의 선형시스템의 해가 될 필요충분조건은 u2−u1, 즉 v가 동차 선형시스템의 해집합 V안에 있는 것입니다. 이것은 아래와 같이 말할 수 있습니다.
{원래의선형시스템에대한해}={u1+v:v∈V}
우변은 아핀공간입니다. 모든 선형시스템의 해집합은 아핀공간입니다.
한편 선형시스템이 해를 가질 때 해가 유일하게 될 필요충분조건은 대응하는 동차 선형시스템의 유일한 해가 영벡터일 때입니다. 선형시스템의 해집합 {u1+v:v∈V}에 대해 v가 영벡터일때 유일한 해 u1만을 가지기 때문입니다.
체크섬 함수
체크섬은 송신된 자료가 무결한지 확인하는 검사 방법입니다. 대략적인 검사 절차 예는 다음과 같습니다.
0x25, 0x62, 0x3F, 0x52 바이트의 데이터를 수신합니다. 이때 수신자가 데이터를 무결하게 받았는지 여부를 검사해야 합니다.
데이터의 바이트를 모두 더합니다. 0x25+0x62+0x3F+0x52=0x118
모두 더한 값을 2진수로 변환한 뒤 가장 앞 4비트를 버립니다.
0x118=000100011000(2)→00011000(2)
4비트를 버린 수의 2의 보수를 구합니다. 이 숫자를 체크섬 바이트라고 합니다.
11101000(2)=0xE8
원래 데이터의 바이트 총합과 체크섬 바이트를 더한 후 가장 앞 4비트를 버리고 결과값을 확인합니다. 결과값이 0이라면 무결하고 아니면 에러가 있는 것입니다.
0x118+0xE8=0x200=001000000000(2)→00000000(2)
체크섬의 경우 검사 결과가 0이더라도 에러가 있을 수 있습니다. 예를 들어 데이터 수신 중 0x100=000100000000바이트의 데이터를 잃어버려도 결과값은 0입니다. 파일 수신에 에러가 있지만 결과가 0이될 확률은 얼마나 될까요?
데이터의 바이트 총합을 n-비트 벡터 p라 하고 오류가 있는 바이트 총합을 p+e라 하겠습니다. 체크섬 바이트에 대해 각각의 체크섬 비트를 만드는 선형시스템이 아래와 같이 존재한다고 가정합니다.
a1⋅pa2⋅pan⋅p=β1=β2...=βn
p+e가 선형시스템의 해가 되기 위해서는 대응하는 동차 선형시스템의 해집합 V내에 (p+e)−p가 있어야 합니다. (p+e)−p=e이므로 아래와 같이 쓸 수 있습니다.
a1⋅ea2⋅ean⋅e=0=0...=0
e가 동차 선형시스템의 해집합 V내에 속하면 p+e가 원래 선형시스템을 만족합니다. 이로써 짐작할 수 있는 것은 e가 자명한 해 영벡터일 때(에러가 없을때) 원래 선형시스템을 만족합니다. 또는 영벡터가 아닌 e가 V내에 속할때(에러가 있지만 결과가 0일때) 원래 선형시스템을 만족합니다. 따라서 에러가 있어도 결과가 0이될 확률은
n−비트벡터의개수해집합V내벡터의개수−1
입니다.
평면의 방정식을 벡터의 선형결합으로 나타내기
앞서 flat을 벡터의 생성으로서, 동차 선형시스템의 해집합으로서 표현하는 법을 보았습니다. 이번에는 평면의 방정식, 즉 해집합으로 표현가능한 식을 바탕으로 생성자 벡터들을 찾아보겠습니다.
a, b를 실수라 하고 방정식 z=ax+by가 있습니다. 두 개의 3-벡터 u, v에 대해 이 방정식을 만족하는 점들 [x,y,z]의 집합이 u, v의 선형결합들로 구성된 집합임을 어떻게 증명할 수 있을까요? 우선 방정식을 해집합의 표현으로 바꿔보겠습니다.
{[x,y,z]∈R3:z=ax+by}
위 표현을 통해 [x,y,z]를 [x,y,ax+by]로 바꿔 쓸 수 있습니다. [x,y,ax+by]은 다시 다음과 같이 표현 가능합니다.
x[1,0,a]+y[0,1,b]
그리고 이 식은 두 3-벡터의 선형결합입니다. u=[1,0,a], v=[0,1,b]
이번에는 원점을 지나지 않는 평면의 방정식입니다. a, b, c를 실수라 하고 방정식 z=ax+by+c가 있습니다. 방정식을 만족하는 점들의 집합 [x,y,z]가 세 개의 3-벡터 u, v, w의 선형결합들로 구성된 집합임을 증명해 보고자 합니다. 방정식 z=ax+by+c을 해집합 표현을 바꾸면
{[x,y,z]∈R3:z=ax+by+c}
이고 3-벡터 [x,y,ax+by+c]로 쓸 수 있습니다. 따라서 해집합을 다음과 같은 선형결합으로 표현할 수 있습니다.