명징직조지훈 2022. 12. 19. 13:49

2022.12.15 - [미분방정식] - 4.5 대칭 행렬과 직교 행렬

 

4.5 대칭 행렬과 직교 행렬

m*n 행렬 A 에서 시작, A 의 행들이 A^T 의 열들이 되는 것을 A의 전치라고 한다. m*n 행렬은 주대각성분을 중심으로 뒤집힌다. 그러면 A^T 는 n*m 행렬이다. 곱 AB, AB 의 전치는 (AB)^T = B^T A^T 이다. 역행

teach-meaning.tistory.com

A = np.array(([1,2,6],[0,0,5]))
A
>>>
array([[1, 2, 6],
       [0, 0, 5]])
       
AT = A.T
AT
>>>
array([[1, 0],
       [2, 0],
       [6, 5]])
       
B = np.array(([1,2],[3,4],[5,6]))
B
>>>
array([[1, 2],
       [3, 4],
       [5, 6]])
       
A.dot(B).T
>>>
array([[37, 25],
       [46, 30]])
       
B.T.dot(A.T)
>>>
array([[37, 25],
       [46, 30]])

곱 AB : AB 의 전치는 B^T A^T 이다.

np.linalg.inv(AB).T
>>>
array([[-0.75 ,  1.15 ],
       [ 0.625, -0.925]])
       
np.linalg.inv(AB.T)
>>>
array([[-0.75 ,  0.625],
       [ 1.15 , -0.925]])

역행렬 A^-1 = A^-1 의 전치는 (A^-1)^T = (A^T)^-1 이다.

대칭 행렬 S = A^T A

대칭 행렬의 가장 큰 장점은 그들의 고윳값 lambda 와 고유벡터 x 에서 온다. 

대각 행렬은 실수인 고윳값과 수직인 고유벡터를 갖는다.

 

A = np.array(([1,2,6],[0,0,5]))
A
>>>
array([[1, 2, 6],
       [0, 0, 5]])
       
A.dot(AT)
>>>
array([[41, 30],
       [30, 25]])

A가 3*2 행렬이므로 시스템 Av = b 는 세 개의 방정식을 갖지만, 미지수는 오직 두 개 뿐이다. Av = b 의 가장 가까운 해를 구하기 위해 최소제곱해를 계산한다. 

차이 행렬

후방 차분 행렬 A

b_d_m_A = np.array(([1,0,0],[-1,1,0],[0,-1,1],[0,0,-1]))
b_d_m_A
>>>
array([[ 1,  0,  0],
       [-1,  1,  0],
       [ 0, -1,  1],
       [ 0,  0, -1]])
       
v = np.array(([v1],[v2],[v3]))
v
>>>
array([[v1],
       [v2],
       [v3]], dtype=object)
       
Av = b_d_m_A.dot(v)
Av
>>>
array([[v1],
       [-v1 + v2],
       [-v2 + v3],
       [-v3]])

차이 행렬 v 의 차들

선형대수학에서의 벡터 Av 는 미적분학의 dv/dx 와 대응한다. 

작은 x 가 x 앞으로 가는 전방 차분 [v(x+x)-(v(x)]/x 는 행렬 A 를 전치할 때 선형대수학에서 나타난다. 

하지만 처음 차분은 비대칭 anti-symmetic 이고, A^T 는 전방 차분에 -1 을 곱한 것이다. 

따라서 A^T w 는 -dw/dx 와 대응한다. 

3*4 행렬 w 의 차분

w = np.array(([w1],[w2],[w3],[w4]))
w
>>>
array([[w1],
       [w2],
       [w3],
       [w4]], dtype=object)
       
AT.dot(w)
>>>
array([[w1 - w2],
       [w2 - w3],
       [w3 - w4]])

이제 대칭 행렬 S = A^T A 를 살펴본다. 이는 3*3 행렬이다. A, A^T 가 1과 -1이 있는 첫 번째 차분이므로 

A^T A 는 -1, 2, -1 이 있는 두 번째 차분일 것이다.

두번째 차분

S = AT.dot(b_d_m_A)
S
>>>
array([[ 2, -1,  0],
       [-1,  2, -1],
       [ 0, -1,  2]])
       
S.dot(v)
>>>
array([[2*v1 - v2],
       [-v1 + 2*v2 - v3],
       [-v2 + 2*v3]])

S 의 주대각 성분은 2이다. A 의 각 열이 2를 만들기 때문이다. 

대각선 아래와 대각선 위는 -1 을 갖는데, 이는 A 의 열과 그 옆에 있는 열이 내적이기 때문이다.

행렬 L = A A^T 역시 중요하다. L 역시 대칭이다. 

하지만 S 와는 다르게 A 가 n 개의 열과 n+1 개의 행이 있을 때, L 의 크기는 n+1 * n+1 이다. 

L 에서 두 번째 차분, 새로운 경계 조건

L = b_d_m_A.dot(b_d_m_A.T)
L
>>>
array([[ 1, -1,  0,  0],
       [-1,  2, -1,  0],
       [ 0, -1,  2, -1],
       [ 0,  0, -1,  1]])

이 행렬은 역행렬이 없다. Lw = 0 인 벡터 w 는 모든 성분이 1인 벡터 w=(1,1,1,1) 이다. L 의 각 행을 더하면 0이 되고, 이는 Lw=0 을 만든다.

w = np.array(([1],[1],[1],[1]))
w
>>>
array([[1],
       [1],
       [1],
       [1]])
       
L.dot(w)
>>>
array([[0],
       [0],
       [0],
       [0]])