조건수

편집 역사 토론
수치해석 마지막 수정: 2026-07-11 04:05:11

1. 개요[편집]

조건수(condition number)는 입력의 상대오차가 출력의 상대오차로 얼마나 증폭되는지를 나타내는 수로, 문제 자체가 오차에 얼마나 민감한지를 정량화하는 지표다. 선형계 Ax=bA\mathbf{x} = \mathbf{b}의 경우 행렬 AA의 조건수는 보통

κ(A)=AA1\kappa(A) = \lVert A \rVert \, \lVert A^{-1} \rVert

로 정의된다. 여기서 \lVert \cdot \rVert는 어떤 행렬 노름이며, 노름을 무엇으로 잡느냐에 따라 κ1,κ2,κ\kappa_1, \kappa_2, \kappa_\infty 등이 나온다. 가장 자주 쓰이는 2-노름 조건수는 최대 특이값과 최소 특이값의 비, 즉 κ2(A)=σmax/σmin\kappa_2(A) = \sigma_{\max}/\sigma_{\min}과 같다.

핵심은 이거다. 조건수는 알고리즘의 흠이 아니라 문제의 성질이다. 아무리 정교한 솔버를 써도, 아무리 정밀한 컴퓨터를 써도, 문제 자체가 악조건이면 정확한 답을 얻기 어렵다. “일단 돌려” 봤는데 답이 이상하다면, 솔버를 의심하기 전에 조건수부터 재보는 게 국룰이다.1

2. 왜 오차가 증폭되는가[편집]

선형계 Ax=bA\mathbf{x} = \mathbf{b}에서 우변 b\mathbf{b}에 작은 섭동 δb\delta\mathbf{b}가 생겼다고 하자. 그러면 해에도 섭동 δx\delta\mathbf{x}가 생기는데, 이 둘의 상대크기 사이에는 다음 부등식이 성립한다.

δxxκ(A)δbb\frac{\lVert \delta\mathbf{x} \rVert}{\lVert \mathbf{x} \rVert} \le \kappa(A) \, \frac{\lVert \delta\mathbf{b} \rVert}{\lVert \mathbf{b} \rVert}

즉 입력의 상대오차가 최악의 경우 κ(A)\kappa(A)배까지 뻥튀기되어 출력에 나타난다. 행렬 AA 자체에 오차 δA\delta A가 있을 때도 비슷한 형태의 상한이 성립한다.

경험칙 하나. 배정밀도 부동소수점 연산에서 유효자릿수는 약 16자리인데, κ(A)10k\kappa(A) \approx 10^k이면 해에서 대략 kk자리를 손해 본다고 보면 된다. κ=1016\kappa = 10^{16}쯤 되면 유효숫자가 통째로 날아가서 답을 신뢰할 수 없다. 이럴 때 컴퓨터가 뱉는 숫자는 답이 아니라 그냥 반올림오차의 예술 작품이다.

3. 잘 정의된 문제와 악조건 문제[편집]

조건수가 1에 가까우면 잘 조건화된(well-conditioned) 문제라 하고, 매우 크면 악조건(ill-conditioned) 문제라 한다. 직교행렬은 κ2=1\kappa_2 = 1로 조건수의 이상향인데, 이 때문에 QR 분해처럼 직교변환을 쓰는 알고리즘이 수치적으로 안정적이다.

악조건의 교과서적 예가 힐베르트 행렬(Hilbert matrix)이다. 성분이 Hij=1/(i+j1)H_{ij} = 1/(i+j-1)인 이 얌전해 보이는 행렬은 크기가 조금만 커져도 조건수가 지수적으로 폭발한다. n=10n=10이면 벌써 κ1013\kappa \approx 10^{13}에 달해서, 이 정도면 배정밀도로도 답이 걸레가 된다.2

한 가지 흔한 오해를 짚자. 조건수는 행렬식과 다르다. 행렬식이 작다고 악조건인 것도, 크다고 well-conditioned인 것도 아니다. 예컨대 0.1×I0.1 \times I 같은 대각행렬은 행렬식이 아주 작지만 조건수는 1이다. 특이(singular)에 “얼마나 가까운지”를 재는 진짜 척도는 행렬식이 아니라 최소 특이값이다.

4. 비선형 문제와 잔차의 함정[편집]

조건수 개념은 선형계에만 국한되지 않는다. 일반적인 함수 ff의 (상대) 조건수는 입력 변화에 대한 출력 변화의 민감도로 정의되며, 미분가능한 경우 자코비안 행렬의 크기와 직결된다. 뉴턴-랩슨법으로 비선형 방정식을 풀 때 매 반복에서 푸는 선형계의 계수행렬이 바로 자코비안인데, 이 자코비안이 악조건이면 뉴턴 스텝 자체가 부정확해진다.

