16219

РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ ПЕРВОГО ПОРЯДКА

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №7 Решение дифференциальных уравнений первого порядка Цель лабораторной работы: Изучить принципы создания класса для решения дифференциальных уравнений первого порядка. Постановка задачи: Разработать класс решения дифференциальных уравнен...

Русский

2013-06-20

80 KB

4 чел.

Лабораторная работа №7

Решение дифференциальных уравнений первого порядка

Цель лабораторной работы: Изучить принципы создания класса для решения дифференциальных уравнений первого порядка.

Постановка задачи:

Разработать класс решения дифференциальных уравнений первого порядка методом Эйлера, методом Рунге-Кутта четвертого порядка. Головная программа должна предоставлять возможность выбора метода решения и дифференциального уравнения и списка.

Краткие теоретические сведения:

Дифференциальным уравнением первого порядка называется уравнение вида F(x,y,у')=0 или у'=f(x,y). Функция y(x), при подстановке которой уравнение обращается в тождество, называется решением дифференциального уравнения.

Рассмотрим несколько численных методов решения дифференциальных уравнений первого порядка. Описание численных методов приводится для уравнения в виде у'=f(x,y).

  1.  Метод Эйлера.

Рассмотрим два варианта вывода расчетных формул

y1=y0+h*f(x0,y0)

x1=x0+h

Расчетные формулы для 1-го шага

yi+1=yi+h*f(xi,yi)

xi+1=xi*h

Расчетные формулы для i-го шага


  1.  Модифицированный метод Эйлера (вариант 2).

уi+1i+(h/2)[f(xi,yi)+f(xi,+h,yi+hf(xi,yi))],

xi+1=xi+h.

  1.  Метод Рунге-Кутта четвертого порядка.

уi+1=уi+(k1+2k2+2k3+k4)/6,

k1=hf(xi,yi),

k2=hf(xi+h/2, yi+k1/2),

k3=hf(xi+h/2, yi+k2/2),

k4=hf(xi+h, yi+k3),

xi+1=xi+h,

где уi+1i - значения искомой функции в точках xi+1, xi соответственно, индекс i показывает номер шага интегрирования, h - шаг интегрирования. Начальные условия при численном интегрировании учитываются на нулевом шаге: i=0, x=x0, y=y0.

Текст программы:

// основная программа

unit UMainForm;

interface

uses

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

 Dialogs, StdCtrls, ExtCtrls, ComCtrls, TeeProcs, TeEngine, Chart, Series,

 Buttons, BubbleCh, Grids, DiffEquation;

type

 TForm1 = class(TForm)

   EditMin: TEdit;

   EditMax: TEdit;

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Panel1: TPanel;

   Label4: TLabel;

   Bevel1: TBevel;

   DisplayChart: TChart;

   Series1: TLineSeries;

   SpeedButton1: TSpeedButton;

   Panel4: TPanel;

   RadioGroupEquation: TRadioGroup;

   Table: TStringGrid;

   Label5: TLabel;

   Panel2: TPanel;

   EditH: TEdit;

   Label6: TLabel;

   Panel3: TPanel;

   GroupBox1: TGroupBox;

   CheckBox1: TCheckBox;

   CheckBox2: TCheckBox;

   CheckBox3: TCheckBox;

   Series2: TLineSeries;

   Series3: TLineSeries;

   procedure SpeedButton1Click(Sender: TObject);

   procedure RadioGroupEquationClick(Sender: TObject);

   procedure GroupBox1Click(Sender: TObject);

   procedure CheckBoxesClick(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 Diff:TDifferentia;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

 Method:TMethod;

begin

if Assigned(Diff) then

 diff.Free;

if CheckBox1.Checked=true then Method[0]:=1 else Method[0]:=0;

if CheckBox2.Checked=true then Method[1]:=1 else Method[1]:=0;

if CheckBox3.Checked=true then Method[2]:=1 else Method[2]:=0;

case (RadioGroupEquation.ItemIndex) of

 0:Diff:=TDifferentia.Create(StrToFloat(EditMin.Text),StrToFloat(EditMax.Text),Method,StrToFloat(EditH.Text),DisplayChart,Table);

 1:Diff:=TDifferentia1.Create(StrToFloat(EditMin.Text),StrToFloat(EditMax.Text),Method,StrToFloat(EditH.Text),DisplayChart,Table);

 2:Diff:=TDifferentia2.Create(StrToFloat(EditMin.Text),StrToFloat(EditMax.Text),Method,StrToFloat(EditH.Text),DisplayChart,Table);

end;

end;

procedure TForm1.RadioGroupEquationClick(Sender: TObject);

begin

//  ShowMessage('Для вычисления значений нажмите кнопку "РАССЧИТАТЬ"');

end;

procedure TForm1.GroupBox1Click(Sender: TObject);

begin

 ShowMessage('Для вычисления значений нажмите кнопку "РАССЧИТАТЬ"');

end;

procedure TForm1.CheckBoxesClick(Sender: TObject);

begin

 Diff.Method[(Sender as TCheckBox).Tag]:=ord((Sender as TCheckBox).Checked);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 SpeedButton1.Click;

end;

end.

unit DiffEquation;

interface

Uses Chart, Grids, Classes, SysUtils;

Type

 TArrayList = array [0..2] of TList;

 TPoint = Record

     x:Extended;

     y:Extended;

   end;

 PPoint=^TPoint;

 TMethod=array [0..2] of byte;

 TDifferentia = class

   private

     FMin:Extended;  // мин. граница промежутка

     FMax:Extended;  // макс. граница промежутка

     FH:Extended;    // шаг вычисления

     FN:Integer;     // количество итераций

     FMethod:TMethod;    // метод вычисления

     FChart:TChart;  // область отображения

     FTable:TStringGrid;  // таблица для значений

     PD:PPoint;

     FResult:TArrayList;

     procedure DrawF(AResult:TList;series:Byte);

     procedure FillTable(AResult:TList; ARow:Byte);

{     procedure SetMin(newMin:Extended);

     procedure SetMax(newMax:Extended);

     procedure SetMethod(newMetod:Byte);}

   public

     constructor Create(AMin,AMax:Extended; AMethod:TMethod; AH:Extended; AChart:TChart; ATable:TStringGrid); overload;

     function F(x0,y0:Extended):Extended;  virtual;

     property Min:Extended read FMin write FMin;

     property Max:Extended read FMax write FMax;

//     property Method:Byte read FMethod write FMethod;

     property Chart:TChart read FChart write FChart;

     property Table:TStringGrid read FTable write FTable;

     procedure Calculate;

     procedure Calc_Ejler;

     procedure Calc_Modify_Ejler;

     procedure Calc_Runge_Kutta;

     function GetMethod(ind: integer): byte;

     procedure SetMethod(ind: integer;ANew: byte);

     procedure OutPut;

     property Method[ind: integer]: byte read GetMethod write SetMethod;

  end;

 TDifferentia1 = class (TDifferentia)

   public

     function F(x0,y0:Extended):Extended;     override;

 end;

 TDifferentia2 = class (TDifferentia)

   public

     function F(x0,y0:Extended):Extended;     override;

 end;

implementation

function TDifferentia.GetMethod(ind:  integer): byte;

begin

 Result:=FMethod[ind];

end;

procedure TDifferentia.SetMethod(ind: integer;ANew: byte);

begin

 FMethod[ind]:=ANew;

 Self.OutPut;

end;

function TDifferentia1.F(x0,y0:Extended):Extended;

begin

 Result:=(1-2*x0)/(y0*y0);

 Result:=FH*Result;

end;

function TDifferentia2.F(x0,y0:Extended):Extended;

begin

 Result:=sin(x0)-y0;

 Result:=FH*Result;

end;

constructor TDifferentia.Create(AMin,AMax:Extended; AMethod:TMethod; AH:Extended; AChart:TChart; ATable:TStringGrid);

begin

 FMin:=AMin;

 FMax:=AMax;

 FH:=AH;

 FN:=round((FMax-FMin)/FH)+1;

 FMethod:=AMethod;

 FChart:=AChart;

 FTable:=ATable;

 Calculate;

 OutPut;

end;

function TDifferentia.F(x0,y0:Extended):Extended;

begin

 Result:=3*x0-2*y0+5;

 Result:=FH*Result;

end;

procedure TDifferentia.Calculate;

begin

 Calc_Ejler;

 Calc_Modify_Ejler;

 Calc_Runge_Kutta;

end;

procedure TDifferentia.Calc_Ejler;

var

 i:Integer;

 x:Extended;

 y0,y:Extended; // y0 предыдущее значение

begin

 FResult[0]:=TList.Create;

 x:=FMin;

 y0:=1;

 for i:=1 to FN do

  begin

    new(PD);

    y:=y0+F(x-FH,y0);

    y0:=y;

    PD^.x:=x;

    PD^.y:=y;

    x:=x+FH;

    FResult[0].Add(PD);

  end;

end;

procedure TDifferentia.Calc_Modify_Ejler;

var

 i:integer;

 x:Extended;

 y0,y:Extended;

begin

 FResult[1]:=TList.Create;

 x:=FMin;

 y0:=1;

 for i:=1 to FN do

   begin

     new(PD);

     y:=y0+f((x+FH/2),(y0+f(x,y0)/2));

     y0:=y;

     PD^.x:=x;

     PD^.y:=y;

     x:=x+FH;

     FResult[1].Add(PD);

   end;

end;

procedure TDifferentia.Calc_Runge_Kutta;

var

  k1,k2,k3,k4:Extended;

  y0,y:Extended;

  x:Extended;

  i:integer;

begin

 FResult[2]:=TList.Create;

 x:=FMin;

 y0:=1;

 for i:=1 to FN do

   begin

     new(PD);

     k1:=f(x,y0);

     k2:=f(x+FH/2, y0+k1/2);

     k3:=f(x+FH/2, y0+k2/2);

     k4:=f(x+FH, y0+k3);

     y:=y0+(k1+2*k2+2*k3+k4)/6;

     y0:=y;

     PD^.x:=x;

     PD^.y:=y;

     x:=x+FH;

     FResult[2].Add(PD);

   end;

end;

procedure TDifferentia.DrawF(AResult:TList;series:Byte);

var

 i:integer;

begin

FChart.Series[series].Clear;

     for  i:=0 to AResult.Count-1 do

     begin

       new(PD);

       PD:=AResult[i];

       FChart.Series[series].AddXY(PD^.x, PD^.y);

     end;

end;

procedure TDifferentia.OutPut;

var

 i:integer;

 x:Extended;

begin

FTable.Rows[0].Clear;

FTable.Rows[1].Clear;

FTable.Rows[2].Clear;

FTable.Rows[3].Clear;

FChart.Series[0].Clear;

FChart.Series[1].Clear;

FChart.Series[2].Clear;

if ((FMethod[0]=1)or(FMethod[1]=1)or(FMethod[2]=1)) then

  if (Assigned(FChart))and(Assigned(FTable)) then

   begin

     FTable.Cells[0,0]:='   X ';

     FTable.ColCount:=2;

     x:=FMin;

     for i:=1 to FN do

          begin

            FTable.ColCount:=FTable.ColCount+1;

            FTable.Cells[i,0]:=FloatToStr(x);

            x:=x+FH;

          end;

     FTable.ColCount:=Table.ColCount-1;

     if FMethod[0]=1 then

         begin

           FTable.Cells[0,1]:='   Y1 ';

           DrawF(FResult[0],0);

           FillTable(FResult[0],1);

         end;

     if FMethod[1]=1 then

         begin

           FTable.Cells[0,2]:='   Y2 ';

           DrawF(FResult[1],1);

           FillTable(FResult[1],2);

         end;

     if FMethod[2]=1 then

          begin

           FTable.Cells[0,3]:='   Y3';

           DrawF(FResult[2],2);

           FillTable(FResult[2],3);

          end;

   end;

end;

procedure TDifferentia.FillTable(AResult:TList; ARow:Byte);

var

i:integer;

begin

for  i:=0 to AResult.Count-1 do      // y - столбцы

     begin

       new(PD);

       PD:=AResult.Items[i];

       FTable.Cells[i+1,ARow]:=FloatToStr(PD^.y);

       //Dispose(PD);

     end;

end;

end.


Результаты работы программы:

Вывод: В результате выполнения данной лабораторной работы были изучить принципы создания класса для решения дифференциальных уравнений первого порядка.

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


 

А также другие работы, которые могут Вас заинтересовать

52175. Amazing America 389.5 KB
  Knowing that the earth was round he decided to reach India by sailing to the west. It was very difficult for him to organize an expedition as nobody wanted to help him. At last the Spanish king gave him some money. In the 1492 he sailed with 3 small ships in to the Atlantic Ocean. They had been sailing for more than 2 months and at last they saw land.
52177. An Exciting World of Science 2.4 MB
  Good morning, everybody! Today we are going to deal with great inventions and their inventors. I believe youll enjoy the subject of our todays lesson. Well talk about great inventions named after their creators. Well talk about computer, this wonderful invention of human talent. It opens the magic world of internet before us.
52178. Аналіз посібника для ДПА 2013 з української мови для 4 класів 81 KB
  Мета ДПА з української мови 2. мови мови навчання і посібника для навчальних закладів з російською мовою навчання 3. Зміни у посібнику з української мови мови навчання 2013 рр.
52179. Похідна 280 KB
  Мета: узагальнення та систематизація знань учнів з теми формування вмінь та навичок знаходження похідної рівняння дотичної застосування геометричного та фізичного змісту похідної; виховання прагнення застосовувати здобуті знання уміння вирішувати поставлені проблеми; розвиток творчих здібностей уваги та пам’яті. Розв’язування вправ і задачГрупова робота. Їм потрібно продемонструвати вміння використовувати теоретичний матеріал про похідну під час розв’язування вправ. На дошці записана умова завдання щоб під час обдумування та...
52180. Завершення формування індустріального суспільства у провідних країнах світу 86.5 KB
  Організаційний момент Учитель пропонує учням об’єднатися в групи пари для подальшої. Учитель наголошує про наявність завдань випереджувального характеру. Учитель..
52181. Виды методического анализа и самоанализа уроков 1.02 MB
  Теоретические основы анализа урока. Основные требования к современному уроку 5 Основные учебные умения которые должны формироваться на уроке 9 Технология педагогического анализа Поэлементный подход Системный подход Личностноориентированный подход Здоровьесберегающий подход 10 Требования к организации анализа урока 13 Особенности анализа урока в условиях введения ФГОС нового поколения 14 Часть2. Варианты схем анализа 18 Полный анализ урока 18 Поэтапный и структурный анализ урока 22 Аспектный анализ урока...