수치해석

1. 개요
2. 상세
3. 내용
3.1. 단순화
3.2. 오차
3.3. 코딩
4. 수학과에서
5. 공대에서
6. 컴퓨터공학적인 면에서
7. 룽게-쿠타 방법들
7.1. 오일러 방법
7.2. 개조 오일러 방법
7.3. RK4
7.4. 고차 미분방정식
8. 기타
9. 관련항목

數値解析 / Numerical Analysis

1. 개요

수치해석학이란 어떤 함수나 방정식의 해를 수치적으로 근사해서 해석하고 구하는 알고리즘에 대한 연구를 하는 학문이다. 까놓고 말하자면(?) 컴퓨터에게 노가다를 시키는 과목.

가령, x(t) = t^2 , x'(2) = ? 라는 문제가 주어졌을 때, 이를 해석적으로 해결한다면 x함수의 도함수[1]를 구한 뒤, 도함수에 2라는 값을 넣어서 풀 수 있을 것이다. 대신에 이를 수치적으로 풀면 \frac{x(2+\delta) - x(2-\delta)}{2 \delta }, \delta = 1e-12같이, 참값과 완벽히 같진 않지만 거의 정확하게 구할 수 있다. 이러한 방법론을 수치해석이라고 한다.

2. 상세

순수수학이나 공학에서 다루는 부분은 조금씩 다르지만, 전체적으로 보자면 선형대수 이론의 수치적 계산(Numerical Linear Algebra)[2], 방정식의 수치해 계산, 미분방정식의 수치해 계산 등 지금까지 다뤄진 이론의 계산 방법을 다루는 과목이다. 만약 이 학문의 발전이 더뎠다면 컴퓨터의 발전 역시 없었을 것이며, 계산이 필요한 수많은 분야의 발전 역시 더뎠을 것이다. 당장 컴퓨터에서 사용할 계산 알고리즘의 태반이 수치해석을 기반으로 나온 거다.

보통 고등학교나 대학 1학년 미적분학에서는 미분 배우고 적분을 배우나, 수치해석은 적분을 배우고 미분을 배운다. 학문적 접근방법이 많이 다르다. 적분은 합에 대한 알고리즘, 미분은 차와 나눗셈에 대한 알고리즘이다. 그래서 적분이 앞에 온다.

유한요소해석의 발달로 모델링한 물체의 해석이 쉬워졌다고는 하지만, 고전적 수치해법이 죽은 것은 아니다. 오히려 고전적 수치해법으로 상용 유한요소해석 프로그램이 만들어졌고 또한 그 프로그램이 어찌 돌아가는지에 대한 컨셉을 잡아주는 과목이므로 이 과목은 많은 공과대학에서 의무 수강해야 한다. 고전적 수치해법은 정확도가 담보되므로 100년이 넘어도 유지가 되는 것이다. 원래 수학적 알고리즘은 오래된 기술이 정확도가 높고 간단한 법. 8비트 컴퓨터[3]가 아직도 몇억 대씩 생산되는 이유이기도 하다.

3. 내용

수치해석을 사용하는 이유는 사람의 손으로 못 푸는 문제 때문이다. 예를 들어, 아무것도 없는 텅 빈 공간에 람보르기니 차량 모양의 전도체가 있고 거기에 5V의 전압을 걸었다고 하자. 그럼 그 전도체에 의한 전도체 안팎에서 전자기장의 분포는 어떤 특정한 미분방정식[4] 을 따를 것이고, 그 미분방정식에 경계 조건(Boundary condition)을 대입하여 풀면 모든 지점에서의 전자기장의 방향과 세기를 알 수 있다. 이론적으로는.[5] 그런데 람보르기니 모양의 경계 조건이라는 괴이한 조건 덕에 위 미분방정식의 정확한 해를 구하는 건 불가능할 수도 있으며, 설령 가능하다 하더라도 얻는 데 엄청난 시간이 소요되기 때문에 다른 방법을 모색해야 하는 것이다. 왜 하필 람보르기니인지는 묻지 말자

