<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Numerical Analysis on dirac042</title><link>https://dirac042.github.io/tags/numerical-analysis/</link><description>dirac042's journal — notes on mathematics, computer science and building things.</description><generator>Hugo</generator><language>ko-kr</language><managingEditor>dirac042</managingEditor><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Thu, 09 Oct 2025 00:00:00 +0900</lastBuildDate><atom:link href="https://dirac042.github.io/tags/numerical-analysis/index.xml" rel="self" type="application/rss+xml"/><item><title>인스타 릴스에서 본 방정식 x^(x+1) = 16, 끝까지 풀어보기</title><link>https://dirac042.github.io/posts/solving-x-to-the-x-plus-1-equals-16/</link><pubDate>Thu, 09 Oct 2025 00:00:00 +0900</pubDate><guid>https://dirac042.github.io/posts/solving-x-to-the-x-plus-1-equals-16/</guid><category>Math</category><category>Numerical Analysis</category><description>1. Motivation 문제의 릴스. “Can you solve this?” 인스타 릴스에서 누가 이런 문제를 올려놨다. 안 그래도 할 거 없어서 풀어볼까 하고 샤프로 끄적거려봤는데, 내가 가진 ‘상식’으로는 풀 수 없었다.</description><content:encoded>&lt;h2 id="1-motivation">1. Motivation&lt;/h2>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/KakaoTalk_Photo_2025-10-09-23-48-51.jpeg" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>문제의 릴스. &amp;ldquo;Can you solve this?&amp;rdquo;&lt;/p>
&lt;/blockquote>&lt;p>인스타 릴스에서 누가 이런 문제를 올려놨다.&lt;br>
안 그래도 할 거 없어서 풀어볼까 하고 샤프로 끄적거려봤는데, 내가 가진 &amp;lsquo;상식&amp;rsquo;으로는 풀 수 없었다.&lt;/p>
&lt;div class="math math-block">\[(x&amp;#43;1)\ln x=\ln 16\]&lt;/div>&lt;p>여기서 더 할 게 없다.&lt;br>
댓글을 봐도 &amp;lsquo;2&amp;rsquo;라고 하는 사람들과 &amp;lsquo;3&amp;rsquo;이라고 하는 사람들이 많았다.&lt;br>
넣어보면 딱 봐도 아닌데. (&lt;span class="math math-inline">\(2^3=8\)&lt;/span>, &lt;span class="math math-inline">\(3^4=81\)&lt;/span>. 답은 2와 3 사이 어딘가에 있고, 둘 다 아니다.)&lt;/p>
&lt;p>성격상 이런 거 못 참아서, 리서치(?)한 내용을 간략하게 올려본다.&lt;/p>
&lt;h2 id="2-lamberts-w-introduction">2. Lambert&amp;rsquo;s W (Introduction)&lt;/h2>
&lt;p>사실 진짜 별거 아니다.&lt;br>
&lt;span class="math math-inline">\(f(x)=xe^x\)&lt;/span> 이 함수의 역함수를 &lt;span class="math math-inline">\(W(x)\)&lt;/span> 함수라고 표기하는 방식이다.&lt;/p>
&lt;p>즉, &lt;span class="math math-inline">\(z=W(z)e^{W(z)}\)&lt;/span>를 만족하는 함수 &lt;span class="math math-inline">\(W(z)\)&lt;/span>를&lt;br>
&lt;strong>Lambert W Function&lt;/strong> 이라고 부른다.&lt;br>
일종의 표기법을 만들어낸 것뿐이지, 뭔가 거창한 풀이에 대한 내용은 없다.&lt;/p>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-lambert-w.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>왼쪽: &lt;span class="math math-inline">\(y=we^w\)&lt;/span>. 이 그래프를 옆으로 뒤집은 것이 &lt;span class="math math-inline">\(W\)&lt;/span>다. 오른쪽: 우리 문제에 해당하는 &lt;span class="math math-inline">\(we^w&amp;#43;w\)&lt;/span>. 단조증가라 해가 딱 하나다.&lt;/p>
&lt;/blockquote>&lt;aside class="callout callout-note">
&lt;p class="callout-title">왜 &amp;lsquo;함수&amp;rsquo;가 아니라 &amp;lsquo;가지(branch)&amp;lsquo;를 이야기하나&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>&lt;span class="math math-inline">\(y=we^w\)&lt;/span>는 &lt;span class="math math-inline">\(w=-1\)&lt;/span>에서 최솟값 &lt;span class="math math-inline">\(-1/e\)&lt;/span>를 찍고 다시 올라간다. 그래서 &lt;span class="math math-inline">\(-1/e&amp;lt;y&amp;lt;0\)&lt;/span> 구간에서는 역함수 값이 두 개다 — 오른쪽 가지를 &lt;span class="math math-inline">\(W_0\)&lt;/span>(principal branch), 왼쪽 가지를 &lt;span class="math math-inline">\(W_{-1}\)&lt;/span>라고 부른다. &lt;span class="math math-inline">\(y&amp;lt;-1/e\)&lt;/span>면 실수 해가 없다. &lt;span class="math math-inline">\(e^x\)&lt;/span>, &lt;span class="math math-inline">\(\ln x\)&lt;/span> 같은 초등함수(elementary function)로는 &lt;span class="math math-inline">\(W\)&lt;/span>를 쓸 수 없다는 것이 증명되어 있어서, 컴퓨터에서는 &lt;code>scipy.special.lambertw&lt;/code> 같은 함수로 수치적으로 계산한다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;p>위의 문제는 다음과 같이 적을 수 있다.&lt;br>
&lt;span class="math math-inline">\((x&amp;#43;1)\ln x=\ln 16\)&lt;/span>&lt;br>
이때, &lt;span class="math math-inline">\(x=e^{\ln x}\)&lt;/span> 이므로&lt;br>
&lt;span class="math math-inline">\(x\ln x&amp;#43;\ln x=\ln 16\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(e^{\ln x}\ln x&amp;#43;\ln x = \ln 16\)&lt;/span>&lt;/p>
&lt;p>이제 &lt;span class="math math-inline">\(\ln x = w\)&lt;/span> 라고 치환하면, 다음의 형태로 변형된다.&lt;/p>
&lt;div class="math math-block">\[we^w&amp;#43;w=\ln 16\]&lt;/div>&lt;p>이는 아까 봤던 &lt;span class="math math-inline">\(we^w=z\)&lt;/span> 꼴의 형태와 다르다.&lt;br>
그래서 좀 더 &amp;lsquo;일반화된&amp;rsquo; 람베르트 W를 정의한다.&lt;/p>
&lt;p>&lt;span class="math math-inline">\(we^w&amp;#43;pw=z\)&lt;/span> 형태의 방정식의 해를 &lt;span class="math math-inline">\(w=W_p(z)\)&lt;/span> 라고 정의하자.&lt;/p>
&lt;p>그럼 위 식은 &lt;span class="math math-inline">\(p=1\)&lt;/span>, &lt;span class="math math-inline">\(z=\ln 16\)&lt;/span> 인 식이므로&lt;/p>
&lt;div class="math math-block">\[x=e^{W_1(\ln 16)}\]&lt;/div>&lt;p>다음과 같이 표현할 수 있다.&lt;br>
근데 사실 우리는 그냥 기호를 쓴 것뿐이라, 여기에서 더 계산할 수는 없다. 값을 실제로 얻으려면 결국 수치적으로 풀어야 한다.&lt;/p>
&lt;aside class="callout callout-note">
&lt;p class="callout-title">이 &amp;lsquo;일반화&amp;rsquo;는 실제로 있는 개념이다 — r-Lambert 함수&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>나중에 찾아보니 &lt;span class="math math-inline">\(xe^x&amp;#43;rx=a\)&lt;/span>의 해를 &lt;span class="math math-inline">\(W_r(a)\)&lt;/span>로 쓰는 &lt;strong>r-Lambert function&lt;/strong>이 Mező와 Baricz(2017)에 의해 정의되어 있었다. 위에서 내가 &lt;span class="math math-inline">\(p\)&lt;/span>라고 쓴 게 딱 &lt;span class="math math-inline">\(r\)&lt;/span>이다. 재미있는 건 가지의 개수가 &lt;span class="math math-inline">\(r\)&lt;/span>에 따라 달라진다는 것: &lt;span class="math math-inline">\(r&amp;gt;1/e^2\)&lt;/span>이면 함수 &lt;span class="math math-inline">\(xe^x&amp;#43;rx\)&lt;/span>가 단조증가라 실수 가지가 하나뿐이고, &lt;span class="math math-inline">\(0&amp;lt;r&amp;lt;1/e^2\)&lt;/span>이면 세 개, &lt;span class="math math-inline">\(r&amp;lt;0\)&lt;/span>이면 두 개가 된다. 우리 문제는 &lt;span class="math math-inline">\(r=1&amp;gt;1/e^2\approx0.135\)&lt;/span>라서 위 그림의 오른쪽처럼 해가 정확히 하나다 — 릴스 댓글에서 &amp;lsquo;2냐 3이냐&amp;rsquo; 싸울 일이 애초에 아니었던 것.&lt;/p>
&lt;/div>
&lt;/aside>&lt;h2 id="3-newton-raphson-method">3. Newton-Raphson Method&lt;/h2>
&lt;p>인공지능을 배우면서 Gradient Descent와 같이 배운 게 기억난다.&lt;br>
방법은 단순하다.&lt;/p>
&lt;ol>
&lt;li>어떤 그래프 위의 추측값에서 접선을 긋는다.&lt;/li>
&lt;li>그 접선이 x축과 만나는 점을 다음 추측값으로 삼는다.&lt;/li>
&lt;li>일정 횟수 동안 1과 2를 반복한다.&lt;/li>
&lt;/ol>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-newton.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>그림으로 보면 이게 전부다. 시작점을 일부러 멀리(&lt;span class="math math-inline">\(x_0=1.9\)&lt;/span>) 잡아도 세 번 만에 답 근처에 도착한다.&lt;/p>
&lt;/blockquote>&lt;p>우리의 목표는 &lt;span class="math math-inline">\(x^{x&amp;#43;1}=16\)&lt;/span>의 해를 찾는 것이므로, 이는 &lt;span class="math math-inline">\(x^{x&amp;#43;1}-16=0\)&lt;/span>의 해를 찾는 것과 동치다.&lt;/p>
&lt;p>함수 &lt;span class="math math-inline">\(f(x)=x^{x&amp;#43;1}-16\)&lt;/span>이라고 정의하자.&lt;br>
일단 1번(어떤 그래프 위의 추측값에서 접선 긋기) 과정에서 접선을 그어야 하니까, &lt;span class="math math-inline">\(f(x)\)&lt;/span>의 도함수 &lt;span class="math math-inline">\(f&amp;#39;(x)\)&lt;/span>를 구해야겠다.&lt;br>
고등학교 미적 시간에 배운 로그미분법을 활용하면 쉽게 미분이 가능하다.&lt;/p>
&lt;p>&lt;span class="math math-inline">\(y=x^{x&amp;#43;1}\)&lt;/span>이면 &lt;span class="math math-inline">\(\ln y=(x&amp;#43;1)\ln x\)&lt;/span>이므로,&lt;/p>
&lt;p>&lt;span class="math math-inline">\(\frac{y&amp;#39;}{y}=\ln x&amp;#43;(x&amp;#43;1)\frac{1}{x}\)&lt;/span>&lt;/p>
&lt;p>&lt;span class="math math-inline">\(y&amp;#39;=y\left(\ln x&amp;#43;(x&amp;#43;1)\frac{1}{x}\right)=x^{x&amp;#43;1}\left(\ln x&amp;#43;1&amp;#43;\frac{1}{x}\right)\)&lt;/span>&lt;/p>
&lt;p>즉 &lt;span class="math math-inline">\(f&amp;#39;(x)=x^{x&amp;#43;1}\left(\ln x&amp;#43;1&amp;#43;\frac{1}{x}\right)\)&lt;/span> 가 된다.&lt;/p>
&lt;p>이제 1번은 끝났으니, 2번을 보자.&lt;br>
2번에 따르면, 우리의 다음 추측값 &lt;span class="math math-inline">\(x_{n&amp;#43;1}\)&lt;/span>은 현재 추측값 &lt;span class="math math-inline">\(x_n\)&lt;/span>에 대한 식으로 나타낼 수 있겠다.&lt;/p>
&lt;p>&lt;span class="math math-inline">\(x_n\)&lt;/span>에서 그은 접선이 &lt;span class="math math-inline">\(x\)&lt;/span>축과 만나는 곳이 &lt;span class="math math-inline">\(x_{n&amp;#43;1}\)&lt;/span>이므로,&lt;br>
접선과 &lt;span class="math math-inline">\(x\)&lt;/span>축이 이루는 각을 &lt;span class="math math-inline">\(\theta\)&lt;/span> 라고 두면&lt;br>
&lt;/p>
&lt;div class="math math-block">\[\tan\theta = f&amp;#39;(x_n)=\frac{f(x_n)-0}{x_n-x_{n&amp;#43;1}}\]&lt;/div>&lt;p>&lt;br>
이 식을 정리하면:&lt;br>
&lt;/p>
&lt;div class="math math-block">\[x_{n&amp;#43;1}=x_n-\frac{f(x_n)}{f&amp;#39;(x_n)}\]&lt;/div>&lt;p>&lt;br>
다음과 같은 점화식을 얻을 수 있다. (이게 Newton-Raphson의 정수다.)&lt;/p>
&lt;p>1번과 2번 알고리즘을 제대로 정의했으니, 이제 직접 구해보자.&lt;br>
사람들의 댓글로 보아 일단 해는 &lt;span class="math math-inline">\(x=2\)&lt;/span>와 &lt;span class="math math-inline">\(x=3\)&lt;/span> 사이에 존재한다.&lt;br>
(너무나도 당연하게도. &lt;span class="math math-inline">\(f(2)=-8&amp;lt;0\)&lt;/span>, &lt;span class="math math-inline">\(f(3)=65&amp;gt;0\)&lt;/span>이고 &lt;span class="math math-inline">\(f\)&lt;/span>는 연속이니, 중간값 정리에 의해 그 사이 어딘가에서 0을 지난다.)&lt;/p>
&lt;p>한 2.3 정도로 시작해보자. &lt;span class="math math-inline">\(x_0=2.3\)&lt;/span>.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[f(2.3)=2.3^{3.3}-16\approx-0.3793\]&lt;/div>&lt;p>&lt;br>
&lt;/p>
&lt;div class="math math-block">\[f&amp;#39;(2.3)=2.3^{3.3}\left(\ln 2.3&amp;#43;1&amp;#43;2.3^{-1}\right)\approx35.4230\]&lt;/div>&lt;p>&lt;br>
&lt;/p>
&lt;div class="math math-block">\[x_1=2.3-\frac{-0.3793}{35.4230}\approx2.3107\]&lt;/div>&lt;p>&lt;br>
처음 한 번 돌렸을 때의 결과는 2.3107이 나왔다.&lt;br>
&lt;span class="math math-inline">\(f(2.3)\)&lt;/span>이 음수였으니, 2.3보다는 조금 더 큰 쪽으로 움직인 셈이다.&lt;/p>
&lt;p>귀찮으니 파이썬으로 후딱 계산을 때리면 다음과 같은 결과가 나온다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">fp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">2.3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">fp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 2.310711&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2 2.310572&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3 2.310572&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4 2.310572&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;span class="math math-inline">\(x_1=2.31071\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(x_2=2.31057\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(x_3=2.31057\)&lt;/span>&lt;/p>
&lt;p>두 번 만에 소수점 다섯째 자리까지 딱 멈춰버린다. (Newton-Raphson은 해 근처에서 자릿수가 매 단계 두 배씩 늘어나는 &amp;lsquo;이차 수렴&amp;rsquo;을 한다.)&lt;br>
이로써 위 문제의 답은 &lt;span class="math math-inline">\(x\approx2.3106\)&lt;/span> 이라고 근사할 수 있다.&lt;/p>
&lt;aside class="callout callout-note">
&lt;p class="callout-title">Gradient Descent와 뭐가 다른가&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>둘 다 &amp;lsquo;기울기를 보고 다음 위치를 정한다&amp;rsquo;는 점은 같다. 하지만 GD는 손실 &lt;span class="math math-inline">\(L\)&lt;/span>을 &lt;strong>최소화&lt;/strong>하려고 &lt;span class="math math-inline">\(-\eta L&amp;#39;(x)\)&lt;/span>만큼 조금씩 내려가고(학습률 &lt;span class="math math-inline">\(\eta\)&lt;/span>를 사람이 정한다), Newton은 &lt;span class="math math-inline">\(f=0\)&lt;/span>이 되는 점을 &lt;strong>찾으려고&lt;/strong> &lt;span class="math math-inline">\(f/f&amp;#39;\)&lt;/span>만큼 한 번에 뛴다(보폭을 접선이 알아서 정한다). GD를 최적화 문제 &lt;span class="math math-inline">\(L&amp;#39;(x)=0\)&lt;/span>에 Newton으로 풀면 &lt;span class="math math-inline">\(x_{n&amp;#43;1}=x_n-L&amp;#39;(x_n)/L&amp;#39;&amp;#39;(x_n)\)&lt;/span>이 되는데, 이게 딥러닝에서 말하는 2차 최적화(Newton&amp;rsquo;s method for optimization)다. 이차 미분(Hessian)이 너무 비싸서 잘 안 쓸 뿐이다.&lt;/p>
&lt;p>대신 Newton은 시작점을 잘못 잡으면(예: &lt;span class="math math-inline">\(f&amp;#39;(x_n)\approx0\)&lt;/span>인 곳) 엉뚱한 곳으로 튀거나 발산할 수 있다. 위 문제처럼 함수가 단조증가하고 볼록하면 아무 데서 시작해도 잘 간다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;h2 id="4-fixed-point-iteration-method">4. Fixed-Point Iteration Method&lt;/h2>
&lt;p>전에는 미분과 도함수를 사용했다면, 이번에는 우리에게 주어진 방정식 자체를 변형시키는 방법을 써보자.&lt;/p>
&lt;p>핵심은 이렇다.&lt;br>
우리에게 주어진 방정식은 &lt;span class="math math-inline">\(f(x)=0\)&lt;/span>.&lt;br>
이 식을 어떤 방법이든 &lt;span class="math math-inline">\(x=g(x)\)&lt;/span>의 꼴로 변형시킨다.&lt;br>
만약 &lt;span class="math math-inline">\(x=g(x)\)&lt;/span>의 해를 찾을 수 있으면, 이 해 &lt;span class="math math-inline">\(x^*\)&lt;/span>를 &amp;lsquo;고정점 (Fixed Point)&amp;lsquo;이라고 칭한다.&lt;br>
(즉, 이 고정점에서 &lt;span class="math math-inline">\(g(x^*)\)&lt;/span>의 값을 계산하면 자기 자신인 &lt;span class="math math-inline">\(x^*\)&lt;/span>가 나오는 것.)&lt;/p>
&lt;p>이를 이용해 다음과 같은 과정을 거친다.&lt;/p>
&lt;ol>
&lt;li>적절한 &lt;span class="math math-inline">\(x_0\)&lt;/span>에서 시작한다.&lt;/li>
&lt;li>점화식 &lt;span class="math math-inline">\(x_{n&amp;#43;1}=g(x_n)\)&lt;/span>을 계속 반복한다.&lt;/li>
&lt;li>2번 과정이 수렴하면, 이 수렴값은 고정점이며, 그 고정점은 우리가 찾는 해다.&lt;/li>
&lt;/ol>
&lt;p>여기에서 중요한 건, 변형시킨 &lt;span class="math math-inline">\(g(x)\)&lt;/span>의 형태다.&lt;br>
이 &lt;span class="math math-inline">\(g(x)\)&lt;/span>를 어떻게 만드느냐에 따라 이 방법이 성공하느냐 실패하느냐가 갈린다.&lt;/p>
&lt;p>예를 들면, 엄청 간단하게 &lt;span class="math math-inline">\(x=\frac{16}{x^x}\)&lt;/span> 라고 뒀다고 생각해보자.&lt;br>
그럼 점화식은 다음과 같다.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[x_{n&amp;#43;1}=\frac{16}{x_n^{x_n}}\]&lt;/div>&lt;p>&lt;br>
그러나 이 점화식을 계속 사용해보면, 값은 수렴하지 않고 발산해버린다. (&lt;span class="math math-inline">\(2.3 \to 2.36 \to 2.13 \to 3.22 \to \cdots\)&lt;/span>)&lt;br>
이유는 해 근처에서 &lt;span class="math math-inline">\(|g&amp;#39;(x)|&amp;lt;1\)&lt;/span>이라는 조건을 만족하지 않기 때문이다.&lt;br>
이를 &lt;strong>축소사상원리(Contraction Mapping Principle)&lt;/strong> 라고 부른다.&lt;br>
(4.1에서 설명한다.)&lt;/p>
&lt;p>이번엔 좀 더 적절한 방식으로 변형해보자.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[x_{n&amp;#43;1}=e^{\frac{\ln 16}{x_n&amp;#43;1}}\]&lt;/div>&lt;p>아까와 같이 &lt;span class="math math-inline">\(x_0=2.3\)&lt;/span>에서 시작해보자.&lt;br>
&lt;span class="math math-inline">\(x_1\approx2.3168\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(x_2\approx2.3070\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(x_3\approx2.3127\)&lt;/span>&lt;br>
&lt;span class="math math-inline">\(x_4\approx2.3093\)&lt;/span>&lt;/p>
&lt;p>뭔가 2.31 근처를 빙빙 도는 느낌이다.&lt;br>
(이렇게 위아래로 진동하며 수렴하는 것을 &amp;lsquo;나선형 수렴&amp;rsquo;이라고 부른다. Newton-Raphson보다 훨씬 느리지만, 계속 돌리면 결국 같은 값 2.3106으로 간다.)&lt;/p>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-cobweb.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>고정점 반복을 그림으로 그리면 &amp;lsquo;거미줄(cobweb) 다이어그램&amp;rsquo;이 된다. &lt;span class="math math-inline">\(x_n\)&lt;/span>에서 위로 올라가 &lt;span class="math math-inline">\(g\)&lt;/span>를 만나고, 옆으로 가서 &lt;span class="math math-inline">\(y=x\)&lt;/span>를 만나면 그게 &lt;span class="math math-inline">\(x_{n&amp;#43;1}\)&lt;/span>. 왼쪽은 &lt;span class="math math-inline">\(g&amp;#39;\)&lt;/span>의 기울기가 &lt;span class="math math-inline">\(y=x\)&lt;/span>보다 완만해서 안으로 말려 들어가고, 오른쪽은 가팔라서 튕겨 나간다.&lt;/p>
&lt;/blockquote>&lt;p>즉, &lt;span class="math math-inline">\(x\approx2.31\)&lt;/span>로 근사할 수 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">2.3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 2.3168 / 2 2.3070 / 3 2.3127 / 4 2.3093 / 5 2.3113 / 6 2.3101 / 7 2.3108&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="41-contraction-mapping-principle">4.1. Contraction Mapping Principle&lt;/h3>
&lt;p>&lt;span class="math math-inline">\(x=g(x)\)&lt;/span>에서 왜 &lt;span class="math math-inline">\(x^*\)&lt;/span>를 구하는 조건이 &lt;span class="math math-inline">\(|g&amp;#39;(x^*)|&amp;lt;1\)&lt;/span>일까?&lt;/p>
&lt;p>&lt;strong>1. 먼저 직관적으로, 기하학적으로 분석해보자.&lt;/strong>&lt;/p>
&lt;p>&lt;span class="math math-inline">\(x=g(x)\)&lt;/span>의 해가 &lt;span class="math math-inline">\(x^*\)&lt;/span>라는 것은 &lt;span class="math math-inline">\(y=x\)&lt;/span>, &lt;span class="math math-inline">\(y=g(x)\)&lt;/span>의 교점의 &lt;span class="math math-inline">\(x\)&lt;/span>좌표가 &lt;span class="math math-inline">\(x^*\)&lt;/span>라는 뜻이기도 하다.&lt;/p>
&lt;p>이때, &lt;span class="math math-inline">\(|g&amp;#39;(x^*)|&amp;lt;1\)&lt;/span>의 의미는 &lt;span class="math math-inline">\(g(x)\)&lt;/span> 그래프의 &lt;span class="math math-inline">\(x^*\)&lt;/span>에서의 접선의 기울기가 1보다 작다는 뜻.&lt;br>
즉, &lt;span class="math math-inline">\(y=x\)&lt;/span>의 기울기보다 완만하다는 뜻.&lt;br>
그래서 점화식의 과정을 그래프로 나타내보면 점점 &lt;span class="math math-inline">\(x^*\)&lt;/span>와의 거리가 줄어드는 것이다.&lt;/p>
&lt;p>반대로, &lt;span class="math math-inline">\(|g&amp;#39;(x^*)|&amp;gt;1\)&lt;/span>이면 &lt;span class="math math-inline">\(y=x\)&lt;/span>의 기울기보다 가파르게 되어서&lt;br>
점화식의 과정 그래프가 &lt;span class="math math-inline">\(x^*\)&lt;/span>에서 튕겨나가게 된다.&lt;br>
즉 발산하게 된다.&lt;/p>
&lt;p>&lt;strong>2. 직관에서 좀 더 나아가, 평균값 정리를 이용해 축소사상원리를 증명할 수 있다.&lt;/strong>&lt;/p>
&lt;p>평균값 정리를 기억하는가?&lt;/p>
&lt;blockquote>
&lt;p>어떤 그래프가 &lt;span class="math math-inline">\([a, b]\)&lt;/span>에서 연속이고 &lt;span class="math math-inline">\((a, b)\)&lt;/span>에서 미분가능하다면 &lt;span class="math math-inline">\(\frac{f(b)-f(a)}{b-a}=f&amp;#39;(c)\)&lt;/span>를 만족하는 &lt;span class="math math-inline">\(c \in (a,b)\)&lt;/span> 가 적어도 하나 존재한다.&lt;/p>
&lt;/blockquote>&lt;p>결국 미분가능한 함수에서, 그래프 위의 두 점을 이은 선(할선)과 평행한 접선이 반드시 존재한다는 정리다.&lt;/p>
&lt;p>어떤 단계 &lt;span class="math math-inline">\(n\)&lt;/span>에서의 추측값 &lt;span class="math math-inline">\(x_n\)&lt;/span>과 &lt;span class="math math-inline">\(x^*\)&lt;/span> 사이의 오차를&lt;br>
&lt;span class="math math-inline">\(e_n=x_n-x^*\)&lt;/span>라고 정의하자.&lt;br>
그럼 다음 단계의 오차 &lt;span class="math math-inline">\(e_{n&amp;#43;1}\)&lt;/span>은 다음과 같이 정의된다.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[e_{n&amp;#43;1}=x_{n&amp;#43;1}-x^*=g(x_n)-g(x^*)\]&lt;/div>&lt;p>이때, 평균값 정리에 따라 &lt;span class="math math-inline">\(x_n\)&lt;/span>과 &lt;span class="math math-inline">\(x^*\)&lt;/span> 사이의 어떤 점 &lt;span class="math math-inline">\(c\)&lt;/span>에 대해 다음이 성립한다.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[g(x_n)-g(x^*)=g&amp;#39;(c)(x_n-x^*)\]&lt;/div>&lt;p>이를 위의 오차에 대입하면,&lt;br>
&lt;/p>
&lt;div class="math math-block">\[e_{n&amp;#43;1}=g&amp;#39;(c)\cdot e_n\]&lt;/div>&lt;p>&lt;br>
마지막으로 위 식의 양변에 절댓값을 취하면&lt;br>
&lt;/p>
&lt;div class="math math-block">\[|e_{n&amp;#43;1}|=|g&amp;#39;(c)|\cdot |e_n|\]&lt;/div>&lt;p>이게 무슨 뜻이냐.&lt;br>
만약 &lt;span class="math math-inline">\(|g&amp;#39;(x)|&amp;lt;1\)&lt;/span>이라면, &lt;span class="math math-inline">\(|g&amp;#39;(c)|\)&lt;/span> 는 1보다 작은 어떤 &lt;span class="math math-inline">\(k\)&lt;/span>가 된다.&lt;br>
&lt;/p>
&lt;div class="math math-block">\[|e_{n&amp;#43;1}| = k\cdot |e_n|\]&lt;/div>&lt;p>&lt;br>
즉 위와 같은 관계가 되어 오차가 매 단계 &lt;span class="math math-inline">\(k\)&lt;/span>배씩 줄어든다.&lt;/p>
&lt;aside class="callout callout-note">
&lt;p class="callout-title">숫자로 확인해보기&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>우리 &lt;span class="math math-inline">\(g(x)=e^{\ln 16/(x&amp;#43;1)}\)&lt;/span>의 도함수는 &lt;span class="math math-inline">\(g&amp;#39;(x)=-\frac{\ln 16}{(x&amp;#43;1)^2}\,g(x)\)&lt;/span>이고, 해 근처에서 &lt;span class="math math-inline">\(g&amp;#39;(x^*)\approx-0.58\)&lt;/span>이다. 절댓값이 1보다 작으니 수렴하고, &lt;strong>부호가 음수&lt;/strong>라서 매번 반대편으로 넘어간다 — 그래서 위에서 본 것처럼 2.3168, 2.3070, 2.3127, … 하고 위아래로 진동(나선형 수렴)한 것이다. 오차가 매 단계 약 0.58배씩만 줄어드니(선형 수렴), 자릿수가 매 단계 두 배가 되는 Newton과 속도 차이가 어마어마하다. 아래 그림이 그 차이다.&lt;/p>
&lt;p>이 원리를 완비거리공간에서 일반화한 것이 &lt;strong>바나흐 고정점 정리(Banach fixed-point theorem)&lt;/strong> 이고, 미분방정식 해의 존재성 증명(Picard 반복)부터 강화학습의 Bellman 연산자 수렴 증명까지 온갖 곳에서 같은 논리가 반복된다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-convergence.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>세 방법 모두 같은 답으로 가지만, 오차가 줄어드는 속도는 전혀 다르다. 로그 축에서 직선이면 선형 수렴, 아래로 꺾여 떨어지면 이차 수렴.&lt;/p>
&lt;/blockquote>&lt;h2 id="5-conclusion">5. Conclusion&lt;/h2>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/CleanShot%202025-10-10%20at%2001.11.19@2x.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>Desmos로 그려본 &lt;span class="math math-inline">\(y=x^{x&amp;#43;1}\)&lt;/span>과 &lt;span class="math math-inline">\(y=16\)&lt;/span>의 교점. &lt;span class="math math-inline">\(x\approx2.31057\)&lt;/span>.&lt;/p>
&lt;/blockquote>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>방법&lt;/th>
&lt;th>필요한 것&lt;/th>
&lt;th>반복 몇 번에 소수 5자리?&lt;/th>
&lt;th>한 줄 요약&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Lambert W (&lt;span class="math math-inline">\(W_1\)&lt;/span>)&lt;/td>
&lt;td>표기법&lt;/td>
&lt;td>— (닫힌 식은 나오지만 계산은 못 함)&lt;/td>
&lt;td>답의 &amp;lsquo;이름&amp;rsquo;을 붙여줌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Newton-Raphson&lt;/td>
&lt;td>&lt;span class="math math-inline">\(f\)&lt;/span>, &lt;span class="math math-inline">\(f&amp;#39;\)&lt;/span>&lt;/td>
&lt;td>2번&lt;/td>
&lt;td>접선의 &lt;span class="math math-inline">\(x\)&lt;/span>절편으로 점프, 이차 수렴&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>고정점 반복&lt;/td>
&lt;td>잘 고른 &lt;span class="math math-inline">\(g\)&lt;/span>&lt;/td>
&lt;td>약 15번&lt;/td>
&lt;td>축소사상이면 수렴, 선형 수렴&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>이분법&lt;/td>
&lt;td>부호가 바뀌는 구간&lt;/td>
&lt;td>약 18번&lt;/td>
&lt;td>느리지만 절대 안 망함&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Newton-Raphson도, 고정점 반복도, Desmos도 전부 같은 곳(&lt;span class="math math-inline">\(x\approx2.3106\)&lt;/span>)을 가리킨다.&lt;br>
모르는 걸 알게 되어서 기분은 좋았다.&lt;br>
근데 내 두 시간은 어디 갔지?&lt;/p>
&lt;h2 id="참고-자료">참고 자료&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Lambert_W_function" target="_blank" rel="noopener noreferrer">Lambert W function — Wikipedia&lt;/a>: 가지 구조, 급수 전개, 어디에 쓰이는지 총정리.&lt;/li>
&lt;li>István Mező, Árpád Baricz, &lt;a href="https://arxiv.org/abs/1408.3999" target="_blank" rel="noopener noreferrer">&lt;em>On the generalization of the Lambert W function&lt;/em>&lt;/a>, Trans. Amer. Math. Soc. 369 (2017). &lt;span class="math math-inline">\(xe^x&amp;#43;rx=a\)&lt;/span>의 해 &lt;span class="math math-inline">\(W_r(a)\)&lt;/span> — 이 글의 &lt;span class="math math-inline">\(W_p\)&lt;/span>가 정확히 이것.&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Newton%27s_method" target="_blank" rel="noopener noreferrer">Newton&amp;rsquo;s method — Wikipedia&lt;/a>, &lt;a href="https://en.wikipedia.org/wiki/Fixed-point_iteration" target="_blank" rel="noopener noreferrer">Fixed-point iteration — Wikipedia&lt;/a>, &lt;a href="https://en.wikipedia.org/wiki/Banach_fixed-point_theorem" target="_blank" rel="noopener noreferrer">Banach fixed-point theorem — Wikipedia&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.lambertw.html" target="_blank" rel="noopener noreferrer">&lt;code>scipy.special.lambertw&lt;/code>&lt;/a>: 표준 Lambert W를 파이썬에서 바로 계산할 때. (&lt;span class="math math-inline">\(x^x=a\)&lt;/span> 같은 문제는 &lt;span class="math math-inline">\(x=\ln a/W(\ln a)\)&lt;/span>로 닫힌 식이 나온다.)&lt;/li>
&lt;/ul></content:encoded></item></channel></rss>