# Runge 현상(Runge’s phenomenon)

#### 배경

다항식 보간에서 대표적으로 알려진 함정 중 하나가 Runge 현상이다. 이는 특정 구간에서 등간격(equidistant)으로 노드를 선택하여 다항식 보간을 수행할 때, 보간 다항식의 차수가 높아짐에 따라 함수가 오히려 심하게 진동하며, 구간 말단부에서 오차가 폭발적으로 증가하는 현상을 말한다. 이 문제는 단순히 고차 다항식으로 갈수록 근사 정확도가 좋아진다는 직관과 대치되기 때문에, 수치해석 초기 연구부터 큰 주목을 받아 왔다.

#### 고전적 예

가장 고전적인 예는 다음과 같은 함수를 고려하는 것이다.

$$
f(x) = \frac{1}{1 + 25x^2}.
$$

이 함수를 구간 $x \in \[-1,1]$에서 등간격으로 $n+1$개 노드를 잡아 다항식 보간을 수행하면, $n$이 커질수록 $x=\pm 1$ 부근에서 보간 다항식이 원래 함수값을 크게 벗어나는 진동이 생긴다.

이 과정을 좀 더 형식적으로 살펴보기 위해, 구간 $\[-1,1]$을 $n$개의 등분점을 기준으로 다음과 같이 나눈다고 가정한다.

$$
x\_k = -1 + \frac{2k}{n}, \quad k=0,1,\dots,n.
$$

함수 $f$를 위 노드 ${x\_k}$에서 보간하는 다항식 $P\_n(x)$를 생각하면, $n$이 증가함에 따라 $P\_n(x)$가 $f(x)$에 수렴하지 않고, 말단부에서 심한 오차가 발생한다. 이와 같은 결과는 직관적으로 이해하기 어려우며, 다항식 보간에서 일반적으로 기대되는 “노드 수가 많아질수록 더 정확해진다”라는 원리에 정면으로 배치된다.

#### 다항식 보간 정식

보간 다항식 $P\_n(x)$를 라그랑주(Lagrange) 다항식 형태로 쓰면

$$
\begin{align} P\_n(x) &= \sum\_{k=0}^n f(x\_k),\ell\_k(x),\\
\ell\_k(x) &= \prod\_{\substack{0 \le j \le n \ j \neq k}} \frac{x - x\_j}{x\_k - x\_j}. \end{align}
$$

여기에서 $\ell\_k(x)$는 $k$번째 기준함수(basis function)에 해당한다. 보간 다항식의 계수나 형태는 위 식으로 구할 수 있으며,

$$
P\_n(x\_k) = f(x\_k), \quad k=0,1,\dots,n
$$

를 만족한다.

#### Runge 현상의 정성적 이해

함수 $f(x) = 1/(1+25x^2)$는 구간 $\[-1,1]$에서 비교적 매끄럽고, 극점도 $x = \pm i/5$ 부근에 존재하기 때문에 보간에 적합해 보이지만, 실제로 등간격 노드를 사용할 경우 높은 차수에서 보간 다항식이 급격히 진동한다.

이유를 간단히 살펴보면, 라그랑주 보간 다항식의 오차항은 특정 노드 배치 방식에서 커질 수 있는 구조를 갖는다. 특히, 등간격 노드를 사용할 경우 서로 멀리 떨어진 구간의 값들을 동시에 만족시키기 위해 높은 차수 다항식이 구간 말단부 근방에서 크게 요동하게 된다.

#### 구체적 수치적 관찰

$n$이 증가할수록 등간격 노드를 사용하여 구성한 $P\_n(x)$가 구간 내부 일부 지점에서는 $f(x)$에 잘 근사하는 것처럼 보이지만, 구간 끝단 부근에서는 $P\_n(x)$가 크게 발산하는 양상을 나타낸다. 이 현상을 그래프로 관찰하면, 원래 함수 $f(x)$는 완만한 곡선임에도 불구하고 $P\_n(x)$가 언더슈트(undershoot)와 오버슈트(overshoot)를 번갈아 보이며 진동 폭이 계속 증가한다.

