скачать рефераты
  RSS    

Меню

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

скачать рефераты

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


Наиболее часто используется метод Рунге-Кутта четвертого порядка, для которого расчетные формулы имеют следующий вид:

K1=hf(xi, yi);

K2=hf(xi + 0,5h, yi+0,5 K1);

K3=hf(xi+0,5h, yi+0,5K2).

K3=hf(xi+h, yi+K3).

Формулы Рунге-Кутта имеют погрешности порядка h q+1 . Погрешность метода Рунге-Кутта четвертого порядка имеет порядок h5

4.2 Описание программы ” РЕШЕНИЕ ОДУ “

Программа ”Решение ОДУ“ достаточно проста в использовании.

При запуске программы открывается главное окно программы (рис. 4), с установленными по умолчанию начальными условиями в полях ввода.

Назначение элементов ввода данных.

1.  Поля X1, X2, Y(x1), H предназначены для ввода начального и конечного значений отрезка, на котором ищется решение дифференциального уравнения, значения функции при аргументе равном Х1 и величины шага дифференцирования;

2.  В поле dY выводится формула дифференциального уравнения 1-й степени, выбранная для решения;

3.  В поле dY(x1,y1) выводится значение производной в исходной точке.


Рис.4

Назначение элементов управления и контроля.

1.  При нажатии кнопки EXAMPLE активируются “радиокнопки” выбора уравнений;

2.  Щелчком “радиокнопки” выбирается соответствующее ей уравнение, вид формулы контролируется по её отображению в поле dY ;

3.  Щелчком по кнопке ВЫЧИСЛИТЬ находятся приближенные решения выбранного дифференциального уравнения на заданном интервале;

4.  Решения дифференциального уравнения в виде пар значений X - Y выводятся в поля X и Y; (рис. 5.)

По окончании вычислений активируются кнопка ГРАФИК и пункт меню ГРАФИК главного окна системы.


Рис.5

4.3 Назначение элементов графического окна программы

Вход в графическое окно осуществляется с помощью кнопок ГРАФИК на главной форме или пункт меню ГРАФИК (рис. 6).

С помощью кнопки ВЫЧЕРТИТЬ на координатную плоскость выводится график функции – решение дифференциального уравнения на заданном интервале.


рис.6

4.4 Реакция программы при возникновении ошибок

При вводе пользователем ошибочных данных (отсутствии начальных условий, некорректных значений переменных) программа выдает сообщение об ошибке (рис.7 а, б) рис.7а. рис.7б.

рис 7а                                         Рис.7б


Версия DELPHI

4.5 Перечень компонент DELPHI использованных в программе

В Form1 использованы компоненты:

- Edit1.text, Edit2.text, Edit3.text, Edit4.text – для ввода начальных условий дифференциального

уравнения

- Memo4.TMemo – для вывода формулы уравнения;

- Memo1.TMemo, Memo2.TMemo - для вывода результатов вычислений;

- Memo3.TMemo – для вывода значения производной в точке (Х0,Y0)

- ScrollBars ssVertical в свойствах Memo1.TMemo, Memo2.TMemo;

- Button1 “Вычислить”, Button2 “Очистить”, Button3 “График”, Button4 “Выход”,

Button5 “Example”, Button6 “UnExample”;

- Label1.TLabel - Label9.TLabel – для отображения назначения компонентов Memo и Edit;

- RadioGroup – для выбора вида уравнения;

- MainMenu ;

В Form2 использованы компоненты:

- MainMenu - для построения графика;

В Form3 использованы компоненты:

- Panel1.T Panel – для размещения информации о программе;

- Label1.TLabel – Label14.TLabel – для отображения информации о программе;

- Button1.T Button “OK” – для выхода из окна


5. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ И ТРЕБОВАНИЯ К ПО

Технические характеристики

Программа работает в среде операционных систем Windows 9х, NT.

Требования к ПО

Минимальные системные требования

a процессор Intel 486 с рабочей частотой 66 MHz и выше;

b) операционная система Windows 95, 98, NT 4.0, 2000, XP;

с) 16 Мбайт оперативной памяти (или более);

d) 3 Мбайт свободного пространства на жёстком диске.


6. ТЕКСТ ПРОГРАММЫ

Код программы

unit RKt;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, CheckLst, ComCtrls, ExtCtrls,math, Menus;

type

TRKutta = class(TForm)

Label2: TLabel;

Label3: TLabel;

Label5: TLabel;

Label6: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Memo1: TMemo;

Memo2: TMemo;

Button1: TButton;

Button2: TButton;

Label4: TLabel;

Label7: TLabel;

Button3: TButton;

Button4: TButton;

Label9: TLabel;

RadioGroup1: TRadioGroup;

Button5: TButton;

Memo3: TMemo;

Button6: TButton;

MainMenu1: TMainMenu;

N1: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Example1: TMenuItem;

UnExample1: TMenuItem;

N5: TMenuItem;

N7: TMenuItem;

N2: TMenuItem;

N9: TMenuItem;

N8: TMenuItem;

Label1: TLabel;

Memo4: TMemo;

Label8: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure RadioGroup1Click(Sender: TObject);

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;

{------------------------------------------------------------------------------}

if RadioGroup1.ItemIndex=11 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(' y*ctg(x) ');

f:=cot(x_rg)*y_rg;

Memo3.lines.Add(''+floattostr(f));

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


Новости

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

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

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.