룽게-쿠타 방법

testwiki
둘러보기로 이동 검색으로 이동

틀:위키데이터 속성 추적

틀:미분방정식 사이드바 수치 해석에서 룽게-쿠타 방법(Runge-Kutta方法, 틀:Llang)은 적분 방정식초기값 문제를 푸는 방법 중 하나이다.

역사

1900년 경 독일의 수학자 카를 룽게마르틴 빌헬름 쿠타가 개발하였다.

일반적인 4차 룽게-쿠타 방법

일반적으로 사용하는 룽게-쿠타 방법은 4차 룽게-쿠타 방법으로 보통 "RK4" 라고 쓴다. 별다른 수식어 없이 룽게-쿠타 방법을 쓴다고 말한다면 대체로 4차 룽게-쿠타 방법을 쓴다는 뜻이다.

다음과 같이 정의된 초기값 문제를 두자:

y=f(t,y),y(t0)=y0.

y는 시간 t에 대한 미지의 함수이며, 우리가 근사하려는 것이다. y의 변화인 y˙는 t와 y자신으로 이루어진 함수이고, 초기시간 t0에 대응하는 y의 초기값은 y0이며, 함수 f와 t0, y0의 값은 주어져 있다.

이제 h > 0 인 단계 크기로 다음을 정의한다.

yn+1=yn+16h(k1+2k2+2k3+k4)tn+1=tn+h

n = 0, 1, 2, 3, ... 에서, 다음을 사용한다.

k1=f(tn,yn)k2=f(tn+12h,yn+12hk1)k3=f(tn+12h,yn+12hk2)k4=f(tn+h,yn+hk3)

여기서 yn+1이란 y(tn+1) 의 RK4 근사 항이며, 다음 단계의 값(yn+1)은 현재 단계의 값(yn)에 네 구간의 크기 h의 증분치들의 가중평균을 더한 값이다.

  • k1은 구간의 시작부분의 기울기에 의한 증분값이며, y를 사용한다.(오일러 방법)
  • k2는 구간의 중간의 기울기에 의한 증분값이며, y+h2k1을 사용한다.
  • k3는 마찬가지로 구간의 중간의 기울기에 의한 증분값이나, y+h2k2를 사용한다.
  • k4은 구간의 끝의 기울기에 의한 증분값이며, y+hk3를 사용한다.

네 증분을 평균을 낼 때, 중간 부분에서 더 많은 무게의 증분이 더해진다. 만약 함수 fy에 대하여 독립적이라면, 미분방정식은 단순한 적분이 되어 RK4는 심프슨 공식이 된다.

File:Runge Kutta method.png
일반적인 미분방정식에서 RK4 방법과 다른 낮은 차원의 방법을 비교한 것이다.

RK4 방법은 4차 해법이다. 이는 각 단계에서의 오류점근 표기법으로 O(h5), 총 누적 오류는 O(h4)라는 것을 의미한다.

양함수적(명시적) 룽게 - 쿠타 방법

양함수적(명시적, explicit) 룽게-쿠타 방법은 위에서 설명된 RK4 방법의 일반화이다. 이것은 다음과 같이 주어진다.

yn+1=yn+hi=1sbiki

이때 각 ki는 다음과 같다.

k1=f(tn,yn),k2=f(tn+c2h,yn+h(a21k1)),k3=f(tn+c3h,yn+h(a31k1+a32k2)),ks=f(tn+csh,yn+h(as1k1+as2k2++as,s1ks1)).

특정한 방법을 지정하기 위해서는, 정수 s (각 단계들의 수) 가 주어져야 하고, 각각의 계수들 aij (1 ≤ i < js), bi (i = 1, 2, ..., s), ci (i=2, 3, ..., s) 가 필요하다. 행렬 [aij]는 룽게-쿠타 행렬이며, bici 는 알려져 있듯이 무게마디이다.

이 값들은 부처 태블로(Butcher tableau)이라는 기억장치 내에서 배열되어있다. 존 찰스 부처의 이름을 딴 것이다.

0c2a21c3a31a32csas1as2as,s1b1b2bs1bs

