선형대수를 공부하다 보면
가 반복해서 등장한다.
수치해석에서도 마찬가지다.
열전도, 변형, 유체, 전자기장과 같은 다양한 문제를 수치적으로 풀다 보면 거대한 행렬 $A$와 벡터 $x$, $b$가 등장한다.
왜 이렇게 많은 문제가 결국 $Ax=b$ 형태로 바뀌는 것일까?
그 이유를 이해하려면 연속적인 문제를 컴퓨터가 처리할 수 있는 유한한 문제로 바꾸는 과정, 즉 이산화(Discretization)를 볼 필요가 있다.
현실의 문제는 대개 연속적이다
예를 들어 막대 내부의 온도를 생각해보자.
막대의 온도는 몇 개의 점에만 존재하는 것이 아니라 공간 전체에서 정의된다.
즉
처럼 연속적인 함수로 표현된다.
공간의 모든 $x$에 대해 온도 값이 존재한다.
하지만 컴퓨터가 무한히 많은 점의 값을 모두 저장하고 계산할 수는 없다.
그래서 연속적인 문제를 몇 개의 대표 지점으로 나눈다.
연속 함수에서 유한한 벡터로
막대를 $n$개의 지점으로 나눈다면
대신
만 저장할 수 있다.
이를 하나의 벡터로 묶으면
이 된다.
여기서부터 연속 함수 문제가 벡터 문제로 바뀌기 시작한다.
미분도 이산화할 수 있다
많은 물리 문제는 미분방정식으로 표현된다.
간단한 예로
를 생각해보자.
컴퓨터는 미분 연산을 그대로 수행하기보다 주변 점의 값으로 근사할 수 있다.
예를 들어 중앙차분법을 사용하면
이다.
이를 원래 방정식에 대입하면
이고,
라는 하나의 선형식이 얻어진다.
각 지점의 관계를 모으면 연립방정식이 된다
이 식을 여러 지점에 대해 만들면
와 같은 연립방정식이 생긴다.
이를 행렬 형태로 정리하면
가 된다.
즉,
이다.
전체 흐름
이 과정을 한 줄로 정리하면 다음과 같다.
따라서 미분방정식이 갑자기 행렬로 변한 것이 아니다.
연속적인 문제를 유한한 점으로 나누고 각 점 사이의 관계를 식으로 나타낸 결과, 자연스럽게 행렬이 등장한 것이다.
그렇다면 $A$, $x$, $b$는 무엇을 의미할까?
세 기호는 수치해석에서 보통 다음 세 요소를 나타낸다.
1. $x$
우리가 구하려는 미지수다.
예를 들어
- 각 위치의 온도
- 물체의 변위
- 압력
- 전위
- 속도
등이 들어간다.
2. $A$
미지수들 사이의 관계를 나타낸다.
예를 들어
- 주변 점과의 연결 관계
- 미분 연산의 이산화
- 물질의 물리적 특성
- 메쉬의 연결 구조
등이 반영된다.
3. $b$
외부에서 주어진 조건이나 힘을 나타낸다.
예를 들어
- 외부 열원
- 외력
- 경계조건
- 입력 신호
등이 들어갈 수 있다.
미분방정식은 하나의 대표적인 예일 뿐이다
여기서 중요한 점은 수치해석에서 $Ax=b$가 등장하는 이유가 반드시 미분방정식 때문만은 아니라는 것이다.
미분방정식의 이산화는 매우 대표적인 예지만, 다른 문제들도 행렬 형태로 정리될 수 있다.
예를 들어
- 보간
- 최소제곱
- 회귀
- 최적화
- 유한요소법
- 회로 해석
- 데이터 fitting
등에서도 선형 시스템이 등장한다.
컴퓨터그래픽스와의 연결
이 구조는 컴퓨터그래픽스에서도 매우 자주 나타난다.
특히 물리 기반 시뮬레이션에서는 더욱 그렇다.
예를 들어 천을 여러 개의 점과 연결선으로 나누면, 각 정점의 움직임은 주변 정점과 연결되어 있다.
연속적인 천을 그대로 계산하는 대신
과 같은 유한한 정점 집합으로 바꾸고, 이들의 관계를 방정식으로 만든다.
그러면 결국 큰 선형 시스템
를 풀게 된다.
비슷한 방식으로
- Cloth Simulation
- Soft Body Simulation
- Elastic Deformation
- Heat Diffusion
- Poisson Equation
- FEM
등이 선형 시스템과 연결된다.
$Ax=b$를 푼다는 것은 무엇인가?
이제 다시 처음으로 돌아가보자.
에서 $x$를 구한다는 것은 단순히 미지수 몇 개를 계산하는 것이 아니다.
수치해석의 관점에서는
수많은 변수 사이에 얽혀 있는 관계를 동시에 만족시키는 상태를 찾는 것
이라고 볼 수 있다.
예를 들어 온도 문제라면
를 구하는 것은 곧 전체 공간의 온도 분포를 구하는 것이다.
실제 계산에서는 역행렬을 잘 사용하지 않는다
이론적으로 $A$가 invertible하다면
라고 쓸 수 있다.
하지만 실제 수치 계산에서는 보통 역행렬 $A^{-1}$ 전체를 구하지 않고, 필요한 해 $x$만 구한다.
역행렬을 만들면 현재의 $b$ 하나에 대한 해만 필요한데도, 가능한 모든 입력에 대한 변환 결과를 행렬 전체로 계산하고 저장하게 된다. 일반적인 밀집 행렬에서도 불필요한 연산과 메모리가 늘어나며, 이산화 문제처럼 $A$가 대부분 0인 희소행렬에서는 역행렬이 희소하지 않을 수 있어 메모리 부담이 특히 커진다.
대신 행렬의 구조에 맞는 방법을 사용해
를 푼다. 예를 들어 Gaussian Elimination과 LU Decomposition은 분해를 이용해 필요한 해를 구하고, 대칭 양의 정부호 행렬에는 Cholesky Decomposition을 쓸 수 있다. Conjugate Gradient는 같은 조건의 큰 희소 문제에서 역행렬을 만들지 않고 반복적으로 해를 구하는 방법이다.
따라서 여기서 “직접 푼다”는 말은 역행렬을 계산한다는 뜻이 아니라, 주어진 $b$에 대해 $Ax=b$의 해를 구한다는 뜻이다. 이렇게 하면 불필요한 계산을 줄이고, 큰 희소행렬의 구조도 활용할 수 있다. 역행렬을 이용한 계산이 언제나 부정확한 것은 아니지만, 해 하나만 필요하다면 보통 선형 시스템을 직접 푸는 편이 더 효율적이고 수치적으로도 유리하다.
해가 존재하는 것만으로 충분하지 않다
수치해석에서는 또 하나 중요한 문제가 있다.
수학적으로 해가 존재하고 유일하더라도, 실제 컴퓨터 계산에서는 안정적으로 구할 수 없는 경우가 있다.
예를 들어 $A$가 거의 singular한 경우에는 $b$가 아주 조금만 변해도 $x$가 크게 변할 수 있다.
에서
라는 작은 변화가
에서 매우 큰 변화로 이어질 수 있는 것이다.
이런 문제를 ill-conditioned problem이라고 한다.
따라서 수치해석에서는
해가 존재하는가?
뿐 아니라
그 해를 컴퓨터에서 얼마나 안정적으로 계산할 수 있는가?
도 중요하다.
선형대수와 수치해석의 차이
선형대수에서는 보통
의 구조와 해의 존재성, 유일성을 공부한다.
수치해석에서는 여기에서 한 단계 더 나아간다.
- 실제 컴퓨터에서 어떻게 풀 것인가
- 계산량은 얼마나 되는가
- 반올림 오차는 어떻게 누적되는가
- 해는 얼마나 안정적인가
- 큰 행렬을 효율적으로 어떻게 처리할 것인가
등을 다룬다.
마무리
세 글에서 계속 같은 식을 보았다.
하지만 관점은 조금씩 달랐다.
첫 번째 글에서는
라는 선형변환으로 보았다.
두 번째 글에서는 변환 과정에서 정보가 사라질 수 있고, 그 결과 역문제가 어려워질 수 있다는 점을 보았다.
세 번째 글에서는 현실의 연속적인 문제를 이산화하면 여러 개의 방정식이 생기고, 이를 행렬로 정리하면서 다시
가 등장한다는 것을 보았다.
결국 선형대수에서 배우는 $Ax=b$는 단순히 연립방정식을 풀기 위한 표기법이 아니다.
컴퓨터그래픽스와 수치해석을 포함해 수많은 문제를 표현하는 공통 언어에 가깝다.
이 관점을 가지고 보면 이후에 등장하는 행렬식, rank, inverse, least squares, eigenvalue, FEM 등의 개념도 서로 조금씩 연결되어 보이기 시작한다.