4.5 대칭 행렬
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]])