룽게-쿠타 방법은 다음을 만족할 때 일관성이 있다.

j=1i1aij=ci for i=2,,s.

만약 하나가 특정 차수 p,즉 지역 절단 오차가 O(hp+1)이 되도록 이 방법이 요구되면 거기에는 또한 부수적인 요구사항이 있다. 이것은 절단오차의 정의에 의해서 나타난다. 예를 들어 2차 방법은 b1+b2=1, b2c2=1/2,a21=c2 일 때 차수가 2이다.

일반적으로, s단계의 explicit 룽게-쿠타 방법이 p의 차수를 가진다면, sp이고, 만약 p5일 때는 s>p이다. s단계 explicit 룽게-쿠타 방법이 열린문제에서 p의 차수를 가지기 위해서는 최소한의 s가 필요하다. 몇 개의 알려진 값들은 다음과 같다.

p12345678mins123467911

예시

RK4는 이 방법에 맞아들어가며, 그 테이블은 다음과 같다.

01/21/21/201/210011/61/31/31/6

이 룽게-쿠타 방법에서의 약간의 변형을 준 방법은 쿠타에 의해서 연구되었고 3/8법칙 이라고 불린다. 이 방법의 가장 큰 장점은 다른 일반적인 방법들보다 오차계수가 작은 것이나, 이 방법은 매 단계마다 조금 더 많은 FLOP(부동소수점 연산)들이 필요하다. 그 Butcher 테이블은 다음과 같다.

01/31/32/31/3111111/83/83/81/8

그러나, 가장 간단한 룽게-쿠타 방법은 (전방)오일러 방법이다. 공식은 yn+1=yn+hf(tn,yn)이다. 이것은 오직 한 단계 뿐인 explicit 룽게-쿠타 방법이다. 대응되는 테이블은 다음과 같다.

01

두 단계의 이차 방법들

간단한 예로 두 단계의 2차 방법인 중간점 방법을 보면 다음과 같다.

yn+1=yn+hf(tn+12h,yn+12hf(tn,yn)).

대응되는 테이블은 다음과 같다.

01/21/201

두 단계의 2차 룽게-쿠타 방법은 중간점 방법 밖에 없는 것은 아니다. 이런 종류의 방법은 α에 의해 다음과 같이 매개변수화되어 있다.yn+1=yn+h((112α)f(tn,yn)+12αf(tn+αh,yn+αhf(tn,yn)))

그 Butcher 테이블은 다음과 같다.

0αα(112α)12α

이 때 α=12일 때는 중간점 방법이 되며, α=1일 때는 호인의 방법이 된다.

활용

예를 들어 α=2/3인 두 단계의 2차 룽게 쿠타 방법을 보자, 이것은 라슬톤 방법 이라고 알려져있다. 테이블은 다음과 같이 주어져 있다.

02/32/31/43/4

대응되는 등식은 다음과 같다.

k1=f(tn,yn),k2=f(tn+23h,yn+23hk1),yn+1=yn+h(14k1+34k2).

다음의 초기치 문제를 풀기 위하여 이 방법을 사용한다.

y=tan(y)+1,y0=1,t[1,1.1]

h = 0.025의 크기로 구간을 잡으면 이 방법은 네 단계가 필요하다.

이 방법의 결과는 다음과 같다:

t0=1:y0=1t1=1.025:y0=1k1=2.557407725k2=f(t0+23h,y0+23hk1)=2.713898184y1=y0+h(14k1+34k2)=1.066869388_t2=1.05:y1=1.066869388 k1=2.813524695k2=f(t1+23h,y1+23hk1)y2=y1+h(14k1+34k2)=1.141332181_t3=1.075:y2=1.141332181 k1=3.183536647k2=f(t2+23h,y2+23hk1)y3=y2+h(14k1+34k2)=1.227417567_t4=1.1:y3=1.227417567 k1=3.796866512k2=f(t3+23h,y3+23hk1)y4=y3+h(14k1+34k2)=1.335079087_.

수치해석적 결과는 밑줄친 값들이다.

적응적(Adaptive) 룽게 - 쿠타 방법

