Метод Рунге-Кутта четвертого порядка для решения дифференциального уравнения первого порядка

Используя метод Рунге-Кутта получить решение уравнения y' = F(x,y).

Наиболее употребительным методом Рунге-Кутта решения уравнения первого порядка y' = F(x,y) является метод четвертого порядка, в котором вычисления производятся по формуле:

yk+1 = yk +(k1 +2k2 +2k3 +k4 )/6,

где

k1 = Fk h = F(xk , yk )h
k2 = F(xk +h/2, yk +k1 /2)h
k3 = F(xk +h/2, yk +k2 /2)h
k4 = F(xk +h, yk +k3 )h,
k = 0, ..., n-1
h = (xf -x0 )/n

Решение:

#include <stdafx.h>
#include "rungekutta.h"
 
/*************************************************************************
Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка.
 
function RungeKutt(x,x1,y:real;n:integer):real;
 
Алгоритм решает диффур y'=F(x,y) методом Рунге-Кутта 4 порядка.
 
Начальная точка имеет кординаты (x,y),
конечная - (x1, RungeKutt(x, x1, y, n)).
 
До конечной точки мы добираемся через n промежуточных
с постоянным шагом h=(x1-x)/n
*************************************************************************/
double solveoderungekutta(double x, double x1, double y, int n)
{
    double result;
    int i;
    double h;
    double y1;
    double k1;
    double k2;
    double k3;
 
    h = (x1-x)/n;
    y1 = y;
    i = 1;
    do
    {
        k1 = h*f(x, y);
        x = x+h/2;
        y = y1+k1/2;
        k2 = f(x, y)*h;
        y = y1+k2/2;
        k3 = f(x, y)*h;
        x = x+h/2;
        y = y1+k3;
        y = y1+(k1+2*k2+2*k3+f(x, y)*h)/6;
        y1 = y;
        i = i+1;
    }
    while(i<=n);
    result = y;
    return result;
}

В прикреплении различные реализации на С/C++/C#:

  • rungekutta.csharp.zip - Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка
  • rungekutta.cpp.zip - Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка
  • ablas.zip - оптимизированные базовые операции линейной алгебры с поддержкой SSE2 (только для C++)
  • Ключевые слова: 
    метод Рунге-Кутта, решение дифференциального уравнения первого порядка, дифференциальное уравнение
    ВложениеРазмер
    rungekutta.csharp.zip14.87 кб
    rungekutta.cpp_.zip32.44 кб
    ablas.zip24.19 кб