АЛГОРИТМЫ

Новости

Рассылка новостей

Форум

AlgoPascal

Редактор блок-схем

Статьи

О сайте

Контакты



Содержание - Дифференциальные уравнения - Метод Рунге-Кутта для системы уравнений

Метод Рунге-Кутта четвертого порядка для решения системы уравнений первого порядка

Система обыкновенных диференциальных уравнений высшего порядка путем введения новых неизвестных может быть сведена к системе уравнений первого порядка. Рассмотрим такую систему

y' = F(x, y)

где i = 1, ..., n; y = (y, y, ..., y); y(x) = y (0) =(y (0), ..., y (0)). Методе Рунге-Кутта y k вычисляет по формуле:

y (k+1) = y (k) + (k (i)+2k (i)+2k (i)+k (i))/6

где

k (i) = F(x (k), y (k))h
k (i) = F(x (k)+h/2, y (k)+k (i)/2)h
k (i) = F(x (k)+h/2, y (k)+k (i)/2)h
k (i) = F(x (k)+h, y (k)+k (i))h,
h = (x-x)/m

m - количество шагов интегрирования. Процедура использует набор функций F(i, x, y), которые соответствуют функциям F(x, y) описанным выше.

Если нашли ошибку в алгоритме - сообщите!



Реализации алгоритма на различных языках:

Реализация алгоритма на C++
Реализация алгоритма на Delphi
Реализация алгоритма на Visual Basic 6

Блоксхемы:

Посмотреть блок-схему алгоритма
Скачать блок-схему алгоритма


Реализация алгоритма на AlgoPascal:

unit ODESystemRungeKuttaUnit;

declaration
    function F(I:Integer; X:Real; Y:array of Real):Real;

interface
    SystemRungeKutt;
implementation
(*
Метод Рунге-Кутта четвертого порядка для решения
системы дифферециальных уравнений.

procedure SystemRungeKutt(x,x1:real;m,n:integer;var y:array [1..n] of real);

метод решает систему ДУ для n неизвестных за m шагов.

integrate system of differential equation y'=F(x,y) by method Runge-Kutt
*)

procedure SystemRungeKuttStep(
    const   x   :   Real;
    const   h   :   Real;
    const   n   :   Integer;
    var     y   :   array of Real);
var
   I        :   Integer;
   yt       :   array of Real;
   k1       :   array of Real;
   k2       :   array of Real;
   k3       :   array of Real;
   k4       :   array of Real;
begin
    SetBounds(yt,   [1,N]);
    SetBounds(k1,   [1,N]);
    SetBounds(k2,   [1,N]);
    SetBounds(k3,   [1,N]);
    SetBounds(k4,   [1,N]);

    for I:=1 to N do
        k1[i] := h*F(i,x,y);

    for i := 1 to n do
        yt[i] := y[i]+0.5*k1[i];
    for I:=1 to N do
        k2[i] := h*F(i,x+h*0.5,yt);

    for i := 1 to n do
        yt[i] := y[i]+ 0.5*k2[i];
    for I:=1 to N do
        k3[i] := h*F(i,x+h*0.5,yt);

    for i := 1 to n do
        yt[i] := y[i] + k3[i];
    for I:=1 to N do
        k4[i] := h*F(i,x+h,yt);

    for i := 1 to n do
        y[i] := y[i] + (k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;
end;

procedure SystemRungeKutt(
    const   x   :   Real;
    const   x1  :   Real;
    const   m   :   Integer;
    const   n   :   Integer;
    var     y   :   array of Real);
var
    h   :   Real;
    i   :   Integer;
begin
    for I:=0 to M-1 do
        SystemRungeKuttStep(x+I*(x1-x)/m, (x1-x)/m, n, y);
end;

end.

 


Бочканов Сергей, Быстрицкий Владимир
Copyright © 1999-2004
При поддержке проекта MANUAL.RU