Adaptive한 방법은 단일 룽게-쿠타 방법의 지역적인 절단 오차의 추정치를 찾기 위해 고안되었다. 이것은 테이블에서 차수가 pp1인 두 방법들을 가져서 이루어졌다.

낮은 차수의 단계는 다음과 같이 주어진다.

yn+1*=yn+hi=1sbi*ki,

ki가 높은 차원의 방법에서도 같다면 오차는 다음과 같다.

en+1=yn+1yn+1*=hi=1s(b1bi*)ki,

오차는 O(hp)이다. 이런 종류의 Butcher 테이블은 bi8의 값을 얻기 위하여 확장 되었다.

0c2a21c3a31a32csas1as2as,s1b1b2bs1bsb1*b2*bs1*bs*

룽게-쿠타-펠베르크 방법은 차수가 5와 4인 두 방법을 가지고 있다. 그 확장된 부처 태블로는 다음과 같다:

11/41/43/83/329/3212/131932/21977200/21977296/21971439/21983680/513845/41041/28/2723544/25651859/410411/4016/13506656/1282528561/564309/502/5525/21601408/25652197/41041/50

하지만 가장 간단한 adaptive 룽게-쿠타 방법은 2차인 호인의 방법과 1차인 오일러 방법과 결합되어 있다. 그 확장된 Butcher 테이블은 다음과 같다:

0111/21/210

오차 추정은 단계 크기를 제어하기 위해 사용된다.

다른 adaptive 룽게-쿠타 방법은 Bogacki–Shampine 방법(3과 2의 차수), Cash–Karp 방법Dormand–Prince 방법(둘 다 5,4의 차수)이 있다.

Implicit 룽게 - 쿠타 방법

위에서 언급된 모든 룽게-쿠타 방법들은 모두 explict 방법들이다. explict 룽게-쿠타 방법은 일반적으로 stiff equation에는 맞지 않는다. 왜냐하면 그들의 절대적인 안정성의 범위가 작기 때문이다; 특히, 그 식들은 한정되어 있다. 이 문제는 편미분방정식의 솔루션에서 특히 중요하다.

explict 룽게-쿠타 방법의 불안정성은 음함수적(암시적, implicit)한 방법을 만들게 되었다. implicit 룽게-쿠타 방법은 다음의 형태를 가진다.

yn+1=yn+hi=1sbiki

이 때,

ki=f(tn+cih,yn+hj=1saijkj),i=1,,s.

explict 방법간의 차이는 explict 방법은 시그마의 위에 i - 1이 들어간다는 것이다. 이것은 Butcher 테이블에서도 나타난다: explict 방법의 계수들의 행렬은 하 삼각 행렬이다. implicit 방법은 시그마 위에 s가 올라가고 계수들의 행렬은 다음과 같이 삼각행렬이 아니다.

c1a11a12a1sc2a21a22a2scsas1as2assb1b2bsb1*b2*bs*=cAbT

이 차이는 매 단계마다, 대수적인 방정식의 시스템을 풀어야 한다는 점이다. 이것은 계산비용을 상당히 증가시킨다. m개의 성분이 있는 미분방정식을 s단계의 방법을 사용하면 대수적인 방정식은 ms개의 성분이 있다.이것은 implict한 선형 다단계 방법(ODE들의 다른 방법)과 대조된다: implicit한 s단계의 선형 다단계 방법은 m개의 성분을 가진 방정식을 풀기 위해서 단계수가 늘어나도 시스템의 크기가 늘어나지 않는다

예시

가장 간단한 implicit 룽게-쿠타 방법은 역 오일러 방법이다:

yn+1=yn+hf(tn+h,yn+1).

Butcher 테이블은 다음과 같다.

111

이 Butcher 테이블에 대응하는 식은 다음과 같다.

k1=f(tn+h,yn+hk1)andyn+1=yn+hk1

이것은 위에서 나온 역 오일러 방법의 형태로 바꿀 수 있다.

다른 implicit 룽게-쿠타 방법의 예는 사다리꼴 법칙이다. 그 Butcher 테이블은 다음과 같다.

00011212121210

