수치선형대수

행렬의 기초 개념

행렬에서 제일 중요한 두 문제는 연립방정식 Ax=bAx = b와 고유값문제 Ax=λxAx = \lambda x다. 우선 Ax=bAx = b를 푸는 방법을 알아보고 Ax=λxAx = \lambda x는 다음 장에서 다룬다.

왜 그러는지 모르겠지만 여기서는 AA를 행렬, AiA_i를 i번째 행벡터, AjA^j를 j번째 열벡터, AijA_i^jaija_{ij}원소라고 하자.
아니 행렬 거듭제곱은 어쩌려고 이딴 notation을
eAe^A는 행렬 테일러전개로 정의되는데

그럼 Ax=bAx = bAiA^i들의 선형결합으로 bb를 나타낼 수 있냐는 문제가 된다.
그럼 반대로 x=A1bx = A^{-1}b이므로 역행렬은 행벡터의 선형결합으로 x를 나타내는 방식이다?
A1=AadjdetAA^{-1} = \frac{A^{adj}}{\det A} adjugate 행렬도 행벡터의 선형결합을 의미하는거
그럼 행벡터 x 열벡터가 더 이쁘니까 AA1AA^{-1} 말고 A1AA^{-1}A로 써야한다??
Cramer's rule: xi=detAidetAx_i = \frac{\det A_i}{\det A}는 b에서 AiA^i로 내린 수직선이 만나는 점을 의미하는거다????
너무 추상적인 개념이니까 그냥 아래 리스트나 보도록 하자

  • 소행렬 AijA_{ij}는 i행, j열을 소거한 행렬
  • n×nn \times n은 정사각행렬 (square matrix)
  • a11,,anna_{11}, \ldots, a_{nn}은 주대각 (principal diagonal)
  • 주대각 아래쪽이 0이면 위삼각행렬 (upper triangular matrix, U), 주대각 위쪽이 0이면 아래삼각행렬 (lower triangular matrix, L)
  • 주대각이 아닌 모든 원소가 0이면 대각행렬 (diagonal matrix, D)
  • 주대각이 모두 같은 대각행렬은 스칼라행렬 (scalar matrix, S)
  • 그게 1이면 단위행렬 (unit matrix, I)
  • 행렬의 기본행연산: 두 행 교환, 상수곱, 한 행의 상수배 더함
  • 행 열 바꾸면 전치 (transpose)
  • 주대각 합은 트레이스 (trace)
  • xTyx^Ty는 두 벡터의 내적 (xyx \cdot y), xyTxy^T는 두 벡터의 외적

행렬식

  • detA2×2=adbc\det A_{2 \times 2} = ad - bc
  • 두 행 바꾸면 det 부호 바뀜
  • 한 행에 다른 행의 상수배를 더해도 det는 같음
  • 한 행에 상수배를 하면 행렬식도 상수배가 됨
  • det(sA)=sndetA\det(sA) = s^n \det A
  • detAB=detAdetB\det AB = \det A \det B
  • detAk=(detA)k\det A^k = (\det A)^k (k=1k=-1, 즉 역행렬일 때도 마찬가지)
  • detAT=detA\det A^T = \det A
  • detA=detA\det \overline{A} = \overline {\det A} (complex conjugate)
  • detL=detU=a11a22ann\det L = \det U = a_{11} a_{22} \cdots a_{nn}
  • detAadj=(detA)n1\det A^{adj} = (\det A)^{n-1} (Aadj=detAA1\because A^{adj} = \det A \cdot A^{-1})

Einstein notation: AixiA^ix_i처럼 ii가 중복될 경우 iAixi\sum_i A^ix_i를 의미하는 것 (즉 귀찮으면 시그마 생략함)

Crammer's rule: Ax=bAx = b의 양변에 AadjA^{adj}를 곱하면 IdetAx=AadjbI \cdot \det A x = A^{adj}b

