Курсовая работа: Программа для решения дифференциальных уравнений первого порядка методом Рунге-Кутта
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RKutta: TRKutta;
x1,x2,yc,xc,y,h:extended;
line_arr:integer; // размерность массивa
f:real; // значение функции при начальных условиях
zx:array of real;
zy:array of real;
implementation
uses RungeKutta, Spravka;
{$R *.DFM}
procedure TRKutta.Button1Click(Sender: TObject);
var k1,k2,k3,k4:extended;
t:integer;
begin
Memo1.Clear;
Memo2.Clear;
memo1.Enabled:=true;
memo2.Enabled:=true;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=False;
//Проверка возможности ввода начальных условий и инициализация переменных
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 -величины шага вычислений
//определение размера массивов содержащего значения аргумента и функции
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;
except
on EConvertError do // невозможно преобразовать строку символов в число
begin
MessageDlg('Некорректные значения переменных',mtError,[mbOk],0);
exit;
end;
end;
if ((y+(k1/2))=0) or ((y+(k2/2))=0) or((y+k3)=0) then
begin
Button3.Enabled:=False;
N3.Enabled:=False;
end
else
begin
Button3.Enabled:=True;
N3.Enabled:=True;
end;end;
//------------------------------------------------------------------------------
procedure TRKutta.Button2Click(Sender: TObject);
begin
memo1.Clear;
MEMO2.Clear;
MEMO3.Clear;
memo4.Clear;
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
end;
//------------------------------------------------------------------------------
{Процедура вывода окна ГРАФИК}
procedure TRKutta.Button3Click(Sender: TObject);
begin
Button3.enabled:=false;
N3.Enabled:=false;
Form2.ShowModal;
end;
//------------------------------------------------------------------------------
{Процедура выхода из программы}
procedure TRKutta.Button4Click(Sender: TObject);
begin
Close;
end;
//------------------------------------------------------------------------------
{Процедура выбора образцовой функции}
procedure TRKutta.RadioGroup1Click(Sender: TObject);
var x_rg,y_rg:extended;
begin
try
y_rg:=strtofloat(edit3.Text); //ввод Y(x1)
x_rg:=strtofloat(edit1.Text); //ввод X1
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=0 then
begin
if x_rg=0 then
begin
ShowMessage('введите X1 неравное 0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo3.clear;
Memo4.Clear;
Memo4.Lines.Add(' -(y+1)/x '); вывод формулы функции в окно "dY"
f:=-(y_rg+1)/x_rg; //вычисление значения dY
Memo3.lines.Add(''+floattostr(f)); //вывод значения dY в окно "dY(x1,y1)"
// сброс радиокнопки (с целью корретного вычисления
// значения dy(x1,y1) при вводе других данных)
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=1 then
begin
if y_rg=0 then
begin
ShowMessage('введите Y(x1) неравное 0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo4.Clear;
Memo4.Lines.Add('x*(x^2-1)/(x^2+1)*y ');
f:=x_rg*(power(x_rg,2)-1)/(power(x_rg,2)+1)*y_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=2 then
begin
if x_rg=0 then
begin
ShowMessage('введите X1 неравное 0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo3.Clear;
Memo4.Clear;
Memo4.Lines.Add('(x*cos(y/x))^2+y)/x ');
f:=x_rg*(POWER(cos(y_rg/x_rg),2)+y_rg)/x_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=3 then
begin
if x_rg=0 then
begin
ShowMessage('введите X1 неравное 0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo3.Clear;
Memo4.Clear;
Memo4.Lines.Add('2*x*sin(x)+y*ctg(x) ');
f:=2*x_rg*sin(x_rg)+y_rg*cot(x_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=4 then
begin
Memo3.Clear;
Memo4.Clear;
Memo4.Lines.Add('((e^y)+cos(x) ');
f:=(exp(y_rg))+cos(x_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=5 then
begin
Memo3.Clear;
Memo4.Clear;
Memo4.Lines.Add('e^(x+y) ');
f:=exp(y_rg+x_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=6 then
begin
if ((x_rg<=0) and (y_rg>=0))or((x_rg>=0) and (y_rg<=0)) then
begin
ShowMessage('X1 / Y(X1) не должны быть <=0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo4.Clear;
Memo4.Lines.Add('(y/x)ln(y/x) ');
f:=(y_rg/x_rg)*ln(y_rg/x_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=7 then
begin
if x_rg=0 then
begin
ShowMessage('введите X1 неравное 0');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo4.Clear;
Memo4.Lines.Add(' sin(y/x)+y/x ');
f:=sin(y_rg/x_rg)+y_rg/x_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=8 then
begin
Memo4.Clear;
Memo4.Lines.Add(' 6x-sin(x) ');
f:=6*x_rg-sin(x_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=9 then
begin
Memo4.Clear;
Memo4.Lines.Add(' x+2y ');
f:=x_rg+2*y_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=10 then
begin
Memo4.Clear;
Memo4.Lines.Add(' e^x-y ');
f:=exp(x_rg)-y_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;