이를 더 명확히 표현하려면, 보간 오차를 노름의 관점에서 정의할 수 있다. 구간 $\[-1,1]$에서 최대 오차를 다음과 같이 놓는다.

$$
E\_n = \max\_{x \in \[-1,1]} \bigl|f(x) - P\_n(x)\bigr|.
$$

Runge 현상이 발생하면 $n \to \infty$로 갈 때 $E\_n$이 충분히 줄어들기는커녕, 오히려 특정 $n$ 이후로 계속 증가하는 양상을 보이기도 한다.

이런 진동과 오차 폭발은 다항식 계수들의 값이 급격히 커지기 때문인데, 등간격 노드 선택 방식에서는 사실상 이를 억제하기 어렵다. 따라서 이런 문제를 피하기 위해서는 적절한 노드 선택 전략, 대표적으로 Chebyshev 노드나 그 외의 특수한 분포의 노드를 사용하는 방법이 많이 쓰인다.

#### 그래프적 시각화(mermaid 예시)

아래 mermaid 코드는 Runge 현상이 발생하는 $P\_n(x)$와 원래 함수 $f(x)$를 모식도로 표현한 것이다. 실제로는 연속값 그래프이지만, 개념적으로 진동 구조만을 보여 주기 위해 정성적인 그림을 나타낸다.