3.1. 단순화

여러 방법 중 문제를 풀기 쉽게 바꾸는 기법도 일부 존재한다.

수치해석에서 자주 쓰이는 유한요소법(Finite element method)의 예를 들어 보자. 공간을 조각조각 나눔으로써 상황을 단순화 시키고 그 단순화 된 상황을 분석해서 근사적인 방정식의 해를 얻을 수 있다.

3.2. 오차

위에서도 언급했지만, 수치해석은 거의 정확하지만 완벽하지는 않기 때문에, 수치해석으로 나온 결과물이 얼마나 정확한지 파악하는 것이 몹시 중요하다.

3.3. 코딩

위에 나온 기법들을 실제로 구현하는 작업으로, 전공과 무관하게 수치해석에는 입문에는 프로그래밍 언어에 대한 숙련도와 컴퓨터 공학적인 지식을 갖추고 도전하는 것이 좋다. 반대로 해석적으로 미적분을 하거나 미분방정식 풀이를 하는 데 자신이 없지만 코딩을 잘 한다면 도전해볼 만 하다. 물론 수학은 그동안 차근차근 공부해 보아야 한다.

컴퓨터 프로그래밍은 선형대수 라이브러리 활용법과, Plot을 위한 그래픽 라이브러리 활용법을 익힌 후 도전하는 것이 좋다.

만약 라이브러리 사용법에 익숙하지 않다면 지나치게 기초적인 부분까지 일일히 구현하느라 힘든 노가다가 될 것이고, 그래픽에 익숙하지 않으면 결과를 알기 힘들어진다. 보통 미적분학이나 공업수학 교재에 나오는 Plot들을 자유자재로 그릴 수 있을 정도가 기초가 된다.

이론적인 이해와는 별개로 실제 구현에서는 신경써야 할 것이 많기 때문에 프로그래밍을 통해 감을 잡는 것이 좋다. 예를 들면 매트릭스 인덱싱이나 부호를 잘못 설정하는 사소한 실수 때문에 프로그램이 뻗거나 틀린 답을 내는 경험은 자주 있을 것이다.

그리고 속도와 범용성[6], 정확도 문제도 신경써야 하고, 몇몇 알고리즘의 경우 실패 확률[7]까지 있다.

4. 수학과에서

수학과 과목 중 계산과 알고리즘에 치중하는 몇 안 되는 과목이다.

수학과 학부 레벨에서 개강은 되지만 의외로 이 과목의 진의를 강의를 들으며 깨닫는 사람은 그리 많지 않다. 여러가지 이유가 있지만 크게 보면,

(1) 수치해석을 들을 즈음에는 사람들이 추상화된 개념에서 세워진 정의와 명제를 바탕으로 논리적인 추론을 통한 증명에 이미 익숙해진다.[8]

(2) 이 학문의 필요성에 대하여 쉽게 피부로 느끼지 못하는 까닭이다. 계산하는 방법을 신나게 다루면서 손으로 예제를 풀려고 하면 매우 단순한 경우만 보게 된다. 실제로 프로그래밍을 해본다던가, 적어도 패키지를 써보지 않으면 단순 계산 노동일 뿐이다.

(3) 강의의 흐름상, 계산을 중점적으로 다루게 되므로 방법만 안다면야 금방 따라하게 되는 것 또한 수치해석을 단순하게 생각할 수 있다.

(4) 왠지 모르게 수학과의 사파 과목처럼 느껴지는 것도 사실이다.[9]

예를 들어, 학부수준 수치해석에서 초반에 등장하는 뉴턴-랩슨 방법의 경우, 한 점에서 함수식을 미분해서 x절편찾고, 다시 그 x좌표에서 함수식을 미분해서 또 x절편찾고...의 반복으로 주어진 식의 해를 찾아가는 방법이다. 매우 간단하지 않은가?[10] 맘먹고 교수님이 수강생을 계산하는 기계로 만든다면, 아마 같은 학기에 듣게되는 여타 수학과목에 비해 난이도가 최소 2/3 정도로 느껴지게 될 것이다.

