Chapter 04

비선형 연립방정식과 다항식의 근

3장의 f(x)=0f(x) = 0은 미지수가 하나였습니다. 회로의 마디 전압, 로봇 팔의 관절 각, GPS 수신기의 위치와 시계 오차는 미지수가 여럿이고 방정식도 여럿입니다. 이 장은 F(x)=0\mathbf F(\mathbf x) = \mathbf 0을 푸는 법입니다. 도함수는 야코비안 행렬이 되고, 나눗셈은 선형계 풀기가 됩니다. 뉴턴 방법이 그대로 일반화되지만, 다차원에서는 근을 가둘 수 없으므로 출발점에서 멀 때 길을 잃지 않게 하는 장치(감쇠, 연속법)와 야코비안을 아끼는 방법(브로이든)이 필요합니다. 후반부는 특별한 비선형 방정식인 다항식을 다룹니다. 값을 싸게 계산하는 호너 방법, 근을 하나씩 떼어 내는 수축, 모든 근을 한꺼번에 주는 동반 행렬, 그리고 복소평면에서 뉴턴 방법이 그리는 프랙털입니다.

이 수식이 없었다면회로 시뮬레이터와 GPS 수신기

트랜지스터 수만 개짜리 칩을 만들기 전에 엔지니어는 SPICE 같은 회로 시뮬레이터로 동작을 확인합니다. 시뮬레이터가 맨 먼저 하는 일은 직류 동작점, 곧 모든 마디의 키르히호프 전류 법칙을 동시에 만족하는 전압을 찾는 일이고, 다이오드와 트랜지스터의 지수 특성 때문에 이것은 미지수 수만 개의 비선형 연립방정식입니다. 시뮬레이터는 이를 뉴턴–랩슨 방법으로 풉니다. 매 반복 거대한 희소 선형계(12장)를 풀고, 지수 함수가 폭주하지 않게 걸음을 제한합니다.

주머니 속 GPS 수신기도 같은 일을 합니다. 위성 네 개 이상까지의 의사거리를 재면, 수신기의 위치 세 좌표와 시계 오차 하나를 미지수로 하는 비선형 방정식이 생깁니다. 거리 (x−xi)2+⋯\sqrt{(x - x_i)^2 + \cdots}가 제곱근이라 선형이 아니고, 수신기는 이것을 매초 뉴턴(가우스–뉴턴) 반복 몇 번으로 풉니다.

F(x) = 0 (n개의 식)→야코비안으로 선형화→J(xₖ) sₖ = −F(xₖ), xₖ₊₁ = xₖ + sₖ→동작점·관절 각·위치

두 곡선의 교점

원과 지수 곡선이 만나는 곳

원 x2+y2=4x^2 + y^2 = 4와 곡선 y=1−exy = 1 - e^x은 두 점에서 만납니다. 둘 다 그래프로는 쉽게 보이지만, 식을 하나로 합쳐 xx만의 방정식으로 만들기는 번거롭고, 미지수가 셋, 백, 만 개가 되면 아예 불가능합니다. 방정식 여러 개를 동시에 고쳐 나가는 방법이 필요합니다.

미지수 nn개, 방정식 nn개를 벡터로 씁니다. x=(x1,…,xn)\mathbf x = (x_1, \dots, x_n), F(x)=(f1(x),…,fn(x))\mathbf F(\mathbf x) = (f_1(\mathbf x), \dots, f_n(\mathbf x))이고 F(x)=0\mathbf F(\mathbf x) = \mathbf 0을 푸는 것이 목표입니다. 이 장의 기본 예제는

F(x,y)=[x2+y2−4ex+y−1]=0\mathbf F(x, y) = \begin{bmatrix} x^2 + y^2 - 4 \\ e^x + y - 1 \end{bmatrix} = \mathbf 0
근은 r1=(1.0041687385, −1.7296372870)\mathbf r_1 = (1.0041687385,\ -1.7296372870)과 r2=(−1.8162640688, 0.8373677999)\mathbf r_2 = (-1.8162640688,\ 0.8373677999) 두 개다(아래에서 계산).

1차원과 결정적으로 다른 점이 하나 있습니다. 근을 가둘 수 없습니다. 1차원에서는 부호가 바뀌는 구간이 근을 보장했지만, 평면에서 f1f_1과 f2f_2의 부호 조합만으로는 두 곡선의 교점을 가두는 간단한 방법이 없습니다. 그래서 다차원의 근 찾기는 거의 모두 뉴턴 방법과 그 변형이고, 좋은 출발점과 전역 수렴 장치가 중요해집니다.