{% @mermaid/diagram content="graph LR
A((시작)) --> B(등간격 노드: x\_0, x\_1, ... , x\_n)
B --> C("보간 다항식 P\_n(x) 구성")
C --> D\[진동 발생 구간에서 오차 증가]
D --> E((결과: Runge 현상))" %}

계속해서 이러한 현상을 수식적으로 더 깊이 살펴보고, 노드 선택 전략의 변화를 통해 어떻게 극복할 수 있는지 자세히 다루어 보자.

#### 오차항(Error Term) 분석

다항식 보간의 오차를 고전적으로 살펴보면, 함수 $f$가 $(n+1)$번 미분 가능한 경우

$$
\begin{align} f(x) - P\_n(x) &= \frac{f^{(n+1)}(\xi\_x)}{(n+1)!} \prod\_{k=0}^n (x - x\_k) \end{align}
$$

와 같은 형태로 표현할 수 있다(단, 어떤 $\xi\_x$가 존재한다는 가정). 이는 마찬가지로 라그랑주형 보간 다항식에서

$$
\begin{align} f(x) - P\_n(x) &= \frac{f^{(n+1)}(\xi\_x)}{(n+1)!} (x - x\_0)(x - x\_1) \cdots (x - x\_n). \end{align}
$$

로도 볼 수 있다. 이처럼 오차는 $(x-x\_0)(x-x\_1)\cdots(x-x\_n)$ 항에 의존하게 되는데, 노드 $x\_k$가 등간격으로 배치되었을 때, 이 항이 구간 끝 부분에서 크게 발산함을 짐작할 수 있다.

#### 라그랑주 보간에서의 Lebesgue 상수

다항식 보간에서의 오차를 측정하는 또 다른 기법은 보간 연산자의 노름을 보는 것이다. 구간 $\[-1,1]$에서 라그랑주 보간 연산자를 $L\_n$이라 하면,

$$
P\_n(x) = L\_n[f](https://booiljung.gitbook.io/booil-jung/docs/math/introductions_to_numerical_analysis/chapter_06/x),
$$

다음과 같이 정의할 수 있다. 여기서 보간 오차는

$$
|f - P\_n|*{\infty} \le \bigl|I - L\_n\bigr| ,|f|*{\infty}
$$

와 같이 주어지는데, $|I - L\_n|$(연산자 노름)은 노드 선택에 따라 달라진다. 이 노름은 곧 “Lebesgue 상수”로 알려져 있으며, 라그랑주 기저함수들의 합의 최댓값으로 표현할 수 있다. 즉,

$$
\begin{align} \bigl|I - L\_n\bigr| &= \max\_{x \in \[-1,1]}  \sum\_{k=0}^n \bigl|\ell\_k(x)\bigr|. \end{align}
$$

여기서 $\ell\_k(x)$는 라그랑주 기저다항식이다.

Lebesgue 상수를 정성적으로 보면, 노드가 등간격으로 놓였을 때는 $n$이 증가함에 따라 매우 빠르게 증가하기 때문에, 결국 보간 오차가 제어 불가능한 수준으로 커질 수 있다. 이로 인해 Runge 현상이 발생하는 것이다. 반면, Chebyshev 노드를 사용하면 이 상수의 증가율을 크게 억제할 수 있다.

#### Chebyshev 노드 선택

등간격 노드 대신 Chebyshev 노드(일종의 근점 분포, extremal distribution)를 선택하면, 구간 $\[-1,1]$에서

$$
x\_k = \cos\Bigl(\frac{(2k+1)\pi}{2(n+1)}\Bigr), \quad k=0,\dots,n
$$

등의 방식으로 정한다(여러 가지 정의 방법이 있으나, 일반적인 한 표현이다). 이렇게 노드를 잡으면, 라그랑주 기저다항식 $\ell\_k(x)$의 진동이 구간 양 끝단에서 크게 억제되고, 결과적으로 보간 오차가 등간격 노드에 비해서 훨씬 안정적으로 유지된다.

Chebyshev 노드에서의 보간 다항식을 $P\_n^\*(x)$라 하면, 등간격 노드에서의 $P\_n(x)$와 달리,

$$
\max\_{x \in \[-1,1]} \bigl|f(x) - P\_n^\*(x)\bigr|
$$

가 $n$ 증가 시에도 훨씬 완만하게 감소하거나, 최소한 폭발적으로 증가하지 않는다. 실제로 체비셰프 다항식의 분포 특성상, 레베그 상수가

$$
\Lambda\_n \approx \frac{2}{\pi}\ln(n+1) + C
$$

정도(또는 그와 비슷한 오더)로만 증가하기 때문에, 등간격 노드에서의 지수적(또는 그에 준하는 급격한) 성장에 비해 오차를 훨씬 잘 제어할 수 있다.

#### Hermite 보간, Spline 보간과의 비교

Runge 현상이 나타나는 가장 대표적인 맥락은 ‘고차의 단일 다항식 보간’이다. 하지만 다항식이 아니라 스플라인(spline) 보간이나, 미분값까지 고려하는 Hermite 보간 등을 사용하면, 구간을 여러 조각으로 나누거나(스플라인), 보간식 자체에 추가 제약을 주기(Hermite) 때문에, 전체 구간에서 극심한 진동이 발생하는 현상이 완화된다.

스플라인 보간 예에서는 각 세그먼트(segment)마다 저차수(주로 3차)의 다항식만 사용하므로, 국소 구간에서의 예측 가능성이 좋아 오차가 폭발적으로 커지는 일이 매우 드물다. Hermite 보간의 경우, 보간점에서의 함수값뿐 아니라 1계(혹은 더 높은 차수)의 도함수값을 함께 매칭하기 때문에, 적절한 미분값이 주어지면 불필요한 굴곡이 줄어드는 효과가 있다.

#### mermaid 예시(노드 분포 비교)

아래 mermaid 코드는 등간격 노드 vs. Chebyshev 노드 배치를 개념적으로 간단히 나타낸 것이다.

{% @mermaid/diagram content="graph LR
A(("\[-1,1] 구간")) --> B\[등간격: x\_0, x\_1, ... , x\_n]
A --> C\[Chebyshev: x\_0\*, x\_1\*, ... , x\_n\*]
B --> D(높은 차수 보간 시 진동 확대)
C --> E(높은 차수 보간 시 진동 완화)" %}

이를 더 분석하기 위해, Runge 예제 함수를 직접 컴퓨터로 실험해 보면 효과를 명확히 파악할 수 있다.

#### 간단한 실험 예시 (Octave)

아래 코드는 $f(x) = 1/(1 + 25x^2)$를 $\[-1,1]$ 구간에서 보간할 때, 등간격 노드와 Chebyshev 노드 각각으로 보간하고, 결과 그래프 및 오차를 관찰할 수 있는 예시다.

```octave
% 등간격 노드 vs. Chebyshev 노드 비교

f = @(x) 1./(1 + 25*x.^2);

n = 10; % 노드 개수 - 1
x_equi = linspace(-1, 1, n+1); % 등간격 노드
x_cheb = zeros(1,n+1); 
for k = 0:n
    x_cheb(k+1) = cos((2*k+1)*pi/(2*(n+1)));
end

% Lagrange 보간 다항식 계산 함수
function y = lagrange_interpolation(x, xnodes, fnodes)
    N = length(xnodes);
    y = zeros(size(x));
    for i = 1:N
        L = ones(size(x));
        for j = 1:N
            if j ~= i
                L = L .* (x - xnodes(j)) ./ (xnodes(i) - xnodes(j));
            end
        end
        y = y + fnodes(i)*L;
    end
end

f_equi_nodes = f(x_equi);
f_cheb_nodes = f(x_cheb);

xx = linspace(-1, 1, 1000);
P_equi = lagrange_interpolation(xx, x_equi, f_equi_nodes);
P_cheb = lagrange_interpolation(xx, x_cheb, f_cheb_nodes);

plot(xx, f(xx), 'k', 'linewidth', 2); hold on;
plot(xx, P_equi, 'r--'); 
plot(xx, P_cheb, 'b-.');
legend('Original f', 'Equidistant', 'Chebyshev');
```

위 코드를 실행하면, $n=10$ 정도에서도 등간격 노드로 구성한 보간 다항식이 구간 끝단에서 크게 요동하는 모습을 확인할 수 있는 반면, Chebyshev 노드는 상대적으로 안정적인 형태를 유지함을 확인할 수 있다.

#### Newton 보간(Newton Form) 관점에서의 해석

다항식 보간은 일반적으로 라그랑주(Lagrange) 형태로 표현되는 것 외에도, 뉴턴(Newton) 형태로도 나타낼 수 있다. 뉴턴 보간 다항식은 “차분(coefficient)을 단계적으로 계산하여 축적”하는 방식으로 구성되는데, $n$차 다항식 $P\_n(x)$를

$$
P\_n(x) = a\_0 + a\_1 (x - x\_0) + a\_2 (x - x\_0)(x - x\_1) + \cdots + a\_n (x - x\_0)(x - x\_1)\cdots(x - x\_{n-1})
$$

와 같은 모양으로 쓴다. 이때 계수 $a\_k$는 함수값과 전진차분(forward difference) 연산을 통해 얻게 된다.

등간격 노드 $x\_k$에서 뉴턴 보간 계수 $a\_k$를 구하다 보면, 특정 구간 끝단의 함수값이 “높은 단계의 차분”에 큰 기여를 하게 되며, 그 결과로서 고차 항의 계수들이 빠르게 커질 수 있다. 이것이 곧 구간 말단부에서 심각한 진동을 일으키는 주요 원인이 된다. 실제로, 등간격 노드에서

$$
\Delta^m f(x\_0) \approx \sum\_{k=0}^m \binom{m}{k}(-1)^{m-k} f(x\_0 + k,h),
$$

($h$는 노드 간격) 같은 형태의 유한차분을 구해 보면, $m$이 커질수록 작지 않은 부호 변동과 값의 증폭을 일으킬 가능성이 있다. 이는 곧 뉴턴 보간 다항식의 “후미 항들”이 구간 말단에서 폭발적인 진동을 유발할 수 있음을 시사한다.

한편, Chebyshev 노드를 적용하면 뉴턴 보간의 계수 역시 보다 안정적으로 억제된다. 노드 분포 자체가 $\[-1,1]$ 구간의 말단부에서 밀도가 높기 때문에, 큰 진동을 발생시키는 고차 항 계수가 등간격 노드에 비해 상대적으로 작아진다.

#### 직교다항식(Orthogonal Polynomials)과의 연관

Runge 현상을 다항식의 관점에서 더 정교하게 설명하기 위해서는, 직교다항식의 개념을 고려해 볼 수도 있다. 예를 들어, 구간 $\[-1,1]$ 위에서 정의된 Legendre 다항식(르장드르 다항식) $P\_n(x)$이나, Chebyshev 다항식 $T\_n(x)$ 등은 특정 가중함수 하에서 서로 직교(orthogonal)한다.

Chebyshev 다항식을 예로 들면,

$$
T\_n(x) = \cos\bigl(n \arccos x\bigr), \quad x \in \[-1,1],
$$

로 정의되는데, 이는 구간 끝단( $x = \pm 1$ )에서 크기가 매우 커지거나, 진동이 격렬하게 일어나지 않도록 정교하게 제어된다. 일반적 다항식을 그대로 사용하는 것에 비해, 적절한 가중 함수를 두고 직교성을 부여하면, 고차 항을 포함하더라도 계수들이 균형 있게 형성되어 큰 진동을 예방하는 효과가 있다.

한편, 단순 다항식 보간과 달리 정규직교다항식을 기저로 한 전개(예: Legendre 다항식 전개, Chebyshev 다항식 전개)로 근사하면, 체비셰프 노드 분포와 유사한 배치를 스스로 유도하거나, 최소 제곱(error) 등 특정 기준으로 최적화된 다항식을 도출하기도 한다. 이러한 관점에서, 등간격 노드 선택은 직교다항식과 무관하게 점을 “균등 분포”로 놓는 것이므로, 직교적 성질을 제대로 살리지 못해 오차가 증폭될 가능성이 크다.

#### 다항식의 최대진폭(Bernstein 부등식)

실함수론과 근사이론(approximation theory)에서 종종 사용되는 Bernstein 부등식 등은, $\[-1,1]$에서 정의된 다항식 $p\_n(x)$의 도함수나 크기에 대한 상계(upper bound)를 제시한다.

$$
|p\_n'(x)| \le n^2 \max\_{|x|\le 1} |p\_n(x)|
$$

등과 같은 형태를 보통 볼 수 있는데(계수나 상수는 문헌마다 다를 수 있다), 이는 고차 다항식이구간의 말단에서 얼마나 빨리 커질 수 있는가에 대한 지표를 제공한다.

Runge 현상은 보간 다항식이 구간 양 끝단에서 실제 함수에 비해 급격히 (도함수 기준으로도) 커져 버리는 문제와 직결되므로, 이런 부등식들은 사실상 “등간격 노드로 잡힌 고차 다항식에서 일어날 수 있는 과도 진동”을 이론적으로 뒷받침해 주는 역할도 한다.

#### 지역적 보간 vs. 전역적 보간

Runge 현상이 중요한 이유 중 하나는, 구간 전체에 걸쳐서 하나의 단일 다항식을 쓰는 ‘전역적 보간(global interpolation)’ 접근에 내재된 한계가 드러나기 때문이다. 실제로 산업 현장이나 실험 데이터 분석 상황에서는, 전역 보간보다는 국소 구간별로 나누어 안전하게 저차 다항식을 붙이는 스플라인 보간을 많이 활용한다. 이는 각 구간이 작고, 노드가 밀집 배치되므로, Runge 현상 같은 대규모 진동이 발생하기 어렵기 때문이다.

특히, $n$이 매우 커질 때, 전역 다항식 보간은 불안정성이 누적되어 “난조”를 일으키기 십상이다. 반면, 지역적 보간 기법(예: spline)은 각 구간마다 낮은 차수를 유지하므로 비교적 안정성이 높고, 구현면에서도 계산 복잡도가 크게 증가하지 않는다.

#### 적응적(Adaptive) 방법

만약 구간 내 특정 지점에서 오차가 지나치게 크다고 판단될 경우, 해당 지점을 경계로 삼아 구간을 잘게 세분하거나, 새 노드를 추가로 배치하는 적응적 보간(adaptive interpolation) 기법도 고려할 수 있다. 이는 고정된 노드 분포에서 “함수의 모든 특성을 한 번에 반영”하려는 전역적 접근보다 훨씬 유연한 방안이다.

예를 들어, $\[-1,1]$ 안에서 함수가 평탄한 구간에는 노드를 상대적으로 적게 배치하고, 기울기가 급변하거나 곡률(curvature)이 큰 구간에는 노드를 더 촘촘히 두어, 전역적 고차 다항식 한 개 대신 구간별로 최적 차수를 가지는 다항식(혹은 스플라인)을 구성해 나간다면, Runge 현상 같은 폭발적 진동을 상당 부분 피할 수 있게 된다.

#### Minimax 근사와 Remez 알고리즘

전역 다항식으로 함수 $f(x)$를 근사하려 할 때, 단순히 보간(interpolation)만을 고려하지 않고, $L^\infty$ 노름(또는 최대 노름)에서의 오차를 최소화하는 “최적 근사 문제”를 생각해 볼 수 있다. 이를 “minimax 근사”라고 부르며, 구간 $\[-1,1]$에서 다음과 같은 문제를 정의한다.

$$
\min\_{p \in \Pi\_n} \bigl| f - p \bigr|\_{\infty},
$$

여기서 $\Pi\_n$는 차수 $n$ 이하의 모든 다항식으로 이루어진 집합이다. 즉, 보간의 개념( $f(x\_k) = p(x\_k)$ )을 넘어, 구간 전체에서 최대 오차가 가장 작아지도록 하는 다항식 $p^\*(x)$를 구하고자 한다. 이 문제를 해결하기 위한 대표적인 수치 기법이 Remez 알고리즘이다.

minimax 근사의 결과로 얻어지는 다항식 $p^\*(x)$를 종종 “Chebyshev 근사”라고도 일컫는데, 이는 근사 정밀도를 높이기 위해 Chebyshev 다항식과 긴밀히 연결되어 있기 때문이다. 이 방식으로 구하면, 등간격 노드 보간에서 발생하는 Runge 현상을 회피할 수 있고, 구간 말단부에서의 진동도 유의미하게 억제된다.

#### 다항식 vs. 유리함수(또는 Padé 근사)

Runge의 고전 예시에서 $f(x)=1/(1+25x^2)$는 본질적으로 유리함수(rational function)에 속한다. 이 함수를 단순한 다항식만으로 보간하려고 하면, 극점( $x=\pm i/5$ )이 실축(real axis) 바깥에 있긴 하지만, 고차 항 계수가 크게 형성되어 경계 부근에서 진동이 심해지는 문제가 생긴다.

만약 유리함수 형태, 예컨대

$$
R\_m^n(x) = \frac{p\_m(x)}{q\_n(x)}
$$

식으로 근사할 수 있다면(이를 Padé 근사 등으로 구할 수도 있다), 극점 구조를 보다 직접적으로 다룰 수 있게 되므로, 단순 다항식 보간에서 발생했던 큰 오차가 줄어드는 경향이 있다. Padé 근사는 주로 멱급수(파워 시리즈) 전개가 가능한 구간 또는 함수에 대해 탁월한 성능을 보이며, Runge 현상을 효과적으로 완화하거나, 대체할 수 있는 방안 중 하나로 종종 언급된다.

#### Best uniform approximation 이론적 특징

Bernstein, Chebyshev, Markov 등 고전적 근사이론 연구자들은 $\[-1,1]$ 구간에서의 best uniform approximation 문제를 심도 있게 다루었다. 이론적으로, $f(x)$가 적절한 연속성과 해석적(analytic) 특성을 가진다면, 구간 외부의 복소평면 상 극점들과의 거리, 그리고 체비셰프 다항식의 극값 분포가 맞물려, 최적 근사 함수의 구조가 정해지는 것으로 알려져 있다.

쉽게 말해, 구간 경계에서 발생하는 진동을 가능한 한 균등 분포로 배치하고, 그 진동 폭이 최소가 되도록 설계하는 것이 minimax 관점의 핵심이다. 등간격 노드 보간은 이런 “균등 진동 분포”를 달성하지 못하기 때문에, 말단부에서 오차가 폭발하게 된다.

#### 예시 시뮬레이션

아래는 Python으로 Remez 알고리즘을 통한 minimax 다항식 근사를 간단히 시도해 볼 수 있는 코드 골격이다. 실제로는 구현 난이도가 좀 있으나, 파이썬 라이브러리를 활용하면 손쉽게 시도할 수 있다.

```python
import numpy as np
import matplotlib.pyplot as plt

# f(x) 정의
def f(x):
    return 1.0/(1.0 + 25.0 * x**2)

# Remez 알고리즘(단순 버전) 함수 골격
# 실제 알고리즘은 여러 단계 반복과 수렴 판정이 필요
def remez_minimax(f, n, max_iter=20):
    # 초기 추정: Chebyshev 노드에서 샘플링
    x = np.cos((2.0*np.arange(n+2)+1.0)*np.pi/(2.0*(n+2)))
    x = np.sort(x)
    
    for it in range(max_iter):
        # 보간 다항식 계수 구하기 (등차 or 등분 등 자유)
        # 여기서는 단순히 라그랑주 형태를 가정 (실제로는 업데이트 과정을 반복해야 함)
        # ...
        # 보간 결과에 대해 f(x_i) - p(x_i) 잔차를 확인
        # 가장 큰 양의 오차와 가장 큰 음의 오차를 갖는 지점 찾아 이리 미세 조정
        # ...
        pass
    # (실제 구현 시) 여기에서 계수나 배점 등을 반환
    return None

n = 5
rem = remez_minimax(f, n)

xx = np.linspace(-1,1,400)
# p_minimax = ...
# plt.plot(xx, f(xx), 'k', label='f')
# plt.plot(xx, p_minimax(xx), 'r--', label='Minimax degree=5')
# ...
plt.show()
```

이와 같은 접근을 실제로 완성하면, 등간격 노드 보간에서 나타나는 Runge 현상과 비교할 수 있는 “최적 근사” 다항식을 구할 수 있다. 일반 보간보다 훨씬 진동이 적으며, 말단부에서의 오차도 잘 억제되는 모습을 볼 수 있다.

\---적 논의

다항식 보간에서 고차로 갈수록 더욱 정확해지리라 기대하는 것은, 노드 분포가 “적절히” 설정되어 있지 않으면 성립하기 어렵다. 등간격 노드 보간은 고전적인 반례인 Runge 현상을 통해, 오히려 오차가 구간 끝에서 급격히 커지는 문제가 있음을 극명하게 보여 준다.

이를 해결하기 위한 방법에는 Chebyshev 노드 선택, 스플라인 보간(국소 저차 보간), 적응적 노드 분포, 유리함수 근사, 그리고 minimax 근사에 이르기까지 다양한 전략이 존재한다. 결국, 실질적인 수치해석 문제에서 “가장 좋은” 방법을 결정할 때에는 보간 대상 함수의 특성(극점의 위치, 매끄러움, 구간 범위 등)과 계산 복잡도(차수, 알고리즘 구현 용이성 등)를 함께 고려해야 한다.