이 과목의 의미는 수치에 방점을 찍느냐 해석에 방점을 찍느냐에 따라 매우 다르게 볼 수 있다.

수치에 방점을 찍는 경우 이 과목의 의미는 지금까지 추상적으로 다뤄온 이론을 실제적으로 가져오는 수단을 배운다는 점이다. 학부때 열리는 개론 수준의 과목의 주된 이슈 중 하나는 역행렬을 구하는 방법인데, 의외로 이 작업은 계산이 많이 필요한 작업이다. 선형대수학에서 가우스 소거법을 배운 뒤 역행렬을 구해보려고 하면 5x5쯤 되면 정신없어진다. 하물며 100x100 크기의 역행렬 계산이라면야...

이것뿐만 아니라 여러가지 예가 있겠지만, 요약하자면 수학과의 기초를 형성하는 논리적이고 추상적인 수학의 범주에서는 해는 존재한다 라는 존재성과 유일성이 중요했었다면, 수치해석은 '그래서 그게 얼마인데?'라는 관점으로 접근하는 차이점이 있다고 하겠다. 즉 애초에 목적 자체가 다른 여타의 수학과의 과목들과는 다르다.

해석에 방점을 찍는 경우 이 과목의 의미는 해석학적으로 알고리즘을 분석해본다는 것이다. 위의 뉴턴-랩슨 방법의 예를 다시 보면 해석학에서 왜 수열을 배우고 수렴을 배웠는지를 알게된다. 이 알고리즘은 근사적인 해를 계속 구하여 수열을 만드는 과정이다. 이 수열이 방정식의 해로 수렴하면 알고리즘이 극한에서 방정식의 해를 구하는 올바른 방법이 된다.

이 예에서 보듯이 해석에 방점을 찍는 수치해석은 일반적인 알고리즘 또는 새로 개발한 알고리즘에 관한 다음과 같은 해석학적 질문에 대한 답을 구한다.

  • 이 알고리즘이 수렴하는가? 즉, 알고리즘으로 구성한 해의 근사값의 수열이 수렴하는가?
  • 수렴한다면 문제의 정답으로 수렴하는가?
  • 정답으로 수렴한다면 얼마나 빨리 수렴하는가?
  • 수렴속도 질문의 다른 형태로서, 몇 번을 반복해야 알고리즘의 계산값과 정답의 차이가 주어진 오차범위 안으로 들어오는가?

기초과정에서는 바나흐 부동점 정리를 이용하여 이러한 질문에 대한 답을 하는 방법을 배운다. 이러한 관점에서 보면 수치해석은 전형적인 응용해석학 과목이다. 좀더 고급과정에서는 함수해석의 응용으로 다루어지기도 한다.

5. 공대에서

공학에서는 수학의 추상성보다는 현실적인 해, 최적값을 찾는 것이 더 중요하다. 그러나 공학도들에게도 수치해석이라는 과목은 조금 별나게 느껴진다. 그 이유는 공학만을 다루다가 어찌되었든 조금 특이한 수학을 접하게 되기 때문. 물론 수치해석은 공학도들이 계속 다루게 될 여러 소프트웨어의 바탕이 되기 때문에 굉장히 중요하다. 그래서 공대생들은 한학기 동안 미친듯이 MATLAB 프로그래밍을 하며 수치해석의 이론, 습득까지 수행하게 된다. MATLAB을 사용하지 않는다면 공학용 계산기에라도 프로그래밍을 한다(...). 컴퓨터공학과는 매트랩이 아닌 포트란으로 코드를 짜보는 경우도 있다.