역행렬

  • (A1)1=A(A^{-1})^{-1} = A
  • (AB)1=B1A1(AB)^{-1} = B^{-1}A^{-1}
  • (Ak)1=(A1)k(A^k)^{-1} = (A^{-1})^k
  • (sA)1=s1A1(sA)^{-1} = s^{-1}A^{-1}
  • A1=A1\overline{A}^{-1} = \overline{A^{-1}} (complex conjugate)
  • detA1=(detA)1\det A^{-1} = (\det A)^{-1}

c.f. A=ATA = A^T면 symmetric
A1=ATA^{-1} = A^T면 orthogonal
A=A1=ATA = A^{-1} = A^T면 householder..????
H=I2vvTH = I - 2vv^T인 행렬인데 수치선대에서 자주 쓴다고 함

가우스 소거, 가우스-조단 소거

기본행연산으로 삼각행렬 만들던가 II 만들던가

만들면 연립방정식 풀기 가능

근데 피봇팅 중요!!

제일 큰 숫자를 1행으로 땡겨오고 가우스 소거를 해야 오차가 줄어든다

반복법

Ax=bAx = b에서 j=1naijxj=bj\sum_{j=1}^n a_{ij}x_j = b_j
i번째 방정식만 보면 xi=1aii(bij=1,jinaijxj)x_i = \frac{1}{a_{ii}} \left( b_i - \sum_{j=1, j \neq i}^n a_{ij}x_j \right) 이므로 이걸 반복시키면 수렴함

수렴하려면 행렬이 대각지배성 aiij=1,jinaij|a_{ii}| \geq \sum_{j=1, j \neq i}^n |a_{ij}|을 가져야함
Scarborough 수렴조건이라고도 함

자코비 방식 (쓰레기):
xik+1=1aii(bij=1,jinaijxjk)x_i^{k+1} = \frac{1}{a_{ii}} \left( b_i - \sum_{j=1, j \neq i}^n a_{ij}x_j^k \right)

가우스 자이델 방식 (조금 나음):
xik+1=1aii(bij=1i1aijxjk+1j=i+1naijxjk)x_i^{k+1} = \frac{1}{a_{ii}} \left( b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{k+1} - \sum_{j=i+1}^{n} a_{ij}x_j^k \right)

이걸 좀 더 생각해서 xx^*를 컴퓨터처럼 현재 기억장소에 저장된 값이라고 생각하면 (?)

xik+1=1aii(bij=1i1aijxjk+1j=i+1naijxjk)=xik+1aii(bij=1i1aijxjk+1j=inaijxjk)=xik+1aii(bij=1naijxj)\begin{align*} x_i^{k+1} &= \frac{1}{a_{ii}} \left( b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{k+1} - \sum_{j=i+1}^{n} a_{ij}x_j^k \right) \\ &= x_i^k + \frac{1}{a_{ii}} \left( b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{k+1} - \sum_{j=i}^{n} a_{ij}x_j^k \right) \\ &= x_i^k + \frac{1}{a_{ii}} \left( b_i - \sum_{j=1}^{n} a_{ij}x_j^* \right) \end{align*}

즉 컴퓨터에서 더 쉽게 할 수 있다! 벡터 저장하는 변수 하나만 사용하면 계속 반복법 사용 가능

이완법

위에껄 대략 xik+1=xik+Δxkx_i^{k+1} = x_i^k + \Delta x^k이라고 쓸 수 있음

이완법은 수렴속도를 조절하기 위해서 이완계수를 도입하여 xik+1=xik+ωΔxkx_i^{k+1} = x_i^k + \omega \Delta x^k로 돌리는거임

0<ω<10 < \omega < 1이면 하향이완,
ω>1\omega > 1이면 상향이완
근데 ω2\omega \geq 2면 발산하므로 상향이완은 보통 1.3~1.5

물론 뭘 쓸지는 시행착오로 정해야 함

수치적 난점

