вторник, 14 октября 2008 г.

Основы информатики. Вычисление обыкновенных дифференциальных уравнений. Метод Рунге-Кутта (через for)

Для расчетов на профессиональном уровне наиболее часто используются средства из группы методов РУНГЕ-КУТТА. Для большинства задач наиболее оптимальным из этой группы является метод Рунге-Кутта четвертого порядка, который достаточно прост в реализации, имеет высокую точность и хорошую устойчивость. Мы по-прежнему рассматриваем дифференциальное уравнение первого порядка y'=f(x,y) с начальным условием y(x0)=y0. Для решения выбирается достаточно малый постоянный шаг изменения независимой переменной h так, что очередное значение xi есть xi-1+h=x0+ih, где i=1,2,3,.... Очередное значение искомой функции определяется из предыдущего по формуле:где коэффициенты k на каждом шаге определяются через значения функции f(x,y) при определенных значениях аргументов:Можно видеть, что на каждом шаге сначала вычисляются коэффициенты в той последовательности, в которой они указаны (поскольку они вычисляются один через другой), а затем определяется очередное значение функции.

Программный код:
procedure TForm1.Button3Click(Sender: TObject);
var
 x,y,h,k1,k2,k3,k4:real;
 i,n:integer;
begin
 n:=strtoint(edit1.Text);
 h:=1/n;
 x:=0;
 y:=1;
 paintbox1.Canvas.Pen.Color:=clgreen;
 paintbox1.Canvas.moveto(c.x+round(x*f.x),c.Y-10-round(y*f.y));
 for i:=1 to n do
  begin
  k1:=x*y*h;
  k2:=((x+h/2)*(y+k1/2))*h;
  k3:=((x+h/2)*(y+k2/2))*h;
  k4:=((x+h)*(y+k3))*h;
  x:=x+h;
  y:=y+(k1+k4+2*(k2+k3))/6;
  paintbox1.Canvas.lineto(c.x+round(x*f.x),c.Y-10-round(y*f.y));
  end;
end;

Если у кого то Delphi ниже 7-й версии, то удалите в исходнике слово XPMan в разделе Uses, и строчку XPManifest1: TXPManifest; в разделе type.

Скачать проект

Комментариев нет: