최근 수정 시각 : 2024-11-04 02:26:24

수치해석학

해석학· 미적분학
Analysis · Calculus
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px)"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
<colbgcolor=#26455A>실수와 복소수 실수( 실직선 · 아르키메데스 성질) · 복소수( 복소평면 · 극형식 · 편각) · 근방 · 유계 · 콤팩트성 · 완비성
함수 함수 · 조각적 정의 · 항등함수 · 역함수 · 멱함수 · 다변수함수( 동차함수 · 음함수) · 다가 함수 · 함수의 그래프 · 좌표계 · 닮은꼴 함수 · 극값 · 볼록/오목 · 증감표
초등함수( 대수함수 · 초월함수 · 로그함수 · 지수함수 · 삼각함수) · 특수함수 · 범함수( 변분법 · 오일러 방정식) · 병리적 함수
극한·연속 함수의 극한 · 수열의 극한 · 연속함수 · ε-δ 논법 · 수렴( 균등수렴) · 발산 · 부정형 · 점근선 · 무한대 · 무한소 · 특이점 · 0.999…=1
중간값 정리 · 최대·최소 정리 · 부동점 정리 · 스털링 근사 · 선형근사( 어림)
수열· 급수 수열( 규칙과 대응) · 급수( 멱급수 · 테일러 급수( /목록) · 조화급수 · 그란디 급수( 라마누잔합) · 망원급수( 부분분수분해)) · 그물
오일러 수열 · 베르누이 수열 · 월리스 곱
단조 수렴 정리 · 슈톨츠-체사로 정리 · 축소구간정리 · 급수의 수렴 판정 · 리만 재배열 정리 · 바젤 문제 · 파울하버의 공식 · 오일러-매클로린 공식 · 콜라츠 추측미해결
미분 미분 · 도함수( 이계도함수 · 도함수 일람) · 곱미분 · 몫미분 · 연쇄 법칙 · 임계점( 변곡점 · 안장점) · 매끄러움
평균값 정리( 롤의 정리) · 테일러 정리 · 역함수 정리 · 다르부 정리 · 로피탈 정리
립시츠 규칙 · 뉴턴-랩슨 방법 · 유율법 · 경사하강법
적분 적분 · 정적분( /예제) · 스틸체스 적분 · 부정적분( 부정적분 일람) · 부분적분( LIATE 법칙 · 도표적분법 · /예제) · 치환적분 · 이상적분( 코시 주요값)
미적분의 기본정리 · 적분의 평균값 정리
리시 방법 · 2학년의 꿈
다변수· 벡터 미적분 편도함수 · 미분형식 · · 중적분( 선적분 · 면적분 · 야코비안) · 야코비 공식
라그랑주 승수법 · 오일러 동차함수 정리 · 선적분의 기본정리 · 스토크스 정리( 발산 정리 · 그린 정리 변분법
미분방정식 미분방정식( /풀이) · 라플라스 변환
측도론 측도 · 가측함수 · 곱측도 · 르베그 적분 · 절대 연속 측도 · 라돈-니코딤 도함수
칸토어 집합 · 비탈리 집합
복소해석 코시-리만 방정식 · 로랑 급수 · 유수 · 해석적 연속 · 오일러 공식( 오일러 등식 · 드 무아브르 공식) · 리우빌의 정리 · 바이어슈트라스 분해 정리 · 미타그레플레르 정리
함수해석 공간 위상 벡터 공간 · 국소 볼록 공간 · 거리공간 · 프레셰 공간 · 노름공간 · 바나흐 공간 · 내적공간 · 힐베르트 공간 · Lp 공간
작용소 수반 작용소 · 에르미트 작용소 · 정규 작용소 · 유니터리 작용소 · 컴팩트 작용소
대수 C*-대수 · 폰 노이만 대수
정리 한-바나흐 정리 · 스펙트럼 정리 · 베르 범주 정리
이론 디랙 델타 함수( 분포이론)
조화해석 푸리에 해석( 푸리에 변환 · 아다마르 변환)
관련 분야 해석 기하학 · 미분 기하학 · 해석적 정수론( 1의 거듭제곱근 · 가우스 정수 · 아이젠슈타인 정수 · 소수 정리 · 리만 가설미해결) · 확률론( 확률 변수 · 중심극한정리) · 수치해석학 · 카오스 이론 · 분수계 미적분학 · 수리물리학( 양-밀스 질량 간극 가설미해결 · 나비에 스토크스 방정식의 해 존재 및 매끄러움미해결) · 수리경제학( 경제수학) · 공업수학
기타 퍼지 논리 · 합성곱
}}}}}}}}} ||

