16219

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

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

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

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

Русский

2013-06-20

80 KB

5 чел.

Лабораторная работа №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.


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

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

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


 

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

25820. Заболевания наружного носа и носовой полости: Атрезии 24 KB
  Заболевания наружного носа и носовой полости: Атрезии. Врожденные аномалии наружного носа в виде полного его отсутствия расщепления кончика носа двойного носа и пр. встречаются крайне редко и не имеют такого практического значения как врожденные и приобретенные изменения в полости носа ведущие к нарушению проходимости носовой полости для вдыхаемого и выдыхаемого воздуха. Сужение и зарастание полости носа.
25821. Травмы. Искривления носовой перегородки. Инородные тела носа 15.29 KB
  Инородные тела носа. У 80 людей перегородка носа может быть незначительно деформирована. Искривлённая перегородка носа обычно приводит к затруднению дыхания. Чаще всего причина искривления перегородки носа травмы.
25822. Острый и хронический ринит. Связь заболевания носа и среднего уха 14.78 KB
  Связь заболевания носа и среднего уха. Рини́т насморк синдром воспаления слизистой оболочки носа. Острый ринит возникает как следствие воздействия на слизистую оболочку полости носа вирусной или бактериальной инфекции. Поражение распространяется на обе половины носа.
25823. Полипы носа 14.67 KB
  Полипы носа. Назальные полипы обычно делят на антрохоанальные полипы и этмоидальные полипы. Несмотря на их удаление во время хирургического вмешательства назальные полипы возникают повторно примерно в 70 случаев. Она может быть проведена под общей или местной анестезией полипы удаляют при помощи эндоскопической хирургии.
25824. Заболевания полости рта. Дефекты губ и нёба 16.78 KB
  Дефекты губ и нёба. Аномалии твёрдого нёба: слишком высокое и узкое готическое плоское и низкое расщелины твёрдого нёба. Расще́лина нёба разрыв расщелина в средней части нёба возникающая вследствие не заращения двух половин нёба в период эмбрионального развития. Может быть поражена лишь часть нёба например только мягкое нёбо или язычок нёба или же расщелина может проходить по всей длине сочетаясь с билатеральными расщелинами в передней части верхней челюсти; нередко такие дети рождаются с расщелиной губы.
25825. Дефекты языка 13.97 KB
  Дефекты языка. К аномалиям развития языка относится прежде всего полное его отсутствие или аглоссия; недоразвитие языка микроглоссия или ненормально большой язык макроглоссия. Сравнительно частым дефектом развития является врождённое укорочение уздечки языка. При этом дефекте движения языка могут быть затруднены т.
25826. Дефекты челюстей и зубов. Прикусы: нормальный и патологический. Аномалии прикуса 15.92 KB
  Дефекты челюстей и зубов. Неправильное звукопроизношение особенно у детей вызывается различными дефектами строения челюстей которые ведут к аномалиям прикуса: прогнатией когда верхняя челюсть сильно выдается вперед; прогенией когда нижняя челюсть выступает вперед; открытым передним прикусом когда между верхними и нижними зубами при их смыкании остается промежуток; боковым прикусом когда при смыкании боковых зубов остаётся промежуток. Диастема аномалия положения зубов; чрезмерно широкий промежуток между резцами верхней...
25827. Нервно-мышечные нарушения полости рта 14.1 KB
  Одной из причин поражения лицевого нерва является воспаление среднего уха т. Из других причин необходимо отметить его травматические поражения и простудное воздействие. Паралич лицевого нерва бывает как правило односторонним что приводим к асимметричной деформации лица: на стороне поражения не закрывается глаз не поднимается бровь угол рта и щека опущены книзу отведение губ и оскаливание зубов невозможны весь рот перетянут на противоположную сторону. губы на стороне поражения не смыкаются и воздух свободно выходит через...
25828. Аудит расчетов с подотчетными лицами 45.5 KB
  Не все организации расплачиваются по безналичному расчету перечисляя деньги со своего счета на счет продавца. Для этого деньги выдаются из кассы сотрудникам под отчет. Если при покупке были израсходованы не все деньги то остаток сотрудник должен вернуть в кассу. Если же сотрудник переплатил добавил свои деньги то сумма переплаты организация должна ему компенсировать.