컴퓨터와 같이 계산을 돕는 기기들이 등장하면서, 수치해석의 적용과 발전 정도 또한 역시 괄목할만하게 이루어졌으며 round-off error 같이 기기에서 표현할 수 있는 수의 한계성과 이를 바탕으로 수를 정확하게 나타내려 하는 precision 문제 역시 수치해석의 한 분야로 발전하였다. 따라서, 추후 자신의 진로를 실제 계산이 필요한 연구 계열[11]이나 계산 과학 계열로 지망하는 사람들에게 수치해석 과목은 매우 중요하다 할 수 있겠다.

공대 학부과정 수치해석의 꽃은 4차 Runge-Kutta(RK4)법인데, 미분방정식을 푸는 핵심적 방법이다. 이론 정립 자체는 1900년대경에 나왔지만 현실적으로 가장 간단하게 미분방정식을 푸는 방법이고 또한 정확도가 괜찮은 편이라 실제 현장에서도 자주 사용되고 있다. [12] 하지만, 항공우주공학에서는 보통 RK8/9차를 많이 쓴다.[13] 많은 경우에, 공대에서 배우는 수학적 알고리즘 자체는 1900년엔 이미 99% 완성된 상황이라 봐도 좋다. 그만큼 정확도가 담보된다는 말이다.

6. 컴퓨터공학적인 면에서

프로그래밍을 하려면 수학, 물리학적 지식이 필요하기 때문에 컴퓨터 공학적인 내용만 가지고는 할 수 없다. 반대로, 컴퓨터 공학 개념 중에서 네트워킹이나 데이터베이스 개념은 수치해석에서는 거의 쓸모가 없어질 것이다.

다만 좋은 수치해석 라이브러리를 만드려면, 컴퓨터 아키텍처 맞게 병렬처리[14]같은 최적화도 해 주어야 하고, 과거 포트란이나 C로 작성되었던 라이브러리를 Python 같은 언어로 포팅한다거나, 유닉스/리눅스 환경을 관리한다거나, 오픈 소스처럼 협업이 필요한 경우 버전 관리나 테스팅을 관리해 주어야 하기 때문에, 컴퓨터 공학적인 내용을 알 고 있으면 할 수 있는 일이 많아질 것이다.

사실 새로운 수치해석 방법을 만들어 내려면 이론 수학이나 물리학에 도사가 되어야 하기 때문에, 본인의 머리가 천재 수준이 아니라면 차라리 프로그래밍 기법을 익혀 남들이 논문으로 써놓은 수식이나 알고리즘을 해독하고 구현하는 데 집중하는 것도 좋은 방법이다. 요즘은 컴퓨터 속도 자체가 빨라져서 어지간한 기법들은 집에서도 독학으로 연습해볼 만한 수준이다.

7. 룽게-쿠타 방법들

미분방정식을 풀때 사용되는 대표적인 수치해석 방법들이다. 오일러 방법 (Euler's method), 개조 오일러 방법(modified Euler's method), RK4 등이 있다. 초기조건이 주어졌다면, 작은 시간 구간 h를 사용해서 (t_{n+1} = t_n + h)미방을 만족하는 함수의 값을 어림하는게 주요 포인트.

초기조건이 y(t_0) = y_0인 어떤 함수 y(t)에 대해 y' = f(t, y) 꼴의 미분방정식을 예로 들어서 이것을 수치해석으로 풀 수 있는 룽게-쿠타 방법들을 몇가지 살펴보자.

7.1. 오일러 방법

\displaystyle y_{n+1} = y_n + hf(t_n, y_n)

미방의 가장 기본적인 수치해석 방법. 간단하고 이해하기 쉽지만 그다지 정확하지는 않다. 오차값은 대략 h에 비례한다. 다시말해 스텝사이즈를 반으로 줄이면 오차가 반 정도로 준다. 밑의 예제풀이를 보면 나쁘지 않아 보이지만 실용적인 면에서 쓰기에는 정확성이 턱없이 부족해서 이 방법 자체는 잘 쓰이지 않는다. 다만 이 오일러 방법을 기본으로, 이걸 확장한 더욱 정확한 방법들이 많다.

