logo

수치해석에서의 함수 근사 📂수치해석

수치해석에서의 함수 근사

빌드업

수치적인 계산을 할 때 컴퓨터가 인간보다 압도적으로 빠른 것은 사실이지만, 딱히 컴퓨터가 초월함수와 무리수를 이해했기 때문은 아니다. 가령 $\displaystyle \sin {{ \pi } \over {6}} = {{1} \over { 2 }}$ 을 계산시킨다면 삼각함수의 기하학적인 정의를 이용해서 직각삼각형을 그려보고 빗변과 높이의 비를 구하는 게 아니라, 다항함수로 급수전개해서 사칙연산으로 구하는 식이다.

컴퓨터의 입장에서 보자면 $\displaystyle \sin x \approx x - {{x^3} \over {3!}} + {{x^5} \over {5!}}$ 가 진정으로 무엇을 의미하는지는 별로 알 바 아니다. 그냥 사칙연산이 인간보다 빠르니까 있는 다항함수로 된 공식을 가져다 쓸 뿐이다. 그리고 이러한 다항함수가 언제나 존재함은 다음의 정리에 의해 보장되어 있다.

스톤-바이어슈트라스 정리: $f$ 가 $[a,b]$ 상에서 연속이면 주어진 $\epsilon > 0$ 에 대해 $\displaystyle \max_{x \in [a,b]} | f(x) - p (x) | < \epsilon$ 을 만족하는 다항함수 $p(x)$ 가 존재한다.

그런데 ‘컴퓨터의 입장’ 이야기가 나온김에 생각을 해보자면 $\displaystyle {{\pi^{31} } \over {31!}}$ 과 같은 수의 계산은 컴퓨터 입장에서도 상당히 어려움을 알 수 있다. 우선 분자와 분모 둘 다 꽤 길어서 계산 이전에 큰 숫자를 저장하는 것부터가 일인데, 사람과는 달리 계산 순서를 바꾸는 식으로 계산 소요를 줄일 수 있다는 발상도 없기 때문이다. [ NOTE: 사실은 이러한 기교도 암호론 등의 응용수학 분야에서 연속제곱법과 같은 알고리즘으로 구현되어 있긴 하다. ] 거기다 ‘인간의 입장’에서 봤을 때도 테일러 급수는 충분히 작은 $(-h, h)$ 에서만 수렴성이 보장됨을 알고 있다. 이는 사실상 테일러 공식을 이용한 계산이 포인트와이즈pointwise하다는 말이다.

물론 테일러전개는 이론적인 접근에 있어 수학 역사상 최고로 손꼽힐만큼 강력한 툴이지만, 위의 고찰에서 수치적 계산을 위한 공식으로는 별로 좋지 않을 수 있음을 알 수 있다1. 다른 말로, $f(x)$ 를 $$ f(x) \approx \sum_{k=0}^{n} a_{k} \varphi_{n} (x) $$ 와 같은 식으로 계산하고 싶다면 그 베이시스로써 $\displaystyle \left\{ \varphi_{n} (x) = {{x^{n}} \over {n!}} : n \ge 0 \right\}$ 은 별로 좋지 않은 것이다.

그램-슈미트 프로세스: 모든 유한차원 내적공간은 정규직교기저를 갖는다.

다행스럽게도 컴퓨터가 이해할 수 있는 $n$차 다항함수의 집합 $$ \mathbb{Q}_{n} [ x ] := \left\{ p(x) = \sum_{k=0}^{n} a_{k} x^{k} : a_{k} \in \mathbb{Q} \right\} $$ 은 내적 $\left< p_{1} , p_{2} \right>$ 을 계수의 내적으로 정의함으로써 유한차원내적공간이 될 수 있고, 오소노멀 베이시스를 갖는다는 것 자체는 보장되어 있다. 수치해석에서 실제 문제를 해결하기 위해 관심을 가지는 대상은 그 중에서도 특히 다음의 성질들을 가지는 베이시스다.

좋은 베이시스란?

  • (i): $\displaystyle p_{n} (x)$ 이 $\displaystyle \left\{ \varphi_{n} (x) \in \mathbb{Q}_{n} [ x ] : n \ge 0 \right\}$ 의 선형결합으로 나타나며, $\displaystyle \max_{x \in [a,b]} | f(x) - p_{n} (x) |$ 이 원하는만큼 작아지도록 하는 $n \in \mathbb{N}$ 이 존재해야한다.
  • (ii): $p_{n} (x)$ 은 $\displaystyle p_{n} (x) = \sum_{k=0}^{n} a_{k} \varphi_{n} (X)$ 과 같이 계산되는 게 좋다. 즉, 오차를 줄이려고 할 때마다 완전히 새롭게 계산하는 게 아니라 새로운 항을 더함으로써 계산하는 게 좋다.
  • (iii): $| a_{n} |$ 이 빠르게 $0$ 으로 수렴하는 게 좋다. 즉, 최대한 적은 항만 더해도 빠르게 수렴하는 게 좋다.

여기서 계수가 실수인 $\mathbb{R}_{n} [ x ]$ 가 아니라 계수가 유리수인 다항함수의 집합 $\mathbb{Q}_{n} [ x ]$ 을 생각하는 이유는 간단하다. 컴퓨터는 수치적인 계산을 할 때 무리수를 이해하지 못하기 때문이다.


  1. Atkinson. (1989). An Introduction to Numerical Analysis(2nd Edition): p199. ↩︎