행렬 수치해석 특) 개판임

  • A의 원소가 조금만 변해도 해가 크게 변함
  • 대각지배성 아니면 ㅈ됨
  • detAdetA1det A \cdot det A^{-1}이 1이 안 나옴
  • AA1AA^{-1}II가 안 나옴
  • (A1)1(A^{-1})^{-1}AA가 안 나옴
  • A1(A1)1A^{-1}(A^{-1})^{-1}II가 정말정말 안 나옴

다행히(?) 수학자들이 어떤 행렬이 불량조건을 갖는지 (즉 개판인지) 알아냄

대표적인 불량조건 행렬: 힐버트 행렬 (aij=1i+j1a_{ij} = \frac{1}{i + j - 1})
역행렬이 엄청 커짐!

불량조건의 정량화

행렬 정규(matrix norm) 아니 norm을 대체 왜 정규로 번역함
하여튼 행렬 norm을 정의하자

A=max1inj=1naij\|A\|_{\infty} = \max_{1 \leq i \leq n} \sum_{j=1}^{n} |a_{ij}|

으로 정의하면 행렬의 조건수 AA1\|A\|_{\infty}\|A^{-1}\|_{\infty}가 클수록 행렬이 불량하다

일반적으로 조건수가 10s10^s면 유효숫자도 ss개가 상실된다

3대각행렬과 TDMA

대각행렬은 대각에 하나
3대각행렬은 대각 위 아래로 하나가 더 있음

3장에서 반드시 알아야 할 것??

[a1c100b2a2c200b3a30000an][x1x2x3xn]=[d1d2d3dn]\begin{bmatrix} a_1 & c_1 & 0 & \cdots & 0 \\ b_2 & a_2 & c_2 & \cdots & 0 \\ 0 & b_3 & a_3 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0& \cdots & a_n \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ \vdots \\ x_n \end{bmatrix} = \begin{bmatrix} d_1 \\ d_2 \\ d_3 \\ \vdots \\ d_n \end{bmatrix}

aixi+bixi1+cixi+1=dia_ix_i + b_ix_{i-1} + c_ix_{i+1} = d_i를 풀어야 한다!
xi=Pixi+1+Qix_i = P_ix_{i+1} + Q_i같은 점화식이 있다고 가정하자.

  1. P1=c1a1,Q1=d1a1P_1 = -\frac{c_1}{a_1}, Q_1 = \frac{d_1}{a_1} (a1x1+c1x2=d1\because a_1x_1 + c_1x_2 = d_1)
  2. Pi=ciai+biPi1,Qi=dibiQi1ai+biPi1P_i = -\frac{c_i}{a_i + b_iP_{i-1}}, Q_i = \frac{d_i - b_iQ_{i-1}}{a_i + b_iP_{i-1}} (aixi+bixi1+cixi+1=dia_ix_i + b_ix_{i-1} + c_ix_{i+1} = d_i에다가 xi1=Pi1xi+Qi1x_{i-1} = P_{i-1}x_i + Q_{i-1} 대입)
  3. xn=Qnx_n = Q_n (cn=0\because c_n = 0)
  4. xi=Pixi+1+Qix_i = P_ix_{i+1} + Q_i로 나머지 x값들 다 구함

LU분해

이것도 반드시 알아야함

A=LUA = LU인 L, U 찾기
여담) 이게 되면 Ax=bAx=bLUx=bLUx=b니까 개쉬워짐

[a11a12a1na21a22a2nan1an2ann]=[l1100l21l220ln1ln2lnn][u11u12u1n0u22u2n00unn]\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} = \begin{bmatrix} l_{11} & 0 & \cdots & 0 \\ l_{21} & l_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ l_{n1} & l_{n2} & \cdots & l_{nn} \end{bmatrix}\begin{bmatrix} u_{11} & u_{12} & \cdots & u_{1n} \\ 0 & u_{22} & \cdots & u_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & u_{nn} \end{bmatrix}