3장의 고정점 반복도 그대로 일반화됩니다. x=G(x)\mathbf x = \mathbf G(\mathbf x) 꼴로 고쳐 쓰고 반복하면, 고정점 근처에서 G\mathbf G의 야코비안 노름이 1보다 작을 때(더 정확히는 스펙트럼 반지름 ρ(G′(r))<1\rho(G'(\mathbf r)) \lt 1일 때) 선형으로 수렴합니다. 13장의 야코비·가우스–자이델 반복은 이 틀을 선형계에 쓴 것입니다.

다변수 뉴턴 방법과 야코비안

1차원 뉴턴 방법은 ff를 접선으로 바꿨습니다. 다변수에서는 각 fif_i를 접평면으로 바꿉니다(CalculusBook 13장: 접평면). 모든 fif_i의 1차 테일러 전개를 한꺼번에 쓰면 행렬 하나가 나옵니다.

정의 4.1 (야코비안 행렬) F:Rn→Rn\mathbf F: \mathbb R^n \to \mathbb R^n의 야코비안(Jacobian matrix)은 편도함수를 늘어놓은 n×nn\times n 행렬
J(x)=[∂f1/∂x1⋯∂f1/∂xn⋮⋮∂fn/∂x1⋯∂fn/∂xn]J(\mathbf x) = \begin{bmatrix} \partial f_1/\partial x_1 & \cdots & \partial f_1/\partial x_n \\ \vdots & & \vdots \\ \partial f_n/\partial x_1 & \cdots & \partial f_n/\partial x_n \end{bmatrix}
이다. ii번째 행은 ∇fi\nabla f_i이고, F(x+s)=F(x)+J(x)s+O(∥s∥2)\mathbf F(\mathbf x + \mathbf s) = \mathbf F(\mathbf x) + J(\mathbf x)\mathbf s + O(\|\mathbf s\|^2)이다.

선형 근사가 0이 되는 s\mathbf s를 찾으면 됩니다. F(xk)+J(xk)s=0\mathbf F(\mathbf x_k) + J(\mathbf x_k)\mathbf s = \mathbf 0, 곧 선형 연립방정식입니다.

정의 4.2 (다변수 뉴턴 방법) 어림값 x0\mathbf x_0에서
J(xk) sk=−F(xk),xk+1=xk+skJ(\mathbf x_k)\,\mathbf s_k = -\mathbf F(\mathbf x_k), \qquad \mathbf x_{k+1} = \mathbf x_k + \mathbf s_k
를 되풀이한다. 식으로는 xk+1=xk−J(xk)−1F(xk)\mathbf x_{k+1} = \mathbf x_k - J(\mathbf x_k)^{-1}\mathbf F(\mathbf x_k)이지만, 역행렬을 만들지 않고 선형계를 푼다(LU 분해, LinearBook: LU 분해).
xₖ xₖ₊₁ r f₁ = 0 f₂ = 0 점선: xₖ에서 f₁, f₂를 선형화한 직선 (접평면의 0 등고선) 두 직선의 교점이 다음 어림값
그림 4-1. 2변수 뉴턴 한 단계. 각 fif_i의 접평면이 높이 0에서 만드는 직선(점선)은 곡선 fi=0f_i = 0의 근사다. 두 직선의 교점, 곧 선형계 Js=−FJ\mathbf s = -\mathbf F의 해가 xk+1\mathbf x_{k+1}이다. 1차원에서 접선이 xx축과 만나는 점을 고른 것과 같은 생각이다.
function newton_system(F, J, x, tol, maxit)
  for k = 1 .. maxit
    Fx = F(x)
    if norm(Fx) <= tol then return x
    A  = J(x)                     // n x n, 편도함수 n^2개
    s  = lu_solve(A, -Fx)         // 역행렬 대신 LU: 약 (2/3) n^3 번 연산
    x  = x + s
    if norm(s) <= tol * (1 + norm(x)) then return x
  fail("수렴하지 않음")
정리 4.3 (다변수 뉴턴의 2차 수렴) F\mathbf F가 근 r\mathbf r 근처에서 연속 미분 가능하고, 야코비안이 립시츠 연속(∥J(x)−J(y)∥≤γ∥x−y∥\|J(\mathbf x) - J(\mathbf y)\| \le \gamma\|\mathbf x - \mathbf y\|)이며 J(r)J(\mathbf r)이 가역이면, r\mathbf r에 충분히 가까운 x0\mathbf x_0에서 뉴턴 방법은 수렴하고
∥xk+1−r∥≤γ ∥J(xk)−1∥ ∥xk−r∥2.\|\mathbf x_{k+1} - \mathbf r\| \le \gamma\,\|J(\mathbf x_k)^{-1}\|\,\|\mathbf x_k - \mathbf r\|^2.

증명의 핵심. ek=xk−r\mathbf e_k = \mathbf x_k - \mathbf r이라 하면 ek+1=ek−Jk−1F(xk)=Jk−1[Jkek−(F(xk)−F(r))]\mathbf e_{k+1} = \mathbf e_k - J_k^{-1}\mathbf F(\mathbf x_k) = J_k^{-1}\bigl[J_k\mathbf e_k - (\mathbf F(\mathbf x_k) - \mathbf F(\mathbf r))\bigr]. 적분형 평균값 정리 F(xk)−F(r)=∫01J(r+τek) dτ  ek\mathbf F(\mathbf x_k) - \mathbf F(\mathbf r) = \int_0^1 J(\mathbf r + \tau\mathbf e_k)\,d\tau\;\mathbf e_k를 넣으면 괄호 안은 ∫01[Jk−J(r+τek)] dτ ek\int_0^1 [J_k - J(\mathbf r + \tau\mathbf e_k)]\,d\tau\,\mathbf e_k이고, 립시츠 조건으로 크기가 γ2∥ek∥2\tfrac{\gamma}{2}\|\mathbf e_k\|^2 이하다. 근 근처에서 ∥Jk−1∥\|J_k^{-1}\|이 유계이므로 2차 수렴이다. ∎

상수에 ∥J−1∥\|J^{-1}\|이 들어 있다는 점이 1차원의 1/∣f′(r)∣1/|f'(r)|에 해당합니다. 야코비안이 특이 행렬에 가까우면(두 곡선이 거의 접하면) 수렴 반경이 좁고 근 자체의 조건수도 나쁩니다. 1차원 중근의 다차원판입니다.

예제 4.1 (2변수 뉴턴 손 계산) 위의 F\mathbf F를 x0=(1,−1)\mathbf x_0 = (1, -1)에서 풀어라. 야코비안은 J=[2x2yex1]J = \begin{bmatrix} 2x & 2y \\ e^x & 1 \end{bmatrix}이다.
  1. F(1,−1)=(−2, 0.7182818)\mathbf F(1, -1) = (-2,\ 0.7182818), J(1,−1)=[2−22.71828181]J(1, -1) = \begin{bmatrix} 2 & -2 \\ 2.7182818 & 1 \end{bmatrix}, det⁡J=2+2e=7.4366\det J = 2 + 2e = 7.4366.
  2. Js=(2,−0.7182818)J\mathbf s = (2, -0.7182818)을 풀면 s0=(0.0757657, −0.9242343)\mathbf s_0 = (0.0757657,\ -0.9242343), x1=(1.0757657, −1.9242343)\mathbf x_1 = (1.0757657,\ -1.9242343).
kxₖyₖ‖F(xₖ)‖‖xₖ − r₁‖
01−12.137.30×10⁻¹
11.075765685479980−1.9242343145200208.60×10⁻¹2.07×10⁻¹
21.009470792610993−1.7378448607830893.96×10⁻²9.77×10⁻³
31.004188579848761−1.7296532313345401.02×10⁻⁴2.55×10⁻⁵
41.004168738693554−1.7296372870860788.42×10⁻¹⁰2.27×10⁻¹⁰
51.004168738474659−1.72963728702587000
오차 지수가 −0.7,−2.0,−4.6,−9.6-0.7, -2.0, -4.6, -9.6으로 거의 두 배씩 자란다. (−1,1)(-1, 1)에서 출발하면 (−2,1)(-2, 1), (−1.8292,0.8416)(-1.8292, 0.8416), (−1.8163,0.8374)(-1.8163, 0.8374)을 거쳐 5번 만에 다른 근 r2\mathbf r_2에 닿는다.

비용을 세어 봅시다. 한 번의 뉴턴 반복은 F\mathbf F 한 번(nn개 함수), 야코비안 한 번(n2n^2개 편도함수), LU 분해 약 23n3\tfrac23 n^3 연산입니다. n=1000n = 1000이면 LU 분해만 수억 연산이라, 큰 문제에서는 야코비안의 희소 구조를 살리고(12장, 13장), 야코비안을 덜 자주 계산하는 방법(다음 절들)을 씁니다.

SIMULATOR

2변수 뉴턴: 두 등고선과 선형화 직선의 교점

f₁ = 0f₂ = 0뉴턴 경로선형화 직선
출발점 x₀ (끌기)—
xₖ—
‖F(xₖ)‖—
det J(xₖ)—
해볼 것: ① k = 1에서 점선 두 개(f₁, f₂의 선형화)의 교점이 다음 점이 되는 것을 확인하고, k를 올리며 표의 ‖F‖가 제곱으로 줄어드는 것을 보세요. ② 출발점을 (0.1, −0.1) 근처로 끌면 첫 걸음이 화면 밖 (9.5, −10.5)로 튑니다. '감쇠'를 켜면 걸음이 1/8로 줄어 가까운 근으로 갑니다(표의 t 열). ③ '끌개 영역 색칠'로 각 출발점이 어느 근으로 가는지 보세요. z³ = 1 꼴에서는 경계가 프랙털입니다(뒤의 뉴턴 프랙털 절). 모델: 등고선은 격자 위 부호 바뀜으로 그립니다.

감쇠 뉴턴: 직선 탐색으로 길 잃지 않기

한 걸음에 잔차가 3500배

예제의 F\mathbf F를 (0.1,−0.1)(0.1, -0.1)에서 풀면 뉴턴의 첫 걸음이 (9.55,−10.55)(9.55, -10.55)로 날아가 ∥F∥\|\mathbf F\|가 3.98에서 14041로 커집니다. 방향은 맞을지 모르는데 걸음이 너무 큰 것은 아닐까요? 1차원이라면 가둠 구간으로 막았겠지만 다차원에는 그런 울타리가 없습니다.

무엇을 기준으로 "나아졌다"고 할지 정해야 합니다. 자연스러운 잣대는 잔차의 크기, 곧 가치 함수(merit function) ϕ(x)=12∥F(x)∥2\phi(\mathbf x) = \tfrac12\|\mathbf F(\mathbf x)\|^2입니다. 근에서 ϕ=0\phi = 0이고 그 밖에서는 양수입니다. 다행히 뉴턴 방향은 언제나 ϕ\phi를 줄이는 방향입니다.

정리 4.4 (뉴턴 방향은 하강 방향) J(x)J(\mathbf x)가 가역이고 F(x)≠0\mathbf F(\mathbf x) \ne \mathbf 0이면 뉴턴 걸음 s=−J−1F\mathbf s = -J^{-1}\mathbf F는
∇ϕ(x)⋅s=(JTF)⋅s=FTJ (−J−1F)=−∥F∥2<0\nabla\phi(\mathbf x)\cdot\mathbf s = (J^T\mathbf F)\cdot\mathbf s = \mathbf F^T J\,(-J^{-1}\mathbf F) = -\|\mathbf F\|^2 \lt 0
를 만족한다. 따라서 충분히 작은 t>0t > 0에 대해 ϕ(x+ts)<ϕ(x)\phi(\mathbf x + t\mathbf s) \lt \phi(\mathbf x)이다.

그러니 방향은 그대로 두고 걸음 길이 t∈(0,1]t \in (0, 1]만 고르면 됩니다. t=1t = 1부터 시도해서 잔차가 충분히 줄지 않으면 반으로 줄이는 직선 탐색(line search, backtracking)이 표준입니다. "충분히"의 기준이 아르미호 조건으로, 15장 최적화에서 다시 만납니다.

function damped_newton(F, J, x, tol)
  loop
    Fx = F(x);  if norm(Fx) <= tol then return x
    s  = lu_solve(J(x), -Fx)
    t  = 1
    while norm(F(x + t*s)) > (1 - 1e-4 * t) * norm(Fx)   // 아르미호식 충분 감소
      t = t / 2
      if t < 1e-10 then fail("‖F‖의 국소 최솟값에 갇힘?")
    x = x + t * s                // 근 근처에서는 t = 1, 곧 순수 뉴턴
예제 4.2 (감쇠가 바꾸는 것) x0=(0.1,−0.1)\mathbf x_0 = (0.1, -0.1), ∥F(x0)∥=3.980\|\mathbf F(\mathbf x_0)\| = 3.980. 뉴턴 걸음 s=(9.4505,−10.4495)\mathbf s = (9.4505, -10.4495).
  1. t=1t = 1: ∥F∥=14041\|\mathbf F\| = 14041. t=0.5t = 0.5: 127.5. t=0.25t = 0.25: 12.37. t=0.125t = 0.125: 1.254 < 3.98이므로 받아들인다. x1=(1.2813,−1.4062)\mathbf x_1 = (1.2813, -1.4062).
  2. 그 뒤로는 t=1t = 1이 계속 받아들여져 순수 뉴턴이 된다. ∥F∥\|\mathbf F\|: 1.25, 0.200, 3.4×10−33.4\times10^{-3}, 1.5×10−61.5\times10^{-6}, 3.2×10−133.2\times10^{-13}, 0. 6번 만에 가까운 근 r1\mathbf r_1에 닿는다.
  3. 감쇠 없는 뉴턴은 (9.55,−10.55)(9.55, -10.55), (8.55,−2.05)(8.55, -2.05), (7.55,11.68)(7.55, 11.68), …으로 크게 돌아다니다가 16번째에 먼 근 r2\mathbf r_2에 닿는다.
감쇠는 만능이 아니다. 프로이덴슈타인–로스 시험 문제 f1=−13+x+((5−y)y−2)yf_1 = -13 + x + ((5 - y)y - 2)y, f2=−29+x+((y+1)y−14)yf_2 = -29 + x + ((y + 1)y - 14)y(근 (5,4)(5, 4))를 (0.5,−2)(0.5, -2)에서 풀면, 감쇠 뉴턴은 y≈−0.897y \approx -0.897의 골짜기에 갇혀 60번 뒤에도 ∥F∥=7.6\|\mathbf F\| = 7.6에서 멈춘다. ϕ\phi의 국소 최솟값 근처에서는 JJ가 특이에 가까워 하강 방향이 거의 쓸모없어진다. 이때는 신뢰 영역 방법, 연속법, 다른 출발점이 필요하다.

브로이든 방법: 야코비안 없이

편도함수 2500개를 매번?

미지수가 50개면 야코비안은 편도함수 2500개입니다. 식으로 미분하기 어려우면 차분으로 근사하는데, 그러려면 F\mathbf F를 한 번 반복에 51번 계산해야 합니다. 1차원 할선법이 도함수를 지난 두 점의 기울기로 바꿨듯이, 지난 걸음의 정보로 야코비안을 고쳐 쓸 수 있을까요?

1차원 할선 기울기 bk+1b_{k+1}는 bk+1(xk+1−xk)=f(xk+1)−f(xk)b_{k+1}(x_{k+1} - x_k) = f(x_{k+1}) - f(x_k)를 만족했습니다. 다차원판은 sk=xk+1−xk\mathbf s_k = \mathbf x_{k+1} - \mathbf x_k, yk=F(xk+1)−F(xk)\mathbf y_k = \mathbf F(\mathbf x_{k+1}) - \mathbf F(\mathbf x_k)에 대한 할선 조건(secant condition)

Bk+1 sk=ykB_{k+1}\,\mathbf s_k = \mathbf y_k
nn개의 식으로 n2n^2개 성분을 정할 수 없으므로, 할선 조건을 만족하는 행렬 가운데 BkB_k에서 가장 적게 바꾼 것을 고른다.
정리 4.5 (브로이든 갱신) 할선 조건 Bsk=ykB\mathbf s_k = \mathbf y_k를 만족하는 행렬 가운데 프로베니우스 노름 ∥B−Bk∥F\|B - B_k\|_F를 최소로 하는 것은
Bk+1=Bk+(yk−Bksk) skTskTskB_{k+1} = B_k + \frac{(\mathbf y_k - B_k\mathbf s_k)\,\mathbf s_k^T}{\mathbf s_k^T\mathbf s_k}
이다. 이 계수 1 수정(rank-one update)으로 반복하는 방법을 브로이든 방법(Broyden's method)이라 한다.

증명의 핵심. 할선 조건을 만족하는 임의의 BB에 대해 Bk+1−Bk=(B−Bk)ssTsTsB_{k+1} - B_k = (B - B_k)\dfrac{\mathbf s\mathbf s^T}{\mathbf s^T\mathbf s}이고, ssT/sTs\mathbf s\mathbf s^T/\mathbf s^T\mathbf s는 사영 행렬이라 노름이 1이다. 따라서 ∥Bk+1−Bk∥F≤∥B−Bk∥F\|B_{k+1} - B_k\|_F \le \|B - B_k\|_F. s\mathbf s에 수직인 방향에서는 Bk+1B_{k+1}이 BkB_k와 똑같이 작용한다. ∎

브로이든 방법은 매 반복 F\mathbf F를 한 번만 계산합니다. 셔먼–모리슨 공식으로 B−1B^{-1}을 직접 갱신하면 선형계 풀기도 O(n2)O(n^2)으로 줄어듭니다. 대가는 수렴 속도입니다. 근 근처에서 BkB_k가 참 야코비안으로 수렴한다는 보장은 없지만, 걸음 방향에서만큼은 충분히 정확해져 초선형으로 수렴한다는 것이 알려져 있습니다(2차는 아니다). 같은 이유로 처음 B0B_0이 나쁘면(예: 단위 행렬) 느려지거나 실패할 수 있어, 보통 B0B_0만은 차분 야코비안으로 만듭니다.

예제 4.3 (브로이든 대 뉴턴) 예제 4.1과 같은 문제, x0=(1,−1)\mathbf x_0 = (1, -1), B0=J(x0)B_0 = J(\mathbf x_0).
  1. 첫 걸음은 뉴턴과 같다: x1=(1.0757657,−1.9242343)\mathbf x_1 = (1.0757657, -1.9242343). 그 뒤로는 JJ를 다시 계산하지 않고 갱신한다.
  2. 오차 ∥xk−r1∥\|\mathbf x_k - \mathbf r_1\|: 7.30×10−17.30\times10^{-1}, 2.07×10−12.07\times10^{-1}, 4.06×10−24.06\times10^{-2}, 2.10×10−32.10\times10^{-3}, 9.13×10−69.13\times10^{-6}, 5.62×10−75.62\times10^{-7}, 1.05×10−81.05\times10^{-8}, 2.46×10−122.46\times10^{-12}, 00. 8번 반복. 오차 비율이 0.28, 0.20, 0.052, 0.0043, …로 0을 향하지만 한 번에 고르지 않다(0.062, 0.019로 되올라가기도 한다). 초선형 수렴의 전형이다.
  3. 마지막 B8=[2.068−3.4422.7260.999]B_8 = \begin{bmatrix} 2.068 & -3.442 \\ 2.726 & 0.999 \end{bmatrix}, 참 J(r1)=[2.008−3.4592.7301]J(\mathbf r_1) = \begin{bmatrix} 2.008 & -3.459 \\ 2.730 & 1 \end{bmatrix}. 가깝지만 같지는 않다.
비용(F\mathbf F 계산 횟수, 야코비안은 차분으로 계산한다고 할 때, ∥F∥<10−10\|\mathbf F\| \lt 10^{-10}까지): 2변수 문제에서 차분 뉴턴 5번 반복에 16회, 브로이든(B0B_0 차분) 7번 반복에 10회, 야코비안을 처음 것으로 고정한 코드 방법은 38번 반복에 41회. 미지수 20개인 브라투 문제(u′′+eu=0u'' + e^u = 0을 격자 20개로 나눈 것)에서는 차분 뉴턴 3번 반복에 64회, 브로이든 4번 반복에 25회다. 미지수가 많을수록 야코비안을 아끼는 효과가 커진다.
SIMULATOR

뉴턴 vs 차분 뉴턴 vs 브로이든: 반복 수와 계산 비용

가로축
뉴턴 (해석적 J)뉴턴 (차분 J)브로이든 (B₀ 차분)브로이든 (B₀ = I)코드 (J 고정)
10⁻¹⁰까지 F 계산: 차분 뉴턴—
브로이든—
코드—
‖B − J‖/‖J‖ (끝)—
해볼 것: ① 가로축을 'F 계산 수'로 바꾸고 브라투 n을 5 → 80으로 올려 보세요. 차분 뉴턴은 반복마다 n + 1번이 들어 오른쪽으로 밀려나지만, 브로이든은 거의 그대로입니다. ② B₀ = I(빨강)는 2변수에서는 결국 수렴하지만 브라투 문제에서는 실패합니다. 첫 행렬이 중요합니다. ③ λ를 3.4 근처로 올리면 해가 사라지는 접힘점(λ ≈ 3.51) 가까이라 J가 특이에 가까워지고 모든 방법이 느려집니다. 모델: 차분 간격 10⁻⁷(1 + |xⱼ|), ‖F‖ 로그 눈금.

다항식: 호너 방법

다항식 값 하나에 곱셈 몇 번?

p(x)=anxn+⋯+a1x+a0p(x) = a_n x^n + \cdots + a_1 x + a_0을 그대로 계산하면 xkx^k마다 곱셈 kk번, 모두 n(n+1)/2n(n+1)/2번입니다. 거듭제곱을 앞에서 이어 받아도 2n−12n - 1번이 듭니다. 뉴턴 방법은 반복마다 pp와 p′p'이 필요하고, 차수 수십의 다항식을 수백만 번 계산하는 일(그래픽스, 신호 처리, 라이브러리 함수 근사)도 흔합니다.

괄호를 안쪽부터 묶으면 됩니다. 2x4−3x3+x−5=(((2x−3)x+0)x+1)x−52x^4 - 3x^3 + x - 5 = (((2x - 3)x + 0)x + 1)x - 5. 이것이 호너 방법(Horner's method)입니다.

정리 4.6 (호너 방법과 조립제법) bn=anb_n = a_n, bk=ak+x0 bk+1b_k = a_k + x_0\,b_{k+1}(k=n−1,…,0k = n-1, \dots, 0)으로 계산하면 p(x0)=b0p(x_0) = b_0이고, 동시에
p(x)=(x−x0) q(x)+b0,q(x)=bnxn−1+bn−1xn−2+⋯+b1p(x) = (x - x_0)\,q(x) + b_0, \qquad q(x) = b_n x^{n-1} + b_{n-1}x^{n-2} + \cdots + b_1
이다. 곱셈 nn번, 덧셈 nn번이 든다. 같은 계산을 qq에 한 번 더 하면 p′(x0)=q(x0)p'(x_0) = q(x_0)이다.

증명. (x−x0)q(x)+b0(x - x_0)q(x) + b_0을 전개해 xkx^k의 계수를 비교하면 bk−x0bk+1=akb_k - x_0 b_{k+1} = a_k로 점화식과 같다. 미분하면 p′(x)=q(x)+(x−x0)q′(x)p'(x) = q(x) + (x - x_0)q'(x)이라 p′(x0)=q(x0)p'(x_0) = q(x_0). ∎

일반적인 다항식에 대해서는 곱셈 nn번보다 적게 쓰는 방법이 없다는 것이 증명되어 있습니다. 반올림 오차도 작아서, 계산값은 계수를 상대적으로 약 2nε2n\varepsilon만큼 흔든 다항식의 정확한 값입니다(후방 안정, 2장). 3장 예제 3.7의 (x−1)7(x - 1)^7 잡음은 호너의 잘못이 아니라 전개된 계수의 크기 ∑∣akxk∣=128\sum|a_k x^k| = 128이 값 ∣p(x)∣|p(x)|보다 엄청나게 크기 때문이었습니다.

function horner2(a, x)            // a[n], ..., a[0]: 높은 차수부터
  p = a[n]; d = 0
  for k = n-1 down to 0
    d = d * x + p                // q의 호너 → p'(x)
    p = p * x + a[k]             // p의 호너
  return (p, d)                  // 곱셈 2n번으로 p와 p'
예제 4.4 (조립제법과 뉴턴–호너) p(x)=2x4−3x3+0x2+x−5p(x) = 2x^4 - 3x^3 + 0x^2 + x - 5, x0=2x_0 = 2.
x⁴x³x²x1
계수 aₖ2−301−5
bₖ = aₖ + 2bₖ₊₁21255 = p(2)
cₖ = bₖ + 2cₖ₊₁251229 = p′(2)
  1. p(2)=5p(2) = 5, 몫 q(x)=2x3+x2+2x+5q(x) = 2x^3 + x^2 + 2x + 5. 확인: 32−24+2−5=532 - 24 + 2 - 5 = 5.
  2. p′(2)=q(2)=29p'(2) = q(2) = 29. 확인: p′=8x3−9x2+1p' = 8x^3 - 9x^2 + 1, 64−36+1=2964 - 36 + 1 = 29.
  3. 뉴턴 걸음 x1=2−5/29=1.8275862x_1 = 2 - 5/29 = 1.8275862. 계속하면 1.7857659, 1.7834986, 1.7834921400, 1.78349213996292. 매 반복이 호너 두 줄이다.
SIMULATOR

호너 방법 한 칸씩: 조립제법 표와 뉴턴–호너

p(x₀)—
p′(x₀)—
곱셈 수: 호너 / 그대로—
몫 q(x)—
해볼 것: ① '다음 칸'을 누르며 bk = ak + x₀·bk+1이 왼쪽에서 오른쪽으로 채워지는 것을 보세요. 마지막 칸이 p(x₀), 앞의 칸들이 몫의 계수입니다. ② '뉴턴 한 걸음'을 반복하면 x₀가 x₀ − p/p′로 옮겨 가며 근(그래프의 빨간 점)에 붙습니다. 근에 닿으면 마지막 칸이 0이 되고 몫이 수축된 다항식입니다. ③ 계수를 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, −1(차수 10)로 바꾸면 그대로 계산할 때 곱셈 55번, 호너 10번입니다. 모델: 그래프의 접선은 p′(x₀)로 그립니다.

수축: 근을 하나씩 떼어 내기와 그 오차

근 rr을 하나 찾으면 조립제법의 몫 q(x)=p(x)/(x−r)q(x) = p(x)/(x - r)은 차수가 하나 낮고 나머지 근을 모두 가집니다. 이제 qq의 근을 찾고, 또 나누고… 이렇게 차수를 줄여 가는 것을 수축(deflation)이라 합니다. 문제는 찾은 rr이 정확하지 않다는 데 있습니다. rr의 작은 오차가 qq의 계수를 흔들고, 그 흔들림이 다음 근들로 옮아갑니다.

윌킨슨(James H. Wilkinson)의 분석에 따르면 높은 차수부터 계수를 만드는 앞쪽 수축(조립제법)은 크기가 작은 근부터 떼어 낼 때 안정하고, 큰 근부터 떼면 작은 근들이 크게 망가질 수 있습니다. 실무에서는 두 가지를 더 합니다. ① 수축된 다항식에서 찾은 근을 원래 다항식에 대고 뉴턴 몇 번으로 다듬는다(polishing). ② 가능하면 수축 대신 아래의 동반 행렬처럼 모든 근을 한꺼번에 구한다.

예제 4.5 (수축 순서) 근이 1,12,14,…,2−151, \tfrac12, \tfrac14, \dots, 2^{-15}인 16차 다항식을 계수로 전개한 뒤, 뉴턴–호너와 조립제법 수축으로 근을 하나씩 구하라.
  1. 작은 근부터(매번 x0=0x_0 = 0에서 뉴턴): 2−15=3.05×10−52^{-15} = 3.05\times10^{-5}부터 1까지 차례로 나오고, 16개 모두의 상대 오차가 2.2×10−152.2\times10^{-15} 이하다.
  2. 큰 근부터(매번 x0=1+max⁡∣ak∣x_0 = 1 + \max|a_k|에서 뉴턴): 1, 0.5, 0.25, 0.125까지는 상대 오차 3.5×10−63.5\times10^{-6} 이하로 맞지만 다섯째가 0.06332(참값 0.0625, 1.3% 오차)이고, 그 뒤로는 −0.0273-0.0273, 0.6410.641, −0.623-0.623, −0.854-0.854, …\dots, 109.2109.2 같은 엉뚱한 값이 나온다. 수축된 다항식이 더 이상 원래 근을 갖지 않고(복소근이 생겨), 실수 출발점의 뉴턴이 1000번 안에 멈추지 못하는 단계도 생긴다.
  3. 큰 근부터 뗀 결과를 원래 다항식으로 다듬어도 소용없다. 엉뚱한 출발점에서 다듬은 뉴턴은 이미 찾은 근으로 다시 가 버려, 같은 근이 두 번 나오고 어떤 근은 빠진다.
SIMULATOR

수축 순서와 근의 오차: 작은 근부터 vs 큰 근부터

떼어 내는 순서
상대 오차 (근 k)실패 / 10⁻² 초과기계 엡실론
최대 상대 오차—
10⁻⁸보다 정확한 근—
떼어 낸 차례 (앞 6개)—
해볼 것: ① 2⁻ᵏ, n = 16에서 '큰 근부터'를 고르면 다섯째 근부터 막대가 치솟습니다. '작은 근부터'로 바꾸면 모두 10⁻¹⁵ 근처입니다. ② n을 12 → 14 → 15로 올려 큰 근부터 수축이 무너지기 시작하는 차수를 찾으세요. ③ '1, 2, …, n'은 근 자체의 조건수가 나쁜 윌킨슨형이라 순서와 상관없이 n이 커지면 정확도가 떨어집니다(2장). 모델: 뉴턴–호너, 상대 걸음 10⁻¹⁵에서 멈춤, 큰 근의 출발점은 1 + max|aₖ|.

동반 행렬: 모든 근을 고유값으로

방향을 거꾸로 생각해 봅시다. 행렬의 고유값은 특성 다항식의 근입니다. 그렇다면 주어진 다항식을 특성 다항식으로 갖는 행렬을 만들고, 그 고유값을 안정한 행렬 알고리즘으로 구하면 다항식의 근이 모두 나옵니다. 14장에서 보듯 고유값을 특성 다항식으로 구하는 것은 나쁜 생각이지만, 이 반대 방향은 좋은 생각입니다.

정의 4.7 (동반 행렬) 최고차 계수가 1인 p(z)=zn+an−1zn−1+⋯+a1z+a0p(z) = z^n + a_{n-1}z^{n-1} + \cdots + a_1 z + a_0의 동반 행렬(companion matrix)은
C=[−an−1−an−2⋯−a1−a010⋯0001⋯00⋮⋱⋮00⋯10]C = \begin{bmatrix} -a_{n-1} & -a_{n-2} & \cdots & -a_1 & -a_0 \\ 1 & 0 & \cdots & 0 & 0 \\ 0 & 1 & \cdots & 0 & 0 \\ \vdots & & \ddots & & \vdots \\ 0 & 0 & \cdots & 1 & 0 \end{bmatrix}
이다. 첫 행에 계수, 바로 아래 대각선에 1이 있는 상헤센베르크 행렬이다.
정리 4.8 det⁡(zI−C)=p(z)\det(zI - C) = p(z). 따라서 CC의 고유값은 pp의 근(중복도 포함)과 같다. 근 rr에 대한 고유벡터는 (rn−1,rn−2,…,r,1)(r^{n-1}, r^{n-2}, \dots, r, 1)이다.

확인. v=(rn−1,…,1)\mathbf v = (r^{n-1}, \dots, 1)이면 CvC\mathbf v의 둘째 성분부터는 rn−1,…,rr^{n-1}, \dots, r, 곧 rvr\mathbf v의 성분이다. 첫 성분은 −an−1rn−1−⋯−a0=rn−p(r)-a_{n-1}r^{n-1} - \cdots - a_0 = r^n - p(r)이므로 p(r)=0p(r) = 0이면 Cv=rvC\mathbf v = r\mathbf v. ∎

MATLAB의 roots와 NumPy의 numpy.roots가 바로 이렇게 동반 행렬의 고유값을 계산합니다. 고유값은 이동 QR 알고리즘으로 구합니다(14장). H−μI=QRH - \mu I = QR로 분해하고 H←RQ+μIH \leftarrow RQ + \mu I로 바꾸는 닮음 변환을 되풀이하면 아래 대각 성분이 0으로 가고 대각에 고유값이 드러납니다. 동반 행렬은 이미 헤센베르크 꼴이라 한 단계가 O(n2)O(n^2)이고 전체 비용은 O(n3)O(n^3), 대신 출발점 걱정도 수축 순서 걱정도 없습니다.

예제 4.6 (x³ − 2x − 5의 동반 행렬) a2=0a_2 = 0, a1=−2a_1 = -2, a0=−5a_0 = -5이므로 C=[025100010]C = \begin{bmatrix} 0 & 2 & 5 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}. 복소 이동(윌킨슨 이동) QR을 돌리면 마지막 아래 대각 성분 ∣h32∣|h_{32}|이 1, 1.24, 0.684, 0.486, 5.87×10−35.87\times10^{-3}, 1.06×10−61.06\times10^{-6}, 2.81×10−142.81\times10^{-14}으로 줄어 7단계 만에 고유값 −1.0472757−1.1359399i-1.0472757 - 1.1359399i가 떨어져 나온다(끝의 세 값은 2차 수렴). 남은 2×2 블록에서 한 단계 더 하면 2.09455148152.0945514815와 −1.0472757+1.1359399i-1.0472757 + 1.1359399i가 나온다. 근이 1,2,…,101, 2, \dots, 10인 다항식이면 QR 27단계로 모든 근이 상대 오차 1.2×10−101.2\times10^{-10} 이하로 나온다.
SIMULATOR

동반 행렬의 QR 반복: 대각선이 근으로 모인다

복소평면: 근(끌기) ○ 와 대각 성분 hᵢᵢ ●
|hᵢⱼ| 히트맵 (로그)
차수 n
QR 단계—
떨어져 나온 고유값—
마지막 활성 |hₘ,ₘ₋₁|—
p(z) 계수—
해볼 것: ① 'QR 한 단계'를 누르며 히트맵의 아래 대각 칸이 오른쪽 아래부터 어두워지고(0으로), 그때마다 대각 성분 하나가 근(빈 원)에 정확히 겹치는 것을 보세요. ② 근을 끌어 켤레 쌍을 만들어도 복소 이동 덕분에 수렴합니다. ③ 두 근을 거의 겹쳐 놓으면(중근 근처) 수렴이 느려지고 정확도가 떨어집니다. 근의 조건수가 나쁘기 때문입니다. 모델: 복소 산술의 기븐스 회전 QR, 윌킨슨 이동, |h| < 10⁻¹⁴(|hₘₘ| + |hₘ₋₁,ₘ₋₁|)이면 수축.

복소 평면의 뉴턴 방법과 프랙털

뉴턴 방법은 복소수에서도 똑같이 쓸 수 있습니다. zk+1=zk−p(zk)/p′(zk)z_{k+1} = z_k - p(z_k)/p'(z_k). 실근이 없는 z2+1z^2 + 1도 복소 출발점에서 ±i\pm i로 수렴합니다. 사실 이것은 2변수 뉴턴과 같은 것입니다. z=x+iyz = x + iy, p=u+ivp = u + iv로 쓰면 p(z)=0p(z) = 0은 u(x,y)=0u(x, y) = 0, v(x,y)=0v(x, y) = 0의 연립방정식이고, 코시–리만 방정식 ux=vyu_x = v_y, uy=−vxu_y = -v_x 때문에 그 야코비안 [uxuyvxvy]\begin{bmatrix} u_x & u_y \\ v_x & v_y\end{bmatrix}은 복소수 p′(z)p'(z)를 곱하는 회전·확대 행렬이 됩니다(MathBook: 복소수). 2변수 뉴턴 시뮬레이터의 둘째 연립방정식이 바로 z3=1z^3 = 1의 실수·허수 부분입니다.

정의 4.9 (끌개 영역) 근 rr의 끌개 영역(basin of attraction)은 뉴턴 반복이 rr로 수렴하는 출발점 z0z_0 전체의 집합이다. 단순근은 정리 3.8에 의해 둘레에 작은 원판을 포함한다.

z3−1z^3 - 1의 세 근 11, e±2πi/3e^{\pm 2\pi i/3}의 끌개 영역을 색칠하면 놀라운 그림이 나옵니다. 근 가까이에서는 각 영역이 넓고 매끄럽지만 경계에서는 세 색이 끝없이 뒤섞입니다. 이 질문은 케일리(Arthur Cayley)가 1879년에 2차식은 쉽고 3차식은 어렵다고 적으며 던진 것으로 알려져 있고, 컴퓨터 그래픽이 생긴 뒤에야 그 모양이 보였습니다. 이유는 복소 동역학의 정리가 말해 줍니다. 유리 함수 반복에서 각 끌개 영역의 경계는 모두 같은 집합(쥘리아 집합)이라서, 경계의 어느 점이든 그 아무리 작은 근방에도 세 영역이 모두 들어 있습니다.

SIMULATOR

뉴턴 프랙털: 복소평면의 끌개 영역

클릭한 점의 궤도회색: 50번 안에 수렴 안 함
클릭한 z₀—
도착한 근—
반복 수—
보기 중심 / 폭—
해볼 것: ① 근 근처를 클릭하면 궤도가 곧장 들어가고, 세 색의 경계를 클릭하면 크게 돌아다닙니다. 확대 슬라이더를 올리면 마지막으로 클릭한 점을 중심으로 2배씩 확대합니다. 경계 어디를 확대해도 세 색이 다시 나옵니다. ② z³ − 2z + 2를 고르면 0과 1 둘레의 회색 영역이 보입니다. 이 출발점들은 끌어당기는 2주기 순환에 갇힙니다. ③ 완화 계수 a를 바꾸면(a = 1이 뉴턴) 경계 모양이 달라지고, a > 1에서는 근 근처의 2차 수렴이 1차로 바뀌어 명암 띠가 촘촘해집니다. 모델: 수렴 판정 |z − r| < 10⁻⁶, 최대 50번.

연속법: 쉬운 문제에서 어려운 문제로

좋은 출발점이 없을 때

뉴턴 방법은 출발점이 근에 가까워야 합니다. 그런데 근을 모르니 출발점도 모릅니다. 답을 아는 쉬운 문제에서 시작해 문제를 조금씩 바꿔 가며, 바뀐 문제의 해를 바로 앞 해에서 출발한 뉴턴으로 따라가면 어떨까요?

매개변수 t∈[0,1]t \in [0, 1]로 두 문제를 잇는 호모토피(homotopy) H(x,t)\mathbf H(\mathbf x, t)를 만듭니다. t=0t = 0에서는 해를 알고, t=1t = 1에서는 원래 문제 F\mathbf F가 됩니다. 대표적인 두 가지는

HN(x,t)=F(x)−(1−t) F(x0),HC(x,t)=t F(x)+(1−t)(x−x0)\mathbf H_N(\mathbf x, t) = \mathbf F(\mathbf x) - (1 - t)\,\mathbf F(\mathbf x_0), \qquad \mathbf H_C(\mathbf x, t) = t\,\mathbf F(\mathbf x) + (1 - t)(\mathbf x - \mathbf x_0)
뉴턴 호모토피 HN\mathbf H_N과 볼록 호모토피 HC\mathbf H_C. 둘 다 t=0t = 0에서 해가 x0\mathbf x_0이다.

해 x(t)\mathbf x(t)는 H(x(t),t)=0\mathbf H(\mathbf x(t), t) = \mathbf 0을 만족하는 곡선(해 경로)을 그립니다. 연속법(continuation method)은 이 경로를 작은 걸음으로 따라갑니다. 각 걸음은 예측(앞 해, 또는 접선 방향으로 외삽)과 수정(그 점에서 H(⋅,tk+1)=0\mathbf H(\cdot, t_{k+1}) = 0에 대한 뉴턴 몇 번)입니다. 뉴턴 호모토피를 tt로 미분하면 Jx˙+F(x0)=0J\dot{\mathbf x} + \mathbf F(\mathbf x_0) = 0, 곧 x˙=−J−1F(x0)\dot{\mathbf x} = -J^{-1}\mathbf F(\mathbf x_0)입니다. 경로를 따라 잔차가 F(x(t))=(1−t)F(x0)\mathbf F(\mathbf x(t)) = (1 - t)\mathbf F(\mathbf x_0)로 방향을 바꾸지 않고 줄어드니, 연속법은 뉴턴 방향을 아주 작은 걸음으로 따라가는 "연속 뉴턴"인 셈입니다.

function continuation(H, Hx, x0, N)
  x = x0                           // H(x0, 0) = 0
  for k = 1 .. N
    t = k / N
    repeat 3~5 times                 // 수정자: t를 고정한 뉴턴
      x = x - lu_solve(Hx(x, t), H(x, t))
  return x                         // t = 1: F(x) = 0의 해

tt를 단조롭게 늘리는 이 단순한 방법은 경로가 되돌아갈 때(tt가 최댓값을 찍고 줄어드는 전환점) 실패합니다. 전환점에서는 ∂H/∂x=J\partial\mathbf H/\partial\mathbf x = J가 특이 행렬이 되어 tt를 더 늘린 문제에 가까운 해가 없습니다. 해결책은 tt도 미지수로 보고 경로의 호의 길이를 매개변수로 삼는 의사 호 길이 연속법입니다. 아래 시뮬레이터가 이 방법을 씁니다.

(t, x) = (0, 0) 전환점: t가 최대 0.218, F′(x) = 0 t = 1, x = 2.0946 t = 1 tx x³ − 2x − 5 = (1 − t)·(−5) 곧 t = (x³ − 2x)/5
그림 4-2. 1변수 뉴턴 호모토피의 해 경로 (개념도, 축척은 정확하지 않음). x3−2x−5x^3 - 2x - 5를 x0=0x_0 = 0에서 출발하면 경로 t=(x3−2x)/5t = (x^3 - 2x)/5는 tt를 늘리는 쪽(xx가 줄어드는 쪽)으로 가다가 x=−0.8165x = -0.8165, t=0.218t = 0.218에서 꺾여 되돌아간다. 근에 이르는 가지는 반대 방향, 곧 tt가 −0.218-0.218까지 줄었다가 다시 1로 오르는 쪽이다. 3장 실패 갤러리의 "평평한 곳"이 연속법에서는 전환점으로 나타난다.
예제 4.7 (연속법으로 가까운 근 찾기) 예제 4.2의 x0=(0.1,−0.1)\mathbf x_0 = (0.1, -0.1)에서 뉴턴 호모토피를 호 길이 0.1 걸음으로 따라가면 경로가 t=0.1,0.2,0.4,0.7t = 0.1, 0.2, 0.4, 0.7에서 (0.409,−0.501)(0.409, -0.501), (0.545,−0.720)(0.545, -0.720), (0.718,−1.047)(0.718, -1.047), (0.885,−1.422)(0.885, -1.422)을 거쳐 22걸음 만에 t=1t = 1에서 r1=(1.0041687,−1.7296373)\mathbf r_1 = (1.0041687, -1.7296373)에 닿는다. 순수 뉴턴이 크게 돌아 먼 근으로 간 것과 달리, 출발점과 "이어진" 근을 찾는다. 이 문제에서는 여러 출발점에서 시험해 봐도 전환점이 없었다. 프로이덴슈타인–로스 문제를 (0.5,−2)(0.5, -2)에서 뉴턴 호모토피로 따라가면 경로가 t≈0.59t \approx 0.59에서 꺾여 무한대로 달아난다. 호모토피를 잘 고르는 것도 기술이다.
SIMULATOR

연속법 경로: 문제를 바꾸며 해를 따라가기

f₁ = (1 − t)f₁(x₀)f₂ = (1 − t)f₂(x₀)해 경로 x(t)순수 뉴턴
x₀ (끌기)—
x(t)—
경로 걸음 / 끝점—
순수 뉴턴 끝점 (반복)—
해볼 것: ① t 슬라이더를 0에서 1로 움직이면, 출발점을 지나도록 옮겨 놓은 두 곡선이 원래 곡선으로 변형되며 교점이 노란 경로를 따라 움직입니다. ② 출발점을 (0.1, −0.1)로 두면 순수 뉴턴(빨간 점선)은 화면 밖으로 크게 돌지만 경로는 가까운 근으로 곧장 갑니다. ③ 출발점을 여러 곳으로 끌어 보며 경로가 어느 근에 닿는지와 끌개 영역(2변수 뉴턴 시뮬레이터)을 비교하세요. 모델: 뉴턴 호모토피, 의사 호 길이 연속법(걸음 0.05, 수정 뉴턴 최대 8번).

응용: 회로의 동작점, 로봇 팔, GPS

회로의 동작점: 지수 함수와 걸음 제한

5 V 전원 — 저항 R1=1R_1 = 1 kΩ — 마디 1 — 다이오드 D1D_1 — 접지, 그리고 마디 1 — R2=1R_2 = 1 kΩ — 마디 2 — D2D_2 — 접지인 회로를 생각합니다. 다이오드 전류는 ID=Is(eV/VT−1)I_D = I_s(e^{V/V_T} - 1)(Is=10−14I_s = 10^{-14} A, VT=25.852V_T = 25.852 mV)이고, 마디마다 들어오고 나가는 전류의 합이 0입니다(KCL).

F(v1,v2)=[(v1−5)/R1+ID(v1)+(v1−v2)/R2(v2−v1)/R2+ID(v2)]=0\mathbf F(v_1, v_2) = \begin{bmatrix} (v_1 - 5)/R_1 + I_D(v_1) + (v_1 - v_2)/R_2 \\ (v_2 - v_1)/R_2 + I_D(v_2) \end{bmatrix} = \mathbf 0
야코비안은 컨덕턴스 행렬이다. 대각에 1/R+Isev/VT/VT1/R + I_s e^{v/V_T}/V_T(다이오드의 소신호 컨덕턴스)가 들어간다. 이것이 회로 시뮬레이터가 매 반복 조립하는 행렬이다.
예제 4.8 (지수 함수가 뉴턴을 괴롭힐 때) (v1,v2)=(0,0)(v_1, v_2) = (0, 0)에서 출발하라.
  1. 순수 뉴턴: 다이오드가 꺼진 것처럼 보이는 첫 걸음이 (5,5)(5, 5) V로 간다. e5/0.0259≈e193e^{5/0.0259} \approx e^{193}이라 ∥F∥=1.4×1070\|\mathbf F\| = 1.4\times10^{70}. 그 뒤로는 매 반복 전압이 거의 정확히 VT=0.0259V_T = 0.0259 V씩만 내려와(지수 함수에 뉴턴을 쓰면 멀리서는 한 걸음이 VTV_T), 175번 만에 수렴한다(∥F∥<10−12\|\mathbf F\| \lt 10^{-12} A 기준).
  2. 감쇠 뉴턴(정리 4.4의 직선 탐색): 첫 걸음을 t=1/8t = 1/8로 줄여 (0.625,0.625)(0.625, 0.625)에서 시작하고 7번에 수렴한다.
  3. 걸음 제한(∣Δv∣≤0.1|\Delta v| \le 0.1 V로 자르기, 회로 시뮬레이터가 쓰는 전압 제한의 단순판): 0.1, 0.2, 0.3 V로 올라가 15번.
  4. 답: v1=0.69196v_1 = 0.69196 V, v2=0.59458v_2 = 0.59458 V, R1R_1 전류 4.308 mA, D2D_2 전류 0.0974 mA.

로봇 팔의 역기구학

두 마디 팔(길이 L1,L2L_1, L_2, 관절 각 θ1,θ2\theta_1, \theta_2)의 끝 위치는 x=L1cos⁡θ1+L2cos⁡(θ1+θ2)x = L_1\cos\theta_1 + L_2\cos(\theta_1 + \theta_2), y=L1sin⁡θ1+L2sin⁡(θ1+θ2)y = L_1\sin\theta_1 + L_2\sin(\theta_1 + \theta_2)입니다(정기구학). 원하는 위치 (px,py)(p_x, p_y)를 주고 각을 구하는 역기구학은 F(θ1,θ2)=(x−px,y−py)=0\mathbf F(\theta_1, \theta_2) = (x - p_x, y - p_y) = \mathbf 0이고, 야코비안의 행렬식은 det⁡J=L1L2sin⁡θ2\det J = L_1L_2\sin\theta_2입니다. 팔이 완전히 펴지거나 접히면(θ2=0,π\theta_2 = 0, \pi) 특이 자세라 뉴턴이 불안정해집니다.

θ₁ θ₂ L₁L₂ (x, y) 정기구학: 각 → 위치 (공식) 역기구학: 위치 → 각 (F(θ) = 0) det J = L₁L₂ sin θ₂ θ₂ = 0 (펴짐), π (접힘): 특이 자세 해는 보통 두 개: 팔꿈치 위/아래
그림 4-3. 두 마디 팔. 각에서 위치는 공식으로 바로 나오지만, 위치에서 각을 구하는 것은 비선형 연립방정식이다. 실시간 제어에서는 직전 시각의 각을 출발점으로 뉴턴 한두 번을 하는데, 목표가 조금씩 움직이므로 이것이 바로 연속법이다.

L1=L2=1L_1 = L_2 = 1, 목표 (1,1)(1, 1), 출발 (θ1,θ2)=(0.3,1.0)(\theta_1, \theta_2) = (0.3, 1.0)이면 뉴턴 반복은 (−0.0675,1.7115)(-0.0675, 1.7115), (−0.00243,1.5752)(-0.00243, 1.5752), (−1.96×10−6,1.570801)(-1.96\times10^{-6}, 1.570801), (−4.3×10−12,1.5707963268)(-4.3\times10^{-12}, 1.5707963268)으로 4번 만에 (0,π/2)(0, \pi/2)에 닿습니다. 목표가 팔이 닿지 않는 곳이면 해가 없고 뉴턴은 진동합니다. 이때는 ∥F∥2\|\mathbf F\|^2를 최소화하는 감쇠 최소제곱 걸음 (JTJ+λI)s=−JTF(J^TJ + \lambda I)\mathbf s = -J^T\mathbf F(레벤버그–마쿼트, 15장)가 팔을 목표 쪽으로 쭉 뻗게 해 줍니다.

SIMULATOR

로봇 팔 역기구학: 목표를 끌면 뉴턴이 따라간다

방법
팔 L₁팔 L₂목표 (끌기)닿는 영역
θ₁, θ₂ (도)—
반복 수—
‖F‖ (끝점 − 목표)—
det J = L₁L₂ sin θ₂—
해볼 것: ① 노란 목표를 천천히 끌면 반복 1~3번으로 따라갑니다. 직전 각이 좋은 출발점이기 때문입니다. '매번 같은 출발점'을 켜면 반복이 늘고 가끔 팔꿈치가 뒤집힙니다. ② 목표를 닿는 영역(회색 고리) 밖으로 끌면 뉴턴은 실패하고, '감쇠 최소제곱'은 팔을 목표 방향으로 쭉 폅니다. ③ 목표를 고리의 바깥 경계 가까이 두면 det J가 0에 가까워집니다(특이 자세). 모델: L₁ = 1, 뉴턴 최대 30번, ‖F‖ < 10⁻¹²에서 멈춤, λ = 10⁻³‖F‖.

GPS: 의사거리 방정식

위성 ii의 위치 si\mathbf s_i를 알고 신호의 도착 시각으로 거리 ρi\rho_i를 재는데, 수신기의 값싼 시계에는 오차 bb(거리로 환산)가 있습니다. 미지수는 위치 x\mathbf x와 bb이고, fi(x,b)=∥x−si∥+b−ρi=0f_i(\mathbf x, b) = \|\mathbf x - \mathbf s_i\| + b - \rho_i = 0입니다. 3차원이면 미지수 4개라 위성이 4개 이상 필요합니다. 야코비안의 ii번째 행은 (위성에서 수신기로의 단위 벡터,1)(\text{위성에서 수신기로의 단위 벡터}, 1)입니다. 위성이 더 많으면 최소제곱(가우스–뉴턴, 7장·15장)으로 풉니다.

예제 4.9 (평면 GPS) 평면에서 위성 세 개 (0,10)(0, 10), (8,6)(8, 6), (−7,7)(-7, 7)과 의사거리 ρ=(8.562258, 8.562258, 9.933981)\rho = (8.562258,\ 8.562258,\ 9.933981)(참 위치 (1,2)(1, 2), 시계 오차 b=0.5b = 0.5로 만든 값)이 있다. (x,y,b)=(0,0,0)(x, y, b) = (0, 0, 0)에서 뉴턴 방법을 쓰면
  1. (1.138708, 2.277417, 0.839675)(1.138708,\ 2.277417,\ 0.839675), ∥F∥=0.337\|\mathbf F\| = 0.337
  2. (1.001843, 2.003686, 0.505336)(1.001843,\ 2.003686,\ 0.505336), ∥F∥=5.6×10−3\|\mathbf F\| = 5.6\times10^{-3}
  3. (1.0000003, 2.0000007, 0.5000010)(1.0000003,\ 2.0000007,\ 0.5000010), ∥F∥=1.0×10−6\|\mathbf F\| = 1.0\times10^{-6}
  4. (1,2,0.5)(1, 2, 0.5), ∥F∥=3.3×10−14\|\mathbf F\| = 3.3\times10^{-14}
지구 중심에서 출발해도 몇 번이면 되는 까닭은 위성이 멀어서 거리 함수가 수신기 근처에서 거의 선형이기 때문이다. 위성들이 하늘의 한쪽에 몰려 있으면 야코비안의 행들이 비슷해져 조건수가 커지고, 거리 측정 오차가 위치 오차로 크게 증폭된다. GPS의 "정밀도 저하율(DOP)"이 이 조건수를 나타내는 값이다.

이 도구가 쓰이는 곳

분야방정식방법
회로 시뮬레이션 (SPICE)마디 해석 KCL, 미지수 수만 개뉴턴 + 전압 제한 + 희소 LU, 실패하면 전원·온도 연속법
로봇·애니메이션역기구학뉴턴, 감쇠 최소제곱, 직전 해에서 출발(연속법)
항법GPS 의사거리가우스–뉴턴, 칼만 필터의 선형화
구조·유체 해석비선형 유한 요소 방정식뉴턴–크릴로프, 하중 증분(연속법)
화학 평형, 열역학질량 작용 법칙, 상평형감쇠 뉴턴, 호모토피
다항식 근특성 방정식, 필터 설계의 극·영점동반 행렬의 QR(roots), 뉴턴–호너 다듬기

핵심 정리

  1. F(x)=0\mathbf F(\mathbf x) = \mathbf 0의 다변수 뉴턴은 J(xk)sk=−F(xk)J(\mathbf x_k)\mathbf s_k = -\mathbf F(\mathbf x_k)를 풀어 xk+1=xk+sk\mathbf x_{k+1} = \mathbf x_k + \mathbf s_k. 역행렬이 아니라 선형계를 푼다. J(r)J(\mathbf r)이 가역이면 2차 수렴, 상수에 ∥J−1∥\|J^{-1}\|이 들어간다.
  2. 다차원에서는 근을 가둘 수 없다. 뉴턴 방향은 12∥F∥2\tfrac12\|\mathbf F\|^2의 하강 방향(∇ϕ⋅s=−∥F∥2\nabla\phi\cdot\mathbf s = -\|\mathbf F\|^2)이므로, 걸음을 반씩 줄이는 직선 탐색(감쇠 뉴턴)으로 먼 출발점에서도 수렴을 돕는다. 다만 ∥F∥\|\mathbf F\|의 국소 최솟값에 갇힐 수 있다.
  3. 브로이든 방법은 할선 조건 Bk+1sk=ykB_{k+1}\mathbf s_k = \mathbf y_k를 만족하는 최소 변경 계수 1 갱신으로 야코비안을 대신한다. 반복마다 F\mathbf F 한 번, 초선형 수렴. 미지수가 많을수록 차분 뉴턴보다 싸다.
  4. 호너 방법은 bk=ak+x0bk+1b_k = a_k + x_0 b_{k+1}로 곱셈 nn번에 p(x0)p(x_0)을 주고, 같은 표가 몫 p(x)/(x−x0)p(x)/(x - x_0)이다. 한 번 더 하면 p′(x0)p'(x_0). 뉴턴–호너는 반복마다 호너 두 줄이다.
  5. 수축은 작은 근부터 떼어 내야 안정하다. 큰 근부터 떼면 작은 근들이 망가질 수 있고, 찾은 근은 원래 다항식으로 다듬는다.
  6. 동반 행렬의 고유값은 다항식의 근이다. roots는 이동 QR 알고리즘으로 모든 근을 O(n3)O(n^3)에 출발점 없이 구한다.
  7. 복소 뉴턴은 코시–리만 덕분에 2변수 뉴턴과 같다. z3−1z^3 - 1의 끌개 영역 경계는 프랙털(쥘리아 집합)이라 경계 근처의 출발점은 어느 근으로 갈지 예측하기 어렵다. 끌어당기는 순환이 있으면 수렴하지 않는 열린 영역이 생긴다.
  8. 연속법은 해를 아는 쉬운 문제에서 원래 문제로 H(x,t)\mathbf H(\mathbf x, t)를 바꾸며 해 경로를 예측–수정으로 따라간다. 전환점에서는 JJ가 특이해지므로 호 길이 매개변수를 쓴다.

확인 퀴즈

Q1. 다변수 뉴턴 방법의 한 반복에서 실제로 계산하는 것은?

식으로는 x − J⁻¹F지만, 역행렬을 만드는 것은 LU 풀기보다 약 3배 비싸고 덜 정확하다. 성분별 뉴턴은 방정식 사이의 결합을 무시해 일반적으로 수렴하지 않는다. 기울기 방향 JTF는 최급 강하(15장)다.

Q2. F(x,y)=(x2+y2−4, ex+y−1)\mathbf F(x, y) = (x^2 + y^2 - 4,\ e^x + y - 1)의 (1,−1)(1, -1)에서의 야코비안 행렬식은?

J = [[2x, 2y], [eˣ, 1]] = [[2, −2], [e, 1]]. 행렬식 2·1 − (−2)·e = 2 + 2e = 7.437. 0이 아니므로 뉴턴 걸음이 하나로 정해진다.

Q3. 감쇠 뉴턴에서 뉴턴 걸음 s=−J−1F\mathbf s = -J^{-1}\mathbf F가 ϕ=12∥F∥2\phi = \tfrac12\|\mathbf F\|^2을 줄이는 방향인 이유는?

∇φ = JTF이므로 ∇φ·s = FTJ(−J⁻¹F) = −‖F‖². J가 가역이고 F ≠ 0이면 언제나 음수, 충분히 작은 걸음은 반드시 잔차를 줄인다. J의 대칭성은 필요 없다.

Q4. 브로이든 갱신된 행렬 Bk+1B_{k+1}이 반드시 만족하는 것은?

할선 조건 B s = y. 이것을 만족하는 행렬 중 Bk에서 프로베니우스 노름으로 가장 적게 바꾼 것이 브로이든 갱신이다. 참 야코비안과 같아진다는 보장은 없다(예제 4.3).

Q5. 차수 10인 일반 다항식의 값을 호너 방법으로 계산할 때 곱셈과 덧셈의 수는?

bₖ = aₖ + x·bₖ₊₁을 10번, 각각 곱셈 하나와 덧셈 하나. 항마다 거듭제곱을 새로 계산하면 1 + 2 + … + 10 = 55번, 거듭제곱을 이어 받으면 19번이다.

Q6. p(x)=x3−6x2+11x−6p(x) = x^3 - 6x^2 + 11x - 6의 근 x=1x = 1로 조립제법 수축을 하면 몫은?

b = 1, −6 + 1 = −5, 11 − 5 = 6, −6 + 6 = 0. 마지막이 0이라 1이 근이고, 몫 x² − 5x + 6 = (x − 2)(x − 3)이 나머지 근 2, 3을 가진다.

Q7. 행렬 [3−210]\begin{bmatrix} 3 & -2 \\ 1 & 0 \end{bmatrix}의 고유값은?

z² + a₁z + a₀의 동반 행렬 첫 행이 [−a₁, −a₀] = [3, −2]이므로 a₁ = −3, a₀ = 2, 곧 z² − 3z + 2 = (z − 1)(z − 2). 직접 det(zI − C) = z(z − 3) + 2로 확인할 수 있다.

Q8. z3−1z^3 - 1에 대한 뉴턴 방법의 끌개 영역에 대해 옳은 것은?

세 영역의 경계는 같은 쥘리아 집합이라 경계 근처에서 세 색이 끝없이 섞인다. 실수 출발점은 실수축에 머물러 1로 간다. 수렴하지 않는 열린 영역은 z³ − 2z + 2처럼 끌어당기는 순환이 있을 때 생긴다.