Помогите пожалуйста , реализовать решение дифференциальных уравнений 1 порядка методом Рунге-Кутта
Код | procedure TForm1.Button1Click(Sender: TObject); var k1,k2,k3,k4:extended; t:integer; begin Form1.Button4.Click; Memo1.Clear;
Memo2.Clear;
memo1.Enabled:=true;
memo2.Enabled:=true;
//Проверка возможности ввода начальных условий и инициализация переменных
try
x1:=StrToFloat(Edit1.Text); //инициализация(ввод) x1(начало отрезка)
xc:=StrToFloat(Edit1.Text); //передача начальных условий (х0)в графический модуль
x2:=StrToFloat(Edit2.Text); //инициализация(ввод) x2(конец отрезка)
y:=StrToFloat(Edit3.Text); //инициализация(ввод) Y(x1)
yc:=StrToFloat(Edit3.Text); //передача начальных условий (Y0)в графический модуль
h:=StrToFloat(Edit4.Text); //инициализация(ввод) H -величины шага вычислений
//*********************************** f:=Calculate(Edit5.Text); // Определение каждого символа Парсер)
//определение размера массивов содержащего значения аргумента и функции
line_arr:=round(abs((x2-x1)/h))+1;
//Установка размера динамических массивов zx, zy
SetLength(zx, line_arr);
SetLength(zy, line_arr);
t:=0; // счётчик
while x1<x2
do
begin
zx[t]:=x1;
zy[t]:=y;
k1:=h*f;
if (y+(k1/2))=0 then begin showmessage ('Деление на 0!'+#13+' Измените h'); break;
end;
k2:=h*((y+(k1/2))-(2*(x1+(h/2)))/(y+(k1/2)));
if (y+(k2/2))=0 then begin showmessage ('Деление на 0!'+#13+' Измените h'); break;
end;
k3:=h*((y+(k2/2))-(2*(x1+(h/2)))/(y+(k2/2)));
if (y+k3)=0 then begin showmessage ('Деление на 0!'+#13+' Измените h');break;
end;
k4:=h*(y+k3-2*(x1+(h/2)))/(y+k3);
x1:=x1+h;
y:=y+(1/6)*(k1+2*k2+2*k3+k4);
t:=t+1;
Memo1.Lines.Add('x['+floattostr(t)+']='+floattostr(x1));
Memo2.Lines.Add('y['+floattostr(t)+']='+floattostr(y));
end;
Memo3.Lines.Add(''+floattostr(f));
except
on EConvertError do // невозможно преобразовать строку символов в число
begin
MessageDlg('Некорректные значения переменных',mtError,[mbOk],0);
exit;
end;
end;
end;
|
Заранее спасибо! |