<colbgcolor=#000> 과학 연구 · 실험
Scientific Research · Experiment
{{{#!wiki style="margin: 0 -10px -5px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -6px -1px -11px"
<colbgcolor=#000><colcolor=#fff><rowcolor=#000,#fff> 배경 과학적 방법
기반 수학( 미적분학 · 선형대수학 · 미분방정식) · 통계학( 수리통계학 · 추론통계학 · 기술통계학)
연구· 탐구 논증( 귀납법 · 연역법 · 유추(내삽법 · 외삽법)) · 이론( 법칙 · 공리 · 증명 · 정의 · 근거이론 · 이론적 조망) · 가설 · 복잡계( 창발) · 모형화(수학적 모형화) · 관측 · 자료 수집 · 교차검증 · 오컴의 면도날 · 일반화
연구방법론 합리주의 · 경험주의 · 환원주의 · 복잡계 연구방법론 · 재현성( 연구노트)
통계적 방법 혼동행렬 · 회귀 분석 · 메타 분석 · 주성분 분석 · 추론통계학(모형( 구조방정식) · 통계적 검정 · 인과관계와 상관관계 · 통계의 함정 · 신뢰도와 타당도)
측정· 물리량 물리량( 물리 상수 · 무차원량) · 차원( 차원분석) · 측도 · 단위(단위계( SI 단위계 · 자연 단위계) · 단위 변환) · 계측기구 · 오차( 불확도 · 유효숫자 · 과학적 기수법)
실험 실험설계 · 정성실험과 정량실험 · 실험군과 대조군 · 변인(독립 변인 · 조작 변인 · 종속 변인 · 변인 통제) · 모의 실험( 수치해석) · 맹검법 · 사고실험 · 인체실험 · 임상시험 · 실험 기구
연구윤리 뉘른베르크 강령 · 헬싱키 선언 · 연구투명성 · 연구 동의서 · 연구부정행위 · 표절( 표절검사서비스) · 편향 · 문헌오염 · 자기교정성 · 연구윤리위원회
논문· 과학 공동체 소논문 · 리포트 · 논문제출자격시험 · 연구계획서 · 형식( 초록 · 인용( 양식 · 참고문헌) · 감사의 글) · 저자 · 학회 · 세미나 · 학술대회 · 동료평가 · 지표 · 학술 데이터베이스 · 게재 철회 · 학제간 연구
철학 관련 정보 · 연구방법론 관련 정보 · 수학 관련 정보 · 자연과학 관련 정보 · 물리학 관련 정보 · 통계 관련 정보 · 사회과학 조사연구방법론 }}}}}}}}}


