Для расчетов на профессиональном уровне наиболее часто используются средства из группы методов РУНГЕ-КУТТА. Для большинства задач наиболее оптимальным из этой группы является метод Рунге-Кутта четвертого порядка, который достаточно прост в реализации, имеет высокую точность и хорошую устойчивость. Мы по-прежнему рассматриваем дифференциальное уравнение первого порядка 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.
Комментариев нет:
Отправить комментарий