예제: y' = y, y(0) = 1일때, h = 0.1을 이용해 y(0.1)을 근사해봐라.

참고로 답의 정확한 값은 e^{0.1}로, 약 1.10517091808다. 비교용으로 알아두자.

y(0.1) \approx y(0) + hy'(0, y(0)) = 1 + (0.1)(1) = 1.1 \rightarrow y(0.1) \approx 1.1

7.2. 개조 오일러 방법

\displaystyle k_1 = f(t_n, y_n)

\displaystyle k_2 = f(t_n + h, y_n + hk_1)

\displaystyle y_{n+1} = y_n + \frac{h}{2}(k_1 + k_2)

단순 오일러 기법을 두 번 사용해서 두 기울기 (k_1k_2)를 구하고, 이 두개를 평균내서 나오는 기울기를 초기 기울기로 두고 다음 스텝으로 넘어가는 방법.

예제: y' = y, y(0) = 1일때, h = 0.1을 이용해 y(0.1)을 근사해봐라.

k_1 = f(t_0, y_0) = 1

k_2 = f(t_0 + h, y_0 + hk_1) = 1.1

y(0.1) \approx y(0) + \frac{h}{2}(k_1 + k_2) = 1 + 0.05(1 + 1.1) = 1.105 \rightarrow y(0.1) \approx 1.105

1.10517091808...에 기본적인 오일러 방법보다 더욱 근접한 값인걸 알 수 있다.

하지만 이 개조된 방법 마저도 실제 쓰기에는 정확성이 좀 떨어진다.

7.3. RK4

오일러 방법이 RK1, 개조 오일러 방법이 RK2 라고 할 수 있는데, 일반적으로 Runge-Kutta 방법을 말한다면 이 4th order Runge-Kutta (RK4) 방법을 칭하는것이다[15]. 상당히 정확하기 때문에 실용적인 면에서도 애용되고 있는 수치해석 방법이다.

\displaystyle k_1 = f(t_n, y_n)

\displaystyle k_2 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}k_1)

\displaystyle k_3 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}k_2)

\displaystyle k_4 = f(t_n + h, y_n + hk_3)

\displaystyle y_{n+1} = y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4)

대략적인 설명을 하자면 여러 기울기를 구하고 이 기울기들의 무게평균을 내, 이 최종 기울기로 오일러 방법을 사용하는 것이다.

이 방법의 오차는 대략 h^4에 비례한다. 스텝 사이즈를 반으로 줄이면 오차가 약 16배나 감소한다는 뜻이다.

예제: y' = y, y(0) = 1일때, h = 0.1을 이용해 y(0.1)을 근사해봐라.

k_1 = f(t_0, y_0) = 1

k_2 = f(t_0 + \frac{h}{2}, y_0 + \frac{h}{2}k_1) = 1.05

k_3 = f(t_0 + \frac{h}{2}, y_0 + \frac{h}{2}k_2) = 1.0525

k_4 = f(t_0 + h, y_0 + hk_3) = 1.10525

y(0.1) \approx y(0) + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) = 1 + \frac{0.1}{6}(1 + 2.1 + 2.105 + 1.10525) = 1.10517083333... \rightarrow y(0.1) \approx 1.10517083333...

이번에는 1.10517091808...에 무지무지 가까운게 눈에 띈다! 오리지날 오일러 방법하고는 비교하기도 민망한 수준. 계산하는데 시간은 약 4배가 걸렸지만 오차값은 수배나 더 작다.

참고로 이보다도 더더욱 정확한 Runge-Kutta 방법들도 있지만, 거기까지 가면 너무 복잡해지므로 이 문서에서는 여기까지만 기술하도록 한다. 사실 RK4 까지만 알아도 왠만한 상미방 수치해석에는 문제없다.

