RSS    

   Курсовая работа: Программа для решения дифференциальных уравнений первого порядка методом Рунге-Кутта

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;

Страницы: 1, 2, 3, 4, 5, 6, 7


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.