Программа для решения дифференциальных уравнений первого порядка методом Рунге-Кутта
Анализ предметной области объектно-ориентированного программирования. Языки Delphi, Object Pascal - объектно-ориентированная среда программирования. Основные алгоритмические решения. Решение дифференциального уравнения методом Рунге-Кутта в среде Excel.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 02.04.2011 |
Размер файла | 1,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
ShowMessage('введите Y(x1) неравное -X1');
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end
else
begin
Memo4.Clear;
Memo4.Lines.Add('(3.4-x*y)/(x+y) ');
f:=(3.4-x_rg*y_rg)/(x_rg+y_rg);
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=29 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('y-2x/y ');
f:=y_rg-2*x_rg/y_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end;
{------------------------------------------------------------------------------}
if RadioGroup1.ItemIndex=30 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/y ');
f:=x_rg/y_rg;
Memo3.lines.Add(''+floattostr(f));
Button1.Enabled:=True;
RadioGroup1.Enabled:=False;
RadioGroup1.ItemIndex:=31;
end;
end
{------------------------------------------------------------------------------}
except
on EConvertError do // невозможно преобразовать строку символов в число
begin
MessageDlg('Некорректные значения переменных',mtError,[mbOk],0);
exit;
end;
end;
end;
//------------------------------------------------------------------------------
{Активация ввода образцовых функций}
procedure TRKutta.Button5Click(Sender: TObject);
begin
memo4.clear;
memo3.clear;
RadioGroup1.Enabled:=True; memo1.clear;memo2.Clear;memo3.clear;
memo3.lines.Add(''+floattostr(f));
end;
//------------------------------------------------------------------------------
{Деактивация ввода образцовых функций}
procedure TRKutta.Button6Click(Sender: TObject);
begin
RadioGroup1.Enabled:=False;
Memo3.lines.Add(''+floattostr(f));
end;
//------------------------------------------------------------------------------
{Вывод информации о программе}
procedure TRKutta.N7Click(Sender: TObject);
begin
Form3.ShowModal;
end;
//------------------------------------------------------------------------------
end.
{====================================================}
unit RngeKutta;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls,Rkt,Menus;
type
TRungeKutta=class(TObject)
constructor CreateGr(var hzx:array of real;var hzy:array of real;var lin_arr:integer);
private
{ Private declarations }
public
{ Public declarations }
x0,y0:integer; //координаты начала координатных осей, 2*x0,2*y0 - высота
// и ширина области вывода координатной сетки
dx,dy:integer; // шаг координатной сетки (в пикселях)
y1,y2,xP,xL:integer;// засечки по оси Y и X
dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Y
cross:integer; // счетчик неоцифрованных линий сетки
dcross:integer; // количество неоцифрованных линий между оцифрованными
BaseMasht_X,BaseMasht_Y:extended; //МАХ значения элементов в массивах
razm:integer;
uzx:array of real; //Динамический массив координат-X
uzy:array of real; //Динамический массив координат-Y
uxc,uyc:extended; // Оцифровка по осям
mx,my:extended;
function MaxAbsElementArray(arr:array of real;razmer:integer):real;
procedure UstanovkaParametrov();
procedure KoordPloskost;
end;
TForm2 = class(TForm)
MainMenu1: TMainMenu;
N4: TMenuItem;
N5: TMenuItem;
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
private
{ Private declarations }
RungeKutta:TRungeKutta; //Объявление переменной - объекта класса
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
function TRungeKutta.MaxAbsElementArray(arr:array of real;razmer:integer):real;
var i:integer;
max:real;
begin
i:=1;
max:=arr[1];
while i<>razmer do
begin
i:=i+1;
if abs(arr[i])>max then
begin
max:=abs(arr[i]);
end;
end;
MaxAbsElementArray:=max;
end;
//------------------------------------------------------------------------------
procedure TRungeKutta.UstanovkaParametrov();
begin
//определение max абсолютного значения функции (ордината)
BaseMasht_Y:=MaxAbsElementArray(uzy,razm)+1;
//определение max абсолютного значения аргумента функции (абсцисса)
BaseMasht_X:=MaxAbsElementArray(uzx,razm);
y0:=round(Form2.ClientHeight/2); // оси начинаются в точке (X0,Y0)
x0:=round(Form2.ClientWidth/2);
dcross:=1; // помечать линии сетки X: 1 - каждую;
// 2 - через одну;
// 3 - через две;
dlx:=round(BaseMasht_X)/10; // вес меток оси X
dly:=round(BaseMasht_Y)/10; // вес меток оси Y ,
dx:=round(x0/10); // шаг координатной сетки в пикселях
dy:=round(y0/10); // шаг координатной сетки в пикселях
mx:=round(x0/round(BaseMasht_X)+1);//вычисление масштаба по оси X
my:=round(y0/round(BaseMasht_Y)+1);//вычисление масштаба по оси Y
end;
//------------------------------------------------------------------------------
procedure TRungeKutta.KoordPloskost;
begin
uxc:=0;
uyc:=0;
with form2.Canvas do
begin
cross:=dcross;
//------------------------------------------------------------------------------
//Нанесение засечек и оцифровка координатных осей I,II квадрантов
// засечки и оцифровка по оси X
xP:=x0;
xL:=x0;
repeat
MoveTo(xP,y0-2);LineTo(xP,y0+2); // засечка
MoveTo(xL,y0-2);LineTo(xL,y0+2); // засечка
cross:=cross-1;
if cross = 0 then //оцифровка
begin
TextOut(xP-8,y0+3,FloatToStr(uxc));
TextOut(xL-8,y0+3,FloatToStr(-uxc));
cross:=dcross;
uxc:=uxc+dlx;
end;
Pen.Style:=psDot;
MoveTo(xP,2*y0);LineTo(xP,-2*y0); // линия сетки
MoveTo(xL,2*y0);LineTo(xL,-2*y0);
Pen.Style:=psSolid;
xP:=xP+dx;
xL:=xL-dx;
until (xP>2*x0);
//------------------------------------------------------------------------------
//Нанесение засечек и оцифровка координатных осей III, IV квадрантов
// засечки, и оцифровка по оси Y
y1:=y0-dy;
y2:=y0+dy;
repeat
MoveTo(x0-2,y1);LineTo(x0+2,y1); // засечка
MoveTo(x0-2,y2);LineTo(x0+2,y2);
uyc:=uyc+dly;
TextOut(x0-20,y1,FloatToStr(uyc)); // оцифровка
TextOut(x0-20,y2,FloatToStr(-uyc));
Pen.Style:=psDot;
MoveTo(10,y1);LineTo(2*x0-10,y1); // линия сетки
MoveTo(10,y2);LineTo(2*x0-10,y2);
Pen.Style:=psSolid;
y2:=y2+dy;
y1:=y1-dy;
until (y2>2*y0);
//------------------------------------------------------------------------------
MoveTo(x0,2*y0); LineTo(x0,0); // ось Y
MoveTo(0,y0); LineTo(2*x0,y0); // ось X
end;
end;
//-----------------------------------------------------------------------------
//создание объекта (график функции, координатная сетка, координатные оси)
constructor TRungeKutta.CreateGr(var hzx:array of real;var hzy:array of real;var lin_arr:integer);
var n:integer;
begin
SetLength(uzx,lin_arr); //Установка размера массива uzx
SetLength(uzy,lin_arr); //Установка размера массива uzy
razm:= lin_arr;
for n:=0 to lin_arr do
begin
uzx[n]:=hzx[n]; //инициализация массива uzx
uzy[n]:=hzy[n]; //инициализация массива uzy
end;
UstanovkaParametrov;
KoordPloskost;
for n:=0 to (lin_arr-1) do
begin
form2.canvas.Pixels[(x0+ROUND(uzx[n]*mx)),(y0-round((uzy[n]*my)))]:=clRed;
end;
end;
//------------------------------------------------------------------------------
{Процедура N4Click выводит график функции в установленном масштабе в окне 'График' }
procedure TForm2.N4Click(Sender: TObject);
begin
form2.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
TRungeKutta.CreateGr(zx,zy,line_arr);
end;
//------------------------------------------------------------------------------
{Процедура N5Click закрывает окно вывода графика функции - результата решния ДУ }
procedure TForm2.N5Click(Sender: TObject);
begin
close;
end;
end.
{====================================================}
Unit Spravka;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm3 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label6: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
//------------------------------------------------------------------------------
{Ввывод информации о программе}
procedure TForm3.Button1Click(Sender: TObject);
begin
Caption := 'OK';
ModalResult := mrOK;
OnClick := Button1Click;
end;
end.
{===============================================}
7. РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ Y = Y?2X/Y МЕТОДОМ РУНГЕ - КУТТА В СРЕДЕ EXCEL
дифференциальное уравнение программирование
2. Решение дифференциального уравнения Y = Y?2X/Y программой «РЕШЕНИЕ ОДУ» показано на рис. 5 и рис. 6.(стр. 22 - 23 )
ВЫВОД
Программа «Решение ОДУ» решает заданные дифференциальные уравнения первой степени с достаточно высокой степенью точности.
Размещено на Allbest.ru
Подобные документы
Обыкновенное дифференциальное уравнение первого порядка. Задача Коши, суть метода Рунге-Кутта. Выбор среды разработки. Программная реализация метода Рунге-Кутта 4-го порядка. Определение порядка точности метода. Применение языка программирования C++.
курсовая работа [163,4 K], добавлен 16.05.2016Математическое описание задачи решения обыкновенного дифференциального уравнения численным явным методом Рунге-Кутта, разработка схемы алгоритма и написание программы в среде программирования Microsoft Visual Studio 2010. Тестирование работы программы.
курсовая работа [1,1 M], добавлен 22.01.2014Составление программы на алгоритмическом языке Turbo Pascal. Разработка блок-схемы алгоритма её решения. Составление исходной Pascal-программы и реализация вычислений по составленной программе. Применение методов Рунге-Кутта и Рунге-Кутта-Мерсона.
курсовая работа [385,0 K], добавлен 17.09.2009Численный метод для решения однородного дифференциального уравнения первого порядка методом Эйлера. Решение систем дифференциальных уравнений методом Рунге–Кутта. Решение краевой задачи. Уравнения параболического типа, а также Лапласа и Пуассона.
курсовая работа [163,5 K], добавлен 27.05.2013Обзор методов решения в Excel. Рекурентные формулы метода Эйлера. Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка. Метод Эйлера с шагом h/2. Решение дифференциальных уравнений с помощью Mathcad. Модифицированный метод Эйлера.
курсовая работа [580,1 K], добавлен 18.01.2011Суть метода Рунге-Кутта и его свойства. Решение дифференциальных уравнений первого порядка. Вычислительный блок Given/Odesolve. Встроенные функции rkfixed, Rkadapt, Bulstoer. Решения линейных алгебраических уравнений в среде MathCad и Microsoft Excel.
курсовая работа [1,1 M], добавлен 02.06.2014Разработка программы на языке Turbo Pascal 7.0 для преобразования кинетической схемы протекания химических реакций при изотермических условиях в систему дифференциальных уравнений. Ее решение в численном виде методом Рунге-Кутта четвертого порядка.
курсовая работа [929,7 K], добавлен 06.01.2013Математическая модель, описание теории, применяемой к задаче. Обсчет точек методом Рунге-Кутта, модифицированным методом Эйлера, схема и листинг программы. Решение дифференциальных уравнений и построение графиков, решение уравнений в среде Turbo Pascal.
курсовая работа [76,7 K], добавлен 18.11.2009Реализация решения обыкновенных дифференциальных уравнений 1-го и 2-го порядка методом Рунге-Кутты. Построение на ЭВМ системы отображения результатов в табличной форме и в виде графика. Архитектура и требования к разрабатываемым программным средствам.
курсовая работа [2,7 M], добавлен 05.11.2011Решение дифференциальных уравнений первого порядка. Варианты методов Рунге-Кутта различных порядков. Основные методы численного решения задачи Коши. Повышение точности вычислений и итерационный метод уточнения. Дискретная числовая последовательность.
лабораторная работа [33,3 K], добавлен 14.05.2012