[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]
[ 펼치기 · 접기 ]
||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 || 수학( 해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학( 환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학( 형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU( 그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술 기계어 · 어셈블리어 · C/ C++ · C# · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시( SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속
연구

기타
논리 회로( 보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{ 컴파일러( 어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩( 유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도( 최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리( 기계 번역 · 음성인식) · 버전 ( 버전 관리 시스템 · Git · GitHub)


1. 개요2. 비유3. 의의4. 교과5. 해석적 관점 비교6. 예제7. 소프트웨어/하드웨어8. 여담9. 관련 문서

1. 개요

/ Numerical Analysis

수치해석학이란 어떤 함수 방정식 컴퓨터를 이용해 수치적으로 근사해서 근삿값을 구하는 알고리즘(방법)에 대한 연구를 하는 학문이다.

2. 비유

비유적으로 예시를 들자면, 주어진 함수 [math(x(t) = t^2)]에 대하여 미분계수 [math(x'(2))]의 값을 구하는 문제가 주어졌을 때, 이를 해석적으로 해결한다면 [math(x)]함수의 도함수인 [math(x'(t) = 2t)]를 구한 뒤, 여기에 2라는 값을 넣어서 4라는 답을 얻을 수 있다.

대신에 이를 수치해석학의 관점에서 풀면 [math(\displaystyle \frac{(2+\delta)^2 - (2-\delta)^2}{2 \delta })]에 [math(\delta = 10^{-10})]을 대입하여 [math(4.00000033096...)]이라는 값을 얻을 수 있다. 이 값은 참값과 완벽히 같진 않지만 참값에 충분히 근접한다. 이러한 방법론을 해석적으로는 풀기 어려운 문제에 적용하여 답을 얻어내는 것을 수치해석이라고 한다.

3. 의의

수치해석학에서 다루는 세부 주제는 순수수학이나 공학의 어떤 분야인가에 따라 조금씩 다르지만, 전체적으로 보자면 회귀 분석, 수치적 적분, 일반 방정식 미분방정식의 수치해 계산, 행렬의 수치적 계산[1] 등 수학의 여러 문제를 컴퓨터를 이용해서 푸는 방법을 다루는 과목이다. 만약 이 학문의 발전이 없었다면 복잡한 수학 계산이 필요한 수많은 분야의 발전 역시 더뎠을 것이다.

수치해석을 사용하는 이유는 사람의 손으로 못 푸는 문제 때문이다. 특히 미분방정식의 경우 손으로 풀 수 있는 문제는 교과서에 있는 예제가 거의 전부일 정도로 손으로 푸는 것이 매우 어렵다. 예를 들어 아무것도 없는 텅 빈 공간에 '불규칙적이고 복잡한' 람보르기니 아벤타도르 차량 모양의 전도체가 있고 거기에 5V의 전압을 걸었다고 하자. 그럼 그 전도체에 의한 전도체 안팎에서 전자기장의 분포는 어떤 특정한 미분방정식[2]을 따를 것이고, 그 미분방정식에 적절한 경계 조건(boundary condition)이 주어진다면 해가 존재할 것이다. 그런데 람보르기니 모양의 경계 조건이라는 괴이한 조건 덕에 위 미분방정식의 정확한 해를 손으로 풀어서 구하는 건 불가능하며, 설령 가능하다 하더라도 얻는 데 엄청난 시간이 소요되기 때문에 다른 방법을 모색해야 하는 것이다.

이런 거라면 차라리 다행이고, 나중에는 미, 적분 자체가 불가능한 함수 등, 계산 자체가 불가능한 문제들도 튀어나오기 때문에 결국에는 수치해석으로 들어갈 수 밖에 없다.

여러 방법 중 문제를 풀기 쉽게 바꾸는 기법도 일부 존재한다. 수치해석에서 자주 쓰이는 유한요소법(finite element method)의 예를 들어 보자. 공간을 조각조각 나눔으로써 상황을 단순화 시키고 그 단순화 된 상황을 분석해서 근사적인 방정식의 해를 얻을 수 있다. 위에서도 언급했지만, 수치해석은 거의 정확하지만 완벽하지는 않기 때문에, 수치해석으로 나온 결과물이 얼마나 정확한지 파악하는 것이 몹시 중요하다.

4. 교과

수치해석학의 입문 과목을 수강한다면, 유한요소해석과 같이 유명한 방법을 배우지 않아 답답할 수도 있을 것이다. 하지만 입문 과목에서 배우는 내용은 나중에 유한요소해석을 배우기 위한 기초 체력을 길러줄 뿐만 아니라, 입문 과목에서 배우는 간단한 알고리즘들도 실제 과학과 공학 분야에서 매우 자주 쓰인다. 그래서 과학이나 공학 분야 대학생들에게 있어서 수치 해석은 입문 과목이라도 필수적이다.

수치해석학 수업을 제대로 따라가기 위해서는 어느정도의 수학 지식이 필요한데, 일단 대학교 1학년 수준의 수학 실력은 당연히 필요하고, 추가로 미분방정식과 선형대수도 일정 수준까지의 지식이 필요하다. 일단 수치해석학의 상당 부분이 미분방정식을 푸는데 집중되어 있고, 많은 수치해석 알고리즘이 결국 마지막에 선형대수를 사용하기 때문이다. 높은 수준의 수치해석학 수업에서는 푸리에 변환 해석학(수학)을 사용하는 경우도 많다.

위에 나온 기법들을 실제로 구현하는 작업으로, 전공과 무관하게 수치해석 수업을 듣기 전에 어느정도 프로그래밍 실력을 키울 필요가 있다. 컴퓨터 프로그래밍은 선형대수 라이브러리 활용법과, 수치해석을 통해 구한 함수를 화면에 출력하기 위한 그래픽 라이브러리 활용법을 익힌 후 도전하는 것이 좋다. MATLAB을 사용한다면 매우 편하겠지만, C언어 같은 것을 사용하는데 라이브러리 사용법에 익숙하지 않다면 모든 것을 일일이 직접 구현하느라 힘든 노가다가 될 것이고, 그래픽에 익숙하지 않으면 결과를 알기 힘들어진다. 보통 미적분학이나 공업수학 교재에 나오는 함수들을 자유자재로 그릴 수 있을 정도가 기초가 된다.

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

수학과 학부 레벨에서 개강은 되지만 의외로 이 과목의 진의를 강의를 들으며 깨닫는 사람은 그리 많지 않다. 여러가지 이유가 있지만 크게 보면,
  1. 수치해석을 들을 즈음에는 사람들이 추상화된 개념에서 세워진 정의와 명제를 바탕으로 논리적인 추론을 통한 증명에 이미 익숙해진다. 그래서 왠지 모르게 수학과의 사파 과목처럼 느껴지는 것도 사실이다.[3][4]
  2. 이 학문의 필요성에 대하여 쉽게 피부로 느끼지 못하는 까닭이다. 계산하는 방법을 신나게 다루면서 손으로 예제를 풀려고 하면 매우 단순한 경우만 보게 된다. 실제로 프로그래밍을 해본다던가, 적어도 패키지를 써보지 않으면 단순 계산 노동일 뿐이다.
  3. 강의의 흐름상, 계산을 중점적으로 다루게 되므로 방법만 안다면야 금방 따라하게 되는 것 또한 수치해석을 단순하게 생각할 수 있다.

예를 들어, 학부수준 수치해석에서 초반에 등장하는 뉴턴-랩슨 방법은 한 점에서 함수식을 미분해서 x절편을 찾고, 다시 그 x좌표에서 함수식을 미분해서 또 x절편을 찾고...의 반복으로 주어진 식의 해를 찾아가는 방법이다. [5]

공학에서는 수학의 추상성보다는 현실적인 해를 찾는 것이 더 중요하다. 그러나 공학도들에게도 수치해석이라는 과목은 조금 별나게 느껴진다. 그 이유는 공학 수학만을 다루다가 어찌되었든 조금 특이한 수학을 접하게 되기 때문. 수치해석은 공학도들이 계속 다루게 될 여러 소프트웨어의 바탕이 되기 때문에 상당히 중요하다. 그래서 많은 공대생들이 한학기 동안이라도 수치해석 수업을 들으면서 미친듯이 MATLAB 프로그래밍을 하게 된다. MATLAB을 사용하지 않는다면 공학용 계산기에라도 프로그래밍을 한다. 때로는 커리큘럼에 따라 MATLAB이 아니라 다른 프로그래밍 언어를 쓰며 고통받는 경우도 있다.

수치해석 과목이 아닌 다른 공대 수업에서도 많이 쓰이는 수치해석 방법은 미분방정식을 풀 때 사용하는 4차 룽게-쿠타(Runge-Kutta) 방법(보통 줄여서 RK4라고 한다)일 것이다. 비교적 정확도가 높은 편이고 단순 진동하는 삼각함수와 같은 해를 가진 문제에서도 무한대로 발산할 염려가 적은 편이라 준수한 활용도를 보인다. 높은 정확도가 필요하지 않은 경우에는 더 빠른 2차 룽게-쿠타(RK2)를 쓰는 편이 좋겠지만, 노트북 컴퓨터의 계산 능력도 출중한 요즘 세상에서는 컴퓨터에게 그냥 RK4로 풀라고 시키고 잠깐 유튜브나 보면 된다. 이전 버전의 문서에서는 항공우주공학에서 RK8/RK9를 주로 쓴다고 되어 있었는데, 막상 항공우주 전문가들 앞에서 RK8/RK9를 쓴다고 말하면 오히려 신기한 생물을 보듯이 쳐다볼 것이다. 항공우주 분야에서도 RK4 수준이 많이 사용되고, 만약 풀어야 하는 시간이 각 구간 크기에 비해 너무 길다면 암시적 방법(implicit method)을 사용한다.

학점을 채우기 위해 수업을 듣는 것이 아니라 이후에도 수치해석학을 사용할 생각이 있다면, 단순히 각 수치해석 공식을 배우는 것을 넘어서 그 배경에 있는 이론도 주의깊게 공부할 필요가 있다. 수업 시간에 배운 내용을 실제로 적용해 보면, 책에 있는 것을 그대로 사용했고 프로그램에 버그도 없는데 이상한 해가 나오는 경우가 종종 있을 것이다. 특정 수치해석 방법이 어떤 경우에 이상 행동을 하고, 그럴 때 대처 방법이 무엇인지는 수치해석 이론이 알려준다. 잘 안된다고 애꿎은 키보드를 괴롭히지 말고, 좋은 수치해석학 교과서를 구해서 찬찬히 살펴보도록 하자.

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

공대와 마찬가지로 수학과 학생들, 수학연구자들도 수식과 LaTeX만 가지고 씨름하기보다, 각종 그래프가 들어간 MATLAB, 포트란, C 코드가 작성된 책이나 논문을 읽어야 하는 경우가 많아서 기본적인 프로그래밍 지식이 필요하다.

5. 해석적 관점 비교

수치에 방점을 찍느냐 해석에 방점을 찍느냐에 따라 매우 다르게 볼 수 있다.

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

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

해석에 방점을 찍는 경우 이 과목의 의미는 해석학적으로 알고리즘을 분석해본다는 것이다. 위의 뉴턴-랩슨 방법의 예를 다시 보면 해석학에서 왜 수열을 배우고 수렴을 배웠는지를 알게된다. 이 알고리즘은 근사적인 해를 계속 구하여 수열을 만드는 과정이다. 이 수열이 방정식의 해로 수렴하면 알고리즘이 극한에서 방정식의 해를 구하는 올바른 방법이 된다. 반대로 발산하게 된다면 아무리 촘촘히 계산하려고 해도 오차를 좁힐 수 없는 결과로 실제로 보여줄 수 있는 등 실용적으로 확인할 수 있게 된다.

이 예에서 보듯이 해석에 방점을 찍는 수치해석은 일반적인 알고리즘 또는 새로 개발한 알고리즘에 관한 다음과 같은 해석학적 질문에 대한 답을 구한다.
  • 이 알고리즘이 수렴하는가? 즉, 알고리즘으로 구성한 해의 근사값의 수열이 수렴하는가?
  • 수렴한다면 문제의 정답으로 수렴하는가?
  • 정답으로 수렴한다면 얼마나 빨리 수렴하는가?
  • 수렴속도 질문의 다른 형태로서, 몇 번을 반복해야 알고리즘의 계산값과 정답의 차이가 주어진 오차범위 안으로 들어오는가?

사실 단순히 숫자를 이용한 풀이를 자동으로 하는 방법에 대해서는 정수론이나 이산수학에서 똑같이 다루고 있고, 오히려 그쪽에서 더 정확하게 다룰 수 있다. 예를 들면 부동소수점 대신 유리수를 이용한 계산 방법도 유클리드 호제법이 계산 가능한 만큼, 조금 느려도 컴퓨터로 정확히 다룰 수 있고 이를 이용한 많은 알고리즘들이 개발되어 있다. 만약 수치해석에서 100x100의 행렬을 계산할 때는 오히려 정확성을 희생하고 근사값을 빠르게 계산하는 방법이나 그런 계산법에서 오차를 줄이는 등의 기법을 개발하는 방향으로 지식이 발전해 왔지, 단순히 가우스 소거법을 이용해 역행렬 계산 자체를 자동화하는 방법에 대한 지식은 Trivial하다고 보거나 권장하지 않는 경우가 많다. 그래서 현대적인 수치 해석은 이산수학이나 컴퓨터과학과의 정체성 분리의 과정에서 해석에 좀더 방점을 두고 있다고도 볼 수 있다.

6. 예제

미분방정식을 풀 때 사용되는 대표적인 수치해석 방법들이다. 오일러 방법 (Euler's method), 개조 오일러 방법(modified Euler's method), RK4 등이 있다. 초기조건이 주어졌다면, 작은 시간 구간 [math(h)]를 사용해서 ([math(t_{n+1} = t_n + h)])방정식을 만족하는 함수의 값을 어림하는게 주요 포인트. 초기조건이 [math(y(t_0) = y_0)]인 어떤 함수 [math(y(t))]에 대해 [math(y' = f(t, y))] 꼴의 미분방정식을 예로 들어서 이것을 수치해석으로 풀 수 있는 룽게-쿠타 방법들을 몇가지 살펴보자.
[math( \displaystyle y_{n+1} = y_n + hf(t_n, y_n) )]
미분방정식의 가장 기본적인 수치해석 방법. 간단하고 이해하기 쉽지만 그다지 정확하지는 않다. 오차값은 대략 h에 비례한다. 다시말해 스텝사이즈를 반으로 줄이면 오차가 반 정도로 준다. 밑의 예제풀이를 보면 나쁘지 않아 보이지만 실용적인 면에서 쓰기에는 정확성이 턱없이 부족해서 이 방법 자체는 잘 쓰이지 않는다. 다만 이 오일러 방법을 기본으로, 이걸 확장한 더욱 정확한 방법들이 많다.
예제: [math( y' = y)], [math( y(0) = 1)]일때, [math(h = 0.1)]을 이용해 [math(y(0.1))]을 근사하여라.
답의 정확한 값은 [math(e^{0.1})]로, 약 [math(1.10517091808)]이다.
[풀이 보기]
[math(y(0.1) \approx y(0) + hy'(0, y(0)) = 1 + (0.1)(1) = 1.1 \rightarrow y(0.1) \approx 1.1)]
[math( \displaystyle k_1 = f(t_n, y_n) )]
[math( \displaystyle k_2 = f(t_n + h, y_n + hk_1) )] ||
[math( \displaystyle y_{n+1} = y_n + \frac{h}{2}(k_1 + k_2) )]
단순 오일러 기법을 두 번 사용해서 두 기울기 ([math(k_1)]와 [math(k_2)])를 구하고, 이 두개를 평균내서 나오는 기울기를 초기 기울기로 두고 다음 스텝으로 넘어가는 방법.
예제: [math( y' = y)], [math( y(0) = 1)]일때, [math(h = 0.1)]을 이용해 [math(y(0.1))]을 근사하여라.

[풀이 보기]
[math(k_1 = f(t_0, y_0) = 1)]
[math(k_2 = f(t_0 + h, y_0 + hk_1) = 1.1 )]
[math(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)]

[math(1.10517091808...)]에 기본적인 오일러 방법보다 더욱 근접한 값인걸 알 수 있다.
하지만 이 개조된 방법 마저도 실제 쓰기에는 정확성이 좀 떨어진다.

오일러 방법이 RK1, 개조 오일러 방법이 RK2 라고 할 수 있는데, 일반적으로 Runge-Kutta 방법을 말한다면 이 4th order Runge-Kutta (RK4) 방법을 칭하는것이다[6]. 상당히 정확하기 때문에 실용적인 면에서도 애용되고 있는 수치해석 방법이다.
[math( \displaystyle k_1 = f(t_n, y_n) )]
[math( \displaystyle k_2 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}k_1) )]
[math( \displaystyle k_3 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}k_2) )]
[math( \displaystyle k_4 = f(t_n + h, y_n + hk_3) )]||
[math( \displaystyle y_{n+1} = y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) )]

대략적인 설명을 하자면 여러 기울기를 구하고 이 기울기들의 무게평균을 내, 이 최종 기울기로 오일러 방법을 사용하는 것이다.
이 방법의 오차는 대략 h^4에 비례한다. 스텝 사이즈를 반으로 줄이면 오차가 약 16배나 감소한다는 뜻이다.
예제: [math( y' = y)], [math( y(0) = 1)]일때, [math(h = 0.1)]을 이용해 [math(y(0.1))]을 근사하여라.

[풀이 보기]
[math(k_1 = f(t_0, y_0) = 1)]
[math(k_2 = f(t_0 + \frac{h}{2}, y_0 + \frac{h}{2}k_1) = 1.05 )]
[math(k_3 = f(t_0 + \frac{h}{2}, y_0 + \frac{h}{2}k_2) = 1.0525 )]
[math(k_4 = f(t_0 + h, y_0 + hk_3) = 1.10525 )]
[math(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...)]

이번에는 [math(1.10517091808...)]에 무지무지 가까운게 눈에 띈다! 오리지날 오일러 방법하고는 비교하기도 민망한 수준. 계산하는데 시간은 약 4배가 걸렸지만 오차값은 수배나 더 작다.
이보다도 더더욱 정확한 Runge-Kutta 방법들도 있지만, 거기까지 가면 너무 복잡해지므로 이 문서에서는 여기까지만 기술하도록 한다. 사실 RK4 까지만 알아도 웬만한 상미분방정식 수치해석에는 문제없다.

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

예를 들어서 진동폭이 매우 큰 단진자[7] 시뮬레이션을 만들고 싶다고 가정하자. (저항이나 마찰이 없을때) 단진자 운동을 기술하는 방정식은
[math(\theta'' = -\frac{g}{l} \sin(\theta))]
이다. [math(\theta' = \omega)]라 하고 이걸 연립 1차 방정식으로 바꿔서 각각 식에 RK4를 사용하면 된다.

연립미분방정식은 다음과 같다.
[math(\theta' = \omega)]
[math(\omega' = -\frac{g}{l} \sin(\theta))]

7. 소프트웨어/하드웨어

소프트웨어
  • 상용/범용 프로그램
    • MATLAB - 이학, 이공계에서 가장 많이 쓰는 수치해석 소프트웨어
    • GNU Octave - 오픈소스 수치해석 프로그램[8]
    • FreeMat - 오픈소스 수치해석 프로그램[9]
    • Mathematica - 매트랩과 같은 상용 소프트웨어
    • Wolfram Alpha - 매스매티카 계열 웹 기반 수치해석 프로그램
    • Excel - 마이크로소프트사에서 제작한 범용 스프레드시트
    • Calc - 범용 오픈소스 스프레드시트
    • SPSS - 사회과학 통계 분석에 특화된 상용 소프트웨어, 스프레드시트와 같은 UI로 쉽게 사용할 수 있는 장점이 있다.
    • JASP - SPSS를 대체할 목적으로 만들어진 무료 오픈 소스 소프트웨어로, 베이즈 통계학에 기반을 둔 분석을 SPSS와 유사한 인터페이스를 통해 수행할 수 있도록 만든 것이 최대의 특징이다.
    • PSPP - SPSS를 대체할 목적으로 GNU에서 만든 무료 오픈 소스 소프트웨어
    • SAS - 통계 분석 상용 소프트웨어
  • 프로그래밍 언어
    • C/C++ - 범용 프로그래밍 언어로, 속도가 빠르다는 강점이 있다.
    • Python - Numpy, Scipy, Matplotlib 등의 라이브러리를 통해 수치해석 연산이 가능하다.
    • Julia - MIT에서 개발한 프로그래밍 언어로, 과학계산을 목적으로 개발됐다. C 언어 못지 않은 속도 및 퍼포먼스를 보여준다.
    • R - 통계 전문 프로그래밍 언어나, 수치해석 연산에도 활용할 수 있다.


하드웨어 [10]

8. 여담

  • 현대 수치해석 이론을 정립한 인물은 헝가리 출신의 수학자이자 과학자인 폰 노이만을 들 수 있다. 폰 노이만은 당시 막 등장하기 시작한 컴퓨터를 사용하여 여러 물리 문제를 풀어보려고 하다가[11] 이상한 해가 나와서 고통받으며 많은 수치해석 이론을 만들어 냈다. 전쟁에서도 수치해석은 많이 쓰였다. 특히 탄도학의 발달에 수치해석이 기여한 면이 크다. 몇몇 수치해석 알고리즘은 탄도학에서 출발했으며, 존 폰 노이만은 내폭형 원자폭탄에 쓰이는 폭축 렌즈 개발에 수치해석 기법을 사용했다.
  • 컴퓨터에서는 수를 표현하는 방법 자체에서도 오차가 존재한다. 예를 들어 부동소수점을 표현하는 표준인 IEEE 754 에서는 0.1을 정확하게 표현할 수 없다. 그래서, 0.1을 10회 반복해서 더하면 1.0 과 다른 값이 된다는 문제는 널리 알려진 문제점이다. 작은 계산 오차가 반복해서 계산하면, 어마어마하게 큰 오차로 증가되는 경우도 있다. 이런 현상을 Roundoff error라 부르며, 저장가능한 부동소수점 개수를 벗어난 큰 수의 계산을 할 때 흔히 발생하는 오류이다.
  • 좋은 수치해석 라이브러리를 만들려면, 컴퓨터 아키텍처에 맞게 병렬처리[12]같은 최적화도 해 주어야 하고, 과거 포트란이나 C로 작성되었던 라이브러리를 Python 같은 언어로 포팅한다거나, 유닉스/리눅스 환경을 관리한다거나, 오픈 소스처럼 협업이 필요한 경우 버전 관리나 테스팅을 관리해 주어야 하기 때문에, 컴퓨터과학을 알고 있으면 할 수 있는 일이 많아질 것이다.

9. 관련 문서



[1] '수치 선형대수학'(Numerical Linear Algebra)라고도 한다. [2] 여기서는 라플라스 방정식. [3] 대부분 수학과 커리큘럼 상 2학년 후반 내지는 3학년 즈음에 이 과목을 수강하게 된다. [4] 같은 이유로 수학과 학생들 사이에서 미분방정식에 대한 호불호가 많이 갈리기도 한다. [5] 다만, 꼭 좋은 해를 찾아가라는 법은 없다. 함수식의 형태와 초기값에 따라 성패가 나뉘게 된다. 무조건 좋은 결과를 반환해주는 메소드도 있다. [6] 카를 룽게 마르틴 쿠타가 작성한 논문에 나오는 방법이기 때문. [7] 진폭이 크면 작은 각도 근사가 먹히지 않아서 미분방정식을 풀기가 매우 힘들어진다 [8] MATLAB의 대체 도구로 활용 가능 [9] MATLAB의 대체 도구로 활용 가능 [10] 자연계에서 벌어지는 현상을 의미있는 '숫자'로 해석해내는 것 또한 광의의 수치해석이다. [11] 예를 들어 최초로 컴퓨터를 이용한 일기예보 시뮬레이션을 시도한 사람이 폰 노이만이다. [12] OpenMP, MPI 등.