/
Зміст
1. Поняття математичного моделювання
2. Завдання
3. Постановка задачі та метод її розв'язку
4. Блок-схема модифікованого метода Ейлера
5. Код програми в середовищі Delphi 7
6. Опис програми та її блок-схема
7. Контрольні приклади
1. Поняття математичного моделювання
Поняття математичного моделювання трактується різними авторами по своєму. Ми будемо його пов'язувати з нашою спеціалізацією - прикладна математика.
Під математичним моделюванням ми будемо розуміти метод дослідження процесів або явищ шляхом побудови їхніх математичних моделей і дослідження цих процесів.
В основу методу покладемо адекватність між змінними складеного рівняння і досліджуваного процесу. Зрозуміло, що на практиці ці процеси не будуть абсолютно ідентичні. Але можна удосконалювати математичну модель, яка більш точно буде описувати цей процес.
Треба пам'ятати, що в останньому випадку, як правило, математичні рівняння ускладнюються. А це означає, що їх моделювання на ЕОМ потребує більше часу, або ж більше не визначаючих обчислювальних комплексів.
Схема таких досліджень починається з постановки задачі і закінчується проведенням ефективного обчислювального експерименту. Її умови можна записати в такій формі:
а) постановка задачі;
б) побудова математичної моделі;
в) перевірка її адекватності;
г) узагальнення та теоретичне дослідження даного класу задач;
д) створення програмного забезпечення;
е) проведення обчислювального експерименту;
ж) впровадження цих результатів в виробництво.
2. Завдання
Дослідити кінематику хімічної реакції, яка описується рівнянням
Математична модель реакції представлена у вигляді:
де , ,-концентраціїкомпонентів у момент t, а , - константи швидкості реакції. За отриманими даними побудувати графіки зміни концентрації для кожного компонента. Обчислення провести модифікованим методом Ейлера.
3. Постановка задачі та метод її розв'язку
Диференційне рівняння п-порядку називається лінійним однорідними,якщо воно першої степені відносно шуканої функції у і її похідних у?,...,у(n-1), у(n), тобто має вид:
у(n) + а1у(n-1)+....+ аnу =0
Метод Ейлера являється відносно грубим і застосовується в основному для орієнтовних розрахунків. Але ідеї, які закладені в основі метода, являються вихідними для ряду інших методів.
Нехай задано диференціальне рівняння
у' = f (x,y )(1)
з початковими умовами
х = х0, у(х0) = у0(2)
Потрібно знайти розв'язок рівняння (1) на відрізку [а,b]
Розіб'ємо відрізок [а,b] на n рівних частин, одержимо послідовність х0, х1, х2,…..,хn, де хі = х0+іh (i =0,1,2,….n), h = (b-a)/n -крок інтегрування.
Рис. 1
Розглянемо метод на елементарному відрізку , на якому інтегральну криву заміняємо в точці дотичною. Тобто в точці проводимо пряму з кутовим коефіцієнтом , рівняння даної прямої:
Визначаємо точку перетину цієї прямої з прямою проведеної в точці . Підставивши в рівняння прямої маємо:
Отримане значення вважають значенням шуканої функції. Операцію повторюємо на проміжку і так далі на всьому проміжку
З метою підвищення точності методу Ейлера використовують різні його модифікації.
Модифікований метод Ейлера. Відмінність полягає в тому, що спочатку розраховується значення функції в середині даного кроку, а потім робиться повний крок.
Xk+1=Xk+h;
Yk+1=Yk+F(Xk+h/2;Yk+F(Xk;Yk)h/2);
4. Блок-схема модифікованого метода Ейлера
Рис. 2
5. Код програми в середовищі Delphi 7
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls, Grids,
ValEdit, jpeg;
type
TForm1 = class(TForm)
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
Button1: TButton;
Button3: TButton;
StringGrid1: TStringGrid;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
LabeledEdit6: TLabeledEdit;
LabeledEdit8: TLabeledEdit;
Chart1: TChart;
Series2: TLineSeries;
Series1: TLineSeries;
Series3: TLineSeries;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure LabeledEdit4KeyPress(Sender: TObject; varKey: Char);
procedure LabeledEdit3KeyPress(Sender: TObject; varKey: Char);
procedure LabeledEdit1KeyPress(Sender: TObject; varKey: Char);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
Form1: TForm1;
a,b,h,k1,k2,ya,yb,yc,y1,y2,y3:real;
i,n:integer;
implementation
uses Unit2;
{$R *.dfm}
functionCa(t:real):real;
begin
Ca:=-k1*(t+5);
end;
functionCb(t:real):real;
begin
Cb:=k1*(t+5)-k2*(sqr(t)-13);
end;
functionCc(t:real):real;
begin
Cc:=k2*(sqr(t)-13);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
a:=strtofloat(labelededit1.Text);
b:=strtofloat(labelededit2.Text);
n:=strtoint(labelededit3.Text);
ya:=strtoint(labelededit4.Text);
yb:=strtoint(labelededit6.Text);
yc:=strtoint(labelededit8.Text);
k1:=strtoint(labelededit5.Text);
k2:=strtoint(labelededit7.Text);
if (b<=a) or (n<1) then
begin
form1.Enabled:=false;
form2.Visible:=true;
end
else
begin
stringgrid1.RowCount:=n+2;
stringgrid1.Cells[0,0]:='t';
stringgrid1.Cells[1,0]:='Ca(t)';
stringgrid1.Cells[2,0]:='Cb(t)';
stringgrid1.Cells[3,0]:='Cc(t)';
stringgrid1.Cells[0,1]:=floattostr(a);
stringgrid1.Cells[1,1]:=floattostr(ya);
stringgrid1.Cells[2,1]:=floattostr(yb);
stringgrid1.Cells[3,1]:=floattostr(yc);
h:=(b-a)/n;
i:=1;
repeat
y1:=ya+Ca(a+h/2)*h;
y2:=yb+Cb(a+h/2)*h;
y3:=yc+Cc(a+h/2)*h;
a:=a+h;
ya:=y1;
yb:=y2;
yc:=y3;
i:=i+1;
stringgrid1.Cells[0,i]:=floattostr(a);
stringgrid1.Cells[1,i]:=floattostr(y1);
stringgrid1.Cells[2,i]:=floattostr(y2);
stringgrid1.Cells[3,i]:=floattostr(y3);
until i>n;
Series1.Clear;
Series2.Clear;
Series3.Clear;
for i:=1 to StringGrid1.RowCount-1 do
Series1.AddXY(StrToFloat(StringGrid1.Cells[0,i]),
StrToFloat(StringGrid1.Cells[1,i]),
'',clGreen);
for i:=1 to StringGrid1.RowCount-1 do
Series2.AddXY(StrToFloat(StringGrid1.Cells[0,i]),
StrToFloat(StringGrid1.Cells[2,i]),
'',clRed);
for i:=1 to StringGrid1.RowCount-1 do
Series3.AddXY(StrToFloat(StringGrid1.Cells[0,i]),
StrToFloat(StringGrid1.Cells[3,i]),
'',clBlue);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Labelededit1.Text:='';
Labelededit2.Text:='';
Labelededit3.Text:='';
Labelededit4.Text:='';
Labelededit5.Text:='';
Labelededit6.Text:='';
Labelededit7.Text:='';
Labelededit8.Text:='';
series1.Clear;
series3.Clear;
series2.Clear;
for i:=0 to stringgrid1.RowCount-1 do
begin
stringgrid1.Cells[0,i]:='';
stringgrid1.Cells[1,i]:='';
stringgrid1.Cells[2,i]:='';
stringgrid1.Cells[3,i]:='';
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.LabeledEdit4KeyPress(Sender: TObject; varKey: Char);
begin
ifnot (keyin['0'..'9',#08,',','-']) thenkey:=#0;
end;
6. Опис програми та її блок-схема
При запуску програми перед користувачем відкривається головне вікно. Це вікно розділене на дві частини:
Графічна частина
Частина вводу вихідних даних
В частині вводу вихідних даних користувачу необхідно ввести початковий та кінцевий час (в секундах), задати початкові умови для методу, кількість ітерацій, а також коефіцієнти, що відповідають за швидкість хімічної реакції.
Після цього користувач має натиснути кнопку «Розрахувати» і програма після деяких перевірок почне розрахунок модифікованим методом Ейлера. В результаті буде отримано чисельні значення кожної функції, які будуть занесені в таблицю і по цим значення буде побудовано три графіки різного кольору.
Для того, щоб очистити всі поля, таблиці та графіки необхідно натиснути на кнопку «Очистити»
/
Рис. 3
В цьому блоці виконується підключення необхідних модулів, об'являються константи, функції змінних та створюються контроль.
Блок 2
В даному блоці відбувається ввід початкових даних користувачем.
Блок 3
В даному блоці відбувається перевірка введених даних та рішення програми про наступні кроки дій.
Блок 4
В цьому блоці програма проводить розрахунок модифікованим методом Ейлера і заповнюється таблиця із результуючими даними.
Блок 5
В даному блоці будуються графіки по розрахованими даними.
7. Контрольні приклади
Приклад№1
Рис. 4
Рис. 5
математичний моделювання метод ейлер
Приклад №2
Рис. 6
Рис. 7