여기서 초보들이 자주 빠지는 함정. 잔차(residual)가 작다고 해가 정확한 것은 아니다. 근사해 x^\hat{\mathbf{x}}의 잔차 r=bAx^\mathbf{r} = \mathbf{b} - A\hat{\mathbf{x}}가 아무리 작아도, 실제 오차 x^x\hat{\mathbf{x}} - \mathbf{x}κ(A)\kappa(A)배까지 클 수 있다. 관계식으로 쓰면

x^xxκ(A)rb\frac{\lVert \hat{\mathbf{x}} - \mathbf{x} \rVert}{\lVert \mathbf{x} \rVert} \le \kappa(A)\, \frac{\lVert \mathbf{r} \rVert}{\lVert \mathbf{b} \rVert}

이다. 그래서 반복법에서 잔차만 보고 “수렴했다”고 선언했다가, 실제로는 해가 한참 어긋나 있는 참사가 벌어진다. 수렴은 신에게 맡긴다지만, 조건수는 사람이 챙겨야 한다.

5. 전처리기와의 관계[편집]

악조건 문제를 만났을 때 가장 직접적인 처방이 전처리기(preconditioner)다. 원래 계 Ax=bA\mathbf{x} = \mathbf{b}를 그냥 푸는 대신, AA와 비슷하면서 역행렬이 싼 행렬 MM을 골라

M1Ax=M1bM^{-1} A \mathbf{x} = M^{-1} \mathbf{b}

를 푼다. 목표는 단 하나, κ(M1A)\kappa(M^{-1}A)κ(A)\kappa(A)보다 훨씬 작게 만드는 것이다. 조건수가 줄면 크리로프 부분공간법(CG, GMRES 등)의 수렴 속도가 극적으로 빨라진다. 실제로 공액구배법(CG)의 수렴 반복 횟수는 대략 κ\sqrt{\kappa}에 비례하기 때문에,3 조건수를 100분의 1로 줄이면 반복이 10분의 1로 줄어드는 셈이다.

전처리기 설계란 결국 “M1M^{-1}을 쉽게 곱할 수 있으면서도 M1AM^{-1}A가 항등행렬에 가깝게” 만드는 줄타기다. 촐레스키 분해 기반의 불완전 촐레스키(IC), LU 분해 기반의 불완전 LU(ILU), 그리고 다중격자법이 대표적인 전처리 전략이다. 희소행렬이 나오는 유한차분법·갤러킨 방법 이산화 계에서는 이 조합이 사실상 표준이다.

6. 조건수를 다루는 실전 감각[편집]

  • 재봐라. 대부분의 수치 라이브러리(LAPACK의 gecon, MATLAB의 cond/rcond, NumPy의 numpy.linalg.cond)가 조건수 추정치를 제공한다. 전체 특이값 분해를 하지 않고도 역추정으로 싸게 근사값을 얻는다.
  • 스케일링을 의심하라. 변수마다 단위가 제각각(길이는 mm, 압력은 GPa)이면 행렬이 인위적으로 악조건이 된다. 행·열 스케일링만 잘 해도 조건수가 수십 배 나아지는 경우가 흔하다.
  • 정규방정식을 피하라. 최소자승법을 정규방정식 AAx=AbA^{\top}A\mathbf{x} = A^{\top}\mathbf{b}로 풀면 조건수가 κ(A)2\kappa(A)^2으로 제곱된다. 그래서 실무에서는 QR 분해특이값 분해로 직접 푸는 것이 정석이다.
  • 악조건은 병이 아니라 증상일 수 있다. 물리적으로 거의 종속인 두 방정식, 거의 특이한 강성행렬은 모델링 단계의 신호일 때가 많다. 조건수가 폭발하면 코드를 뒤지기 전에 문제 설정을 되돌아보는 게 빠르다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. “솔버 탓 → 격자 탓 → 컴퓨터 탓 → 결국 조건수 탓”의 5단계 애도를 거친 뒤에야 사람들은 조건수를 처음부터 재봤어야 했음을 깨닫는다. 킹받지만 국룰이다.

  2. 힐베르트 행렬은 다항식 최소자승 근사에서 자연스럽게 튀어나온다. 그래서 고차 다항식으로 데이터를 피팅하려다가 조건수 지옥을 맛본 사람이 한둘이 아니다. 보간과 근사에서 직교다항식을 쓰는 이유가 바로 이것.

  3. 정확히는 AA가 대칭 양정치일 때 CG의 오차가 (κ1κ+1)k\left(\frac{\sqrt{\kappa}-1}{\sqrt{\kappa}+1}\right)^k 비율로 줄어든다는 고전적 상한에서 나온다. 상한일 뿐이라 실제로는 고유값 분포에 따라 더 빠를 수도, 느릴 수도 있다.