문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 수치해석학 (문단 편집) == 예제 == 미분방정식을 풀 때 사용되는 대표적인 수치해석 방법들이다. 오일러 방법 (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)]이다. {{{#!folding [풀이 보기] [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))]을 근사하여라.|| {{{#!folding [풀이 보기] [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) 방법을 칭하는것이다[* [[https://en.wikipedia.org/wiki/Carl_Runge|카를 룽게]]와 [[https://en.wikipedia.org/wiki/Martin_Kutta|마르틴 쿠타]]가 작성한 논문에 나오는 방법이기 때문.]. 상당히 정확하기 때문에 실용적인 면에서도 애용되고 있는 수치해석 방법이다. || [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))]을 근사하여라.|| {{{#!folding [풀이 보기] [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차 미분방정식으로 만들면 된다. 예를 들어서 진동폭이 매우 큰 [[단진자]][* 진폭이 크면 작은 각도 근사가 먹히지 않아서 미분방정식을 풀기가 매우 힘들어진다] 시뮬레이션을 만들고 싶다고 가정하자. (저항이나 마찰이 없을때) 단진자 운동을 기술하는 방정식은 [math(\theta'' = -\frac{g}{l} \sin(\theta))] 이다. [math(\theta' = \omega)]라 하고 이걸 연립 1차 방정식으로 바꿔서 각각 식에 RK4를 사용하면 된다. 연립미분방정식은 다음과 같다. [math(\theta' = \omega)] [math(\omega' = -\frac{g}{l} \sin(\theta))]저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기