사실 우변의 미지수가 더 많음 (좌변은 n2n^2개, 우변은 n2+nn^2 + n개)
그래서 nn개의 항은 값을 정해줘야 함

  • 크라우트(Crout): uii=1u_{ii} = 1
  • 두리틀(Dolittle): lii=1l_{ii} = 1
  • 촐레스키(Choleski): lii=uiil_{ii} = u_{ii}

크라우트 방식으로 구하면 방정식을 전부 만든 다음,
L의 첫 열, U의 첫 행, L의 두번째 열, U의 두번째 행... 이 순서대로 구하면 됨

기본행연산을 활용한 LU분해

두리틀 방식 lii=1l_{ii} = 1과 결과가 같음

  1. 행연산을 통해 A를 U로 만들고, 같은 행연산을 I에도 함
    이때 반드시 가우스 소거의 순서대로 해야함; 첫 번째 열을 맨 위 빼고 전부 0으로, 두 번째 열을 위 두개 빼고 전부 0으로, ...
  2. I에 행연산 적용시킨 행렬의 주대각을 제외한 나머지 원소의 부호를 뒤집으면 L이 됨

사실 마지막 과정은 기본행연산의 역행렬을 구한 것임
가우스 소거의 순서대로 하면 부호만 뒤집어도 역행렬이 됨

크라우트가 보고싶으면 먼저 이렇게 두리틀을 구한 다음 대각성분을 빼서 UUDUDU로 바꾸고 LDLDLL으로 바꾸면 됨

촐레스키 분해

사실 A=UTUA = U^TU 분해를 촐레스키 분해라고 부름

만약 A가 양의 정부호라면 (Positive definite, i.e. x0,xTAx>0\forall x \neq 0, x^TAx > 0) A=UTUA = U^TU로 유일하게 분해됨 번역 레전드네

유일하게 분해되므로 그냥 LU분해 방식을 쓰고 대각만 맞추면 된다
또는 크라우트 방법을 약간 조정해서 한번에 촐레스키를 구해도 됨

양의 정부호를 잘 몰라서 시험에는 안 나오지만 양의 정부호가 뭔지 수학자들 앞에서 아는척 할 수 있음

QR 분해

Q는 직교행렬 (orthogonal matrix, i.e. Q1=QTQ^{-1} = Q^T)
R은 사실 U인데 QU는 발음이 이상해서 QR라고 함

사실 Q를 구하는건 정규직교기저를 구하는 것과 같음
그람 슈미트를 사용해서 AA의 열벡터들의 정규직교기저를 구한다!

projv(a)=avvvv=avvvvproj_v(a) = \frac{a \cdot v}{v \cdot v} v = a \cdot \frac{vv}{v \cdot v}를 정의하자 vv가 대체 무슨 notation임 몰라요 그렇게 쓰래
사실 vvTvva\frac{vv^T}{v \cdot v} a여야 한다고 한다...
만약 단위벡터 u라면 proju(a)=(au)u=uuTaproj_u(a) = (a \cdot u)u = uu^T \cdot a

  1. u1=a1a1u_1 = \frac{a_1}{|a_1|}
  2. v2=a2u1u1Ta2=(Iu1u1T)a2v_2 = a_2 - u_1 u_1^T \cdot a_2 = (I - u_1u_1^T) a_2
  3. u2=v2v2u_2 = \frac{v_2}{|v_2|}
  4. v3=a3u1u1Ta3u2u2Ta3=(Iu1u1Tu2u2T)a3v_3 = a_3 - u_1 u_1^T \cdot a_3 - u_2 u_2^T a_3 = (I - u_1u_1^T - u_2u_2^T)a_3
  5. 위 과정 계속 반복

R은 QTAQ^TA를 계산해서 구하면 됨

곱하는 행렬을 PiP_i라고 하면 P1=IP_1 = I, Pi+1=PiuiuiTP_{i+1} = P_i - u_iu_i^T처럼 계산할 수 있다.

만약 QR분해가 된다면 Ax=bAx = bRx=QTbRx = Q^Tb로 바꿔서 풀 수 있다!
LU분해보다 더 쉽다