7.4. 고차 미분방정식

룽게-쿠타 방법은 1차 상미분방정식에게만 먹힌다. 하지만 그렇다고 해서 2차이상의 미방을 계산할때 쓸모없는건 아니다. 그냥 고차 미분방정식을 연립 1차 미방으로 만들면 된다.

예를 들어서 진동폭이 매우 큰 단진자[16] 시뮬레이션을 만들고 싶다고 가정하자. (저항이나 마찰이 없을때) 단진자 운동을 기술하는 미분방정식은

\theta'' = -\frac{g}{l} \sin(\theta)

이다. \theta' = \omega라 하고 이걸 연립 1차 방정식으로 바꿔서 각각 미방에 RK4를 사용하면 된다.

참고로 연립미방은 다음과 같다.

\theta' = \omega

\omega' = -\frac{g}{l} \sin(\theta)

8. 기타

전쟁에서도 수치해석은 많이 쓰였다. 특히 탄도학의 발달에 수치해석이 기여한 면이 크다. 몇몇 수치해석 알고리즘은 탄도학에서 출발했으며, 존 폰 노이만은 내폭형 원자폭탄에 쓰이는 폭축 렌즈 개발에 수치해석 기법을 사용했다.

9. 관련항목


  1. [1] 쓰자면 x'(t)이란 식이 얻어진다.
  2. [2] '수치 선형대수학'이라고도 한다.
  3. [3] 말이 대단해 그렇지, 자판기의 동전 인식 시스템이 8비트 컴퓨터다.
  4. [4] 여기서는 라플라스 방정식.
  5. [5] 다만 여기서는 미분방정식을 직접 푸는 방법만 언급했지만 몇몇 상황에서는 방정식을 직접 풀지 않고도 해결할 수 있다. 람보르기니 모양의 전도체에 대해선 의미없지만...
  6. [6] 하드코딩을 남발하거나, 이론적인 깊이가 얕으면 풀 수 있는 문제의 범주가 좁아지는 경우가 많다.
  7. [7] 예를 들면 극댓점, 극솟점을 찾아야 하는 알고리즘
  8. [8] 대부분 수학과 커리큘럼 상 2학년 후반 내지는 3학년 즈음에 이 과목을 수강하게 된다. 극단적인 경우, 대수학 관련 과목과 위상수학 등을 꾸준히 듣다가 수치해석을 듣게 되면...
  9. [9] 순수 수학의 추상성에 흠뻑 젖어있는 경우라면 더욱 그렇다.
  10. [10] 다만, 꼭 좋은 해를 찾아가라는 법은 없다. 함수식의 형태와 초기값에 따라 성패가 나뉘게 된다. 물론 무조건 좋은 결과를 반환해주는 메소드도 있다.
  11. [11] 물리학 분야 중 유체역학 같이 PDE와 떨어질래야 떨어질 수 없는 분야이다.
  12. [12] 전세계 어디서 수치해석을 들어도 기말시험에는 반드시 나온다. 사실 대다수 공대생이 수치해석을 한 학기동안 배우는 이유의 궁극의 목표가 바로 RK4법이라 봐도 좋다.
  13. [13] RK4는 센싱이 빠른 경우 즉, 데이터 피드백 주기가 1초 이하인 경우에 유용하지, 항공우주처럼 상당히 오랜 기간에 대한 비선형 방정식의 적분에 적용하는 것은 적합하지 않다.
  14. [14] OpenMP, MPI 등.
  15. [15] Runge와 Kutta가 작성한 논문에 나오는 방법이기 때문.
  16. [16] 진폭이 크면 작은 각도 근사가 먹히지 않아서 미방을 풀기가 매우 힘들어진다

최종 확인 버전:

cc by-nc-sa 2.0 kr

Contents from Namu Wiki

Contact - 미러 (Namu)는 나무 위키의 표가 깨지는게 안타까워 만들어진 사이트입니다. (90.45ms)