![]() |
![]() |
||||
![]() | |||||
![]() |
![]() АЛГОРИТМЫ Новости Рассылка новостей Форум AlgoPascal Редактор блок-схем Статьи О сайте Контакты |
![]() |
![]() Метод Рунге-Кутта четвертого порядка для решения системы уравнений первого порядкаСистема обыкновенных диференциальных уравнений высшего порядка путем введения новых неизвестных может быть сведена к системе уравнений первого порядка. Рассмотрим такую систему yi ' = Fi (x, y)где i = 1, ..., n; y = (y1 , y2 , ..., yn ); y(x0 ) = y (0) =(y (0)1 , ..., y (0)n ). Методе Рунге-Кутта yi k вычисляет по формуле: yi (k+1) = yi (k) + (k1 (i)+2k2 (i)+2k3 (i)+k4 (i))/6где k1 (i) = Fi (x (k), y (k))hk2 (i) = Fi (x (k)+h/2, y (k)+k1 (i)/2)h k3 (i) = Fi (x (k)+h/2, y (k)+k2 (i)/2)h k4 (i) = Fi (x (k)+h, y (k)+k3 (i))h, h = (xf -x0 )/m
m - количество шагов интегрирования.
Процедура использует набор функций Если нашли ошибку в алгоритме - сообщите! Реализации алгоритма на различных языках:![]() ![]() ![]() Блоксхемы:![]() ![]() Реализация алгоритма на 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. |
![]() |
|
|
![]() |