Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

미분방정식을 풀기 위한 룽게-쿠타(Runge-Kutta) 4차 방법


룽게-쿠타(Runge-Kutta) 방법은 상미분방정식(ODE, Ordinary Differential Equation)을 수치적으로 풀 때 가장 널리 사용되는 대표적인 알고리즘입니다. 이 방법은 x와 y에 대한 dy/dx 함수를 사용하며, 초기값인 y(0)가 반드시 필요합니다. 이를 통해 주어진 x 값에 대응하는 y의 근사값을 구할 수 있습니다.

ODE를 풀기 위해서는 다음과 같은 공식들을 순서대로 적용해야 합니다.

미분방정식을 풀기 위한 룽게-쿠타(Runge-Kutta) 4차 방법

여기서 h는 구간의 폭, 즉 스텝 크기를 의미합니다.

참고: 위 공식들 중 처음 두 항인 k1과 k2만 사용하면, 2차 룽게-쿠타(Runge-Kutta 2nd Order) 방법으로도 ODE의 해를 구할 수 있습니다.

입력 및 출력

입력:
x0과 f(x0): 0과 0
목표 x 값 = 0.4
스텝 크기 h = 0.1
출력:
미분방정식의 해: 0.0213594

알고리즘

rungeKutta(x0, y0, x, h)

입력 − 초기 x, y 값, 목표로 하는 x 값, 그리고 구간의 폭 h

출력 − 해당 x 값에서 계산된 y 값

Begin
   iteration := (x – x0)/h
   y = y0
   for i := 1 to iteration, do
      k1 := h*f(x0, y)
      k2 := h*f((x0 + h/2), (y + k1/2))
      k3 := h*f((x0 + h/2), (y + k2/2))
      k4 := h*f((x0 + h), (y + k3))
      y := y + (1/6)*(k1 + 2k2 + 2k3 + k4)
      x0 := x0 + h
   done
   return y
End

알고리즘의 동작 과정을 살펴보면, 먼저 전체 구간을 스텝 크기 h로 나누어 반복 횟수를 계산합니다. 각 반복마다 네 개의 기울기 값(k1~k4)을 구한 뒤, 이들을 가중 평균하여 y 값을 갱신하고 x0를 h만큼 앞으로 이동시킵니다. 모든 반복이 끝나면 최종 y 값을 반환합니다.

C++ 예제 코드

#include <iostream>
using namespace std;

double diffOfy(double x, double y) {
   return ((x*x)+(y*y)); // 함수: x^2 + y^2
}

double rk4thOrder(double x0, double y0, double x, double h) {
   int iteration = int((x - x0)/h);    // 반복 횟수 계산
   double k1, k2, k3, k4;
   double y = y0;    // 초기에는 y = f(x0)

   for(int i = 1; i<=iteration; i++) {
      k1 = h*diffOfy(x0, y);
      k2 = h*diffOfy((x0+h/2), (y+k1/2));
      k3 = h*diffOfy((x0+h/2), (y+k2/2));
      k4 = h*diffOfy((x0+h), (y+k3));
         
      y += double((1.0/6.0)*(k1+2*k2+2*k3+k4));    // del y를 이용해 y 갱신
      x0 += h;    // x0를 h만큼 증가
   }
   return y;    // f(x) 값 반환
}

int main() {
   double x0, y0, x, h;
   cout << "Enter x0 and f(x0): "; cin >> x0 >> y0;
   cout << "Enter x: "; cin >> x;
   cout << "Enter h: "; cin >> h;
   cout << "Answer of differential equation: " << rk4thOrder(x0, y0, x, h);
}

실행 결과

Enter x0 and f(x0): 0 0
Enter x: 0.4
Enter h: 0.1
Answer of differential equation: 0.0213594

위 실행 결과에서 볼 수 있듯이, 초기 조건 f(0)=0일 때 x=0.4 지점에서의 해는 약 0.0213594로 계산됩니다. 스텝 크기 h를 더 작게 설정할수록 오차가 줄어들어 더 정확한 해에 수렴하게 됩니다.