사다리꼴 법칙은 배열 방법이다. 모든 배열 방법들은 모두 implicit 룽게-쿠타 방법이지만 모든 implicit룽게-쿠타 방법은 배열 방법이 아니다. Gauss-Legendre 방법가우스 구적법에 기반한 배열 방법이다. s단계의 Gauss-Legendre 방법은 차수가 2s이다(따라서 임의의 높은 차수의 방법들이 구성될 수 있다).두 단계의 방법(차수는 4이다)의 Buther 테이블은 다음과 같다:

12163141416312+16314+16314121212+12312123

안정도

explicit한 룽게-쿠타 방법에 비교하여 implicit 방법의 장점은 안정도가 특히 딱딱한 방정식에서 높다는 것이다. 다음의 선형 방정식 y'y를 고려해 보자. 룽게-쿠타 방법을 가용하면 이 식은 다음yn+1=r(hλ)yn의 반복으로 줄며, r은 다음과 같다.

r(z)=1+zbT(IzA)1e=det(IzA+zebT)det(IzA),

여기서 e는 1들의 벡터를 나타낸다. 함수 r안정도 함수라고 불린다. 만약 이 방법이 s단계라면 r은 차수 s의 두 다항식의 몫의 형태를 띈다. explicit 방법은 순상삼각행렬인 행렬 A를 가진다. 이것은 det(I-zA) = 1이라는 것을 의미하며 그 안정도 함수는 다항함수이다.

위의 선형방정식은 |r(z)|<1이고 z=hλ일 때, 수치적 해법은 0이 된다. 이런z들의 집합은 절대 안정성의 영역이라고 부른다. 특히 이 방법은 모든 실수부가 음인 z가 절대 안정성의 영역 안에 있을 때 A-안정하다고 불린다. explicit 룽게-쿠타 방법의 안정도 함수는 다항함수이기 때문에 explicit 룽게 쿠타 방법은 A-안정할 수 없다.

알고리즘

코드

  • C/C++ 코드
    //C/C++ code of 4th order Runge-Kutta method
    
    # include<stdio.h>
    # include<conio.h>
    # include<math.h>
    
    float f(float t,float y)
    {
      return(t*y+1);
    }
    void main()
    {
      float t0,y0,t1,y1,h,i,at,k1,k2,k3,k4;
      clrscr();
      printf("\n Enter Value Of t0 and y0");
      scanf("%f %f",&t0,&y0);
      printf("\n Enter Value of h");
      scanf("%f",&h);
      printf("\n Enter Final Value of t");
      scanf("%f",&at);
      printf("\nt\ty");
      printf("\n_______________________________________\n");
      do
      {
        k1=h*f(t0,y0);
        k2=h*f(t0+h/2,y0+k1/2);
        k3=h*f(t0+h/2,y0+k2/2);
        k4=h*f(t0+h,y0+k3);
        y1=y0+h/6*(k1+(2*k2)+(2*k3)+k4);
        t1=t0+h;
        printf("\n%.4f\t%.4f",t1,y1);
        t0=t1;
        y0=y1;
      }while(t0<at);
      getch();
    }
    
  • Python
    # Program Of Runge-Kutta 4th Order
    from math import *
    
    
    def f(t, y):
        return sin(y**t)
    
    
    def runge_kutta():
        t0, y0 = float(input("initial time:")), float(input("initial value:"))
        h = float(input("interval size:"))
        t = float(input("terminal time:"))
        print("t       y")
        print("______________")
        while t0 < t:
            k1 = f(t0, y0)
            k2 = f(t0 + h / 2, y0 + (k1 * h) / 2)
            k3 = f(t0 + h / 2, y0 + (k2 * h) / 2)
            k4 = f(t0 + h, y0 + (k3 * h))
            y1, t1 = y0 + h / 6 * (k1 + (2 * k2) + (2 * k3) + k4), t0 + h
            print(f"{t1:5.4f}, {y1:5.4f}")
            t0, y0 = t1, y1
    
    
    if __name__ == "__main__":
        runge_kutta()
    

외부 링크

틀:수치상미분방정식