Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 211 по кинетике.doc
Скачиваний:
4
Добавлен:
20.09.2019
Размер:
3.25 Mб
Скачать

5. Программа методов:

1. Эйлера;

2. Эйлера-Коши;

3. Рунге-Кутта 2-го порядка;

4. Рунге-Кутта 4-го порядка.

1)

Program EULER;

const

eps = 1e-5;

x0 = 3;

y0 = 3;

type

TFunc = function(x,y:extened): extended;

function func(x,y: extended): extended; far;

begin

func := y*cos(x) - 2*sin(2*x);

end;

function Euler(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;

{ где x0_ и y0_ - начальное условие

x_end - точка, в которой необходимо вычислить результат

n - количество шагов для вычисления результата }

var

i : word; { счетчик цикла }

x,h : extended; { текущая точка и длина шага }

res : extended; { переменная для накопления конечного результата функции}

begin

h:= (x_end - x0_)/n; { Находим длину шага }

res:= y0_; { устанавливаем начальные значения}

x:=x0_;

for i:=1 to n do

begin { вычисляем результат по методу Эйлера }

res:=res+h*f(x,res);

x:=x+h; { переходим к следующей точке }

end;

Euler:=res; { присваиваем конечный результат функции }

end;

begin

writeln('Численное решение дифференциальных уравнений:');

writeln(#10,' y'' = y*cos(x) - 2*sin(2*x); y(0)=3; x_end=',(5*x0+3.5):5:5);

writeln(#10,'Метод Эйлера:');

writeln('n=5 000, result: ',Euler(func,x0,5*x0+3.5,y0,5000):5:5);

writeln('n=10 000, result: ',Euler(func,x0,5*x0+3.5,y0,10000):5:5);

writeln('n=25 000, result: ',Euler(func,x0,5*x0+3.5,y0,25000):5:5);

write(#10,'Press Enter to continue.');

readln;

end.

2)

Program EULER-KOSHI;

const

eps = 1e-5;

x0 = 3;

y0 = 3;

type

TFunc = function(x,y:extened): extended;

function func(x,y: extended): extended; far;

begin

func := y*cos(x) - 2*sin(2*x);

end;

function Euler2(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;

{ где x0_ и y0_ - начальное условие

x_end - точка, в которой необходимо вычислить результат

n - количество шагов для вычисления результата }

var

i : word; { счетчик цикла }

x,h : extended; { текущая точка и длина шага }

res : extended; { переменная для накопления конечного результата функции}

begin

h:= (x_end - x0_)/n; { Находим длину шага }

res:= y0_; { устанавливаем начальные значения}

x:=x0_;

for i:=1 to n do

begin { вычисляем результат по исправленному методу Эйлера }

res:=res+h*(f(x,res)+f(x+h,res+h*f(x,res)))/2;

x:=x+h; { переходим к следующей точке }

end;

Euler2:=res; { присваиваем конечный результат функции }

end;

begin

writeln(#10,'Эйлера-Коши:');

writeln('n=50, result: ',Euler2(func,x0,5*x0+3.5,y0,50):5:5);

writeln('n=100, result: ',Euler2(func,x0,5*x0+3.5,y0,100):5:5);

writeln('n=250, result: ',Euler2(func,x0,5*x0+3.5,y0,250):5:5);

write(#10,'Press Enter to continue.');

readln;

end.

3)

Program RK2;

const

eps = 1e-5;

x0 = 3;

y0 = 3;

type

TFunc = function(x,y:extened): extended;

function func(x,y: extended): extended; far;

begin

func := y*cos(x) - 2*sin(2*x);

end;

function Euler3(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;

{ где x0_ и y0_ - начальное условие

x_end - точка, в которой необходимо вычислить результат

n - количество шагов для вычисления результата }

var

i : word; { счетчик цикла }

x,h : extended; { текущая точка и длина шага }

res : extended; { переменная для накопления конечного результата функции}

begin

h:= (x_end - x0_)/n; { Находим длину шага }

res:= y0_; { устанавливаем начальные значения}

x:=x0_;

for i:=1 to n do

begin { вычисляем результат по модифицированному методу Эйлера }

res:=res+h*f(x+h/2,res+(h/2)*f(x,res));

x:=x+h; { переходим к следующей точке }

end;

Euler3:=res; { присваиваем конечный результат функции }

end;

begin

writeln(#10,'Метод Рунге-Кутта 2:');

writeln('n=50, result: ',Euler3(func,x0,5*x0+3.5,y0,50):5:5);

writeln('n=100, result: ',Euler3(func,x0,5*x0+3.5,y0,100):5:5);

writeln('n=250, result: ',Euler3(func,x0,5*x0+3.5,y0,250):5:5);

write(#10,'Press Enter to continue.');

readln;

end.

4)

Program RK4;

const

eps = 1e-5;

x0 = 3;

y0 = 3;

type

TFunc = function(x,y:extened): extended;

function func(x,y: extended): extended; far;

begin

func := y*cos(x) - 2*sin(2*x);

end;

function RungeKutt(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;

{ где x0_ и y0_ - начальное условие

x_end - точка, в которой необходимо вычислить результат

n - количество шагов для вычисления результата }

var

i : word; { счетчик цикла }

x,h : extended; { текущая точка и длина шага }

res : extended; { переменная для накопления конечного результата функции }

k1,k2,k3,k4: extended; { вспомогательные переменные вычисления результата }

begin

h:= (x_end - x0_)/n; { Находим длину шага }

res:= y0_; { устанавливаем начальные значения}

x:=x0_;

for i:=1 to n do

begin { вычисляем результат по методу Рунге-Кутта 4го порядка }

k1:=f(x,res);

k2:=f(x+h/2,res+h*k1/2);

k3:=f(x+h/2,res+h*k2/2);

k4:=f(x+h,res+h*k3);

res:=res+h*(k1+2*k2+2*k3+k4)/6;

x:=x+h; { переходим к следующей точке }

end;

RungeKutt:=res; { присваиваем конечный результат функции }

end;

begin

writeln(#10,'Метод Рунге-Кутта 4:');

writeln('n=50, result: ',RungeKutt(func,x0,5*x0+3.5,y0,50):5:5);

writeln('n=100, result: ',RungeKutt(func,x0,5*x0+3.5,y0,100):5:5);

writeln('n=250, result: ',RungeKutt(func,x0,5*x0+3.5,y0,250):5:5);

write(#10,'Press Enter to continue.');

readln;

end.

6. ЗАДАНИЯ

Схема химической реакции

Продолжительность реакции

Константы скоростей отдельных стадий реакции

Начальное значение концентрации реагентов

Метод численного решения

К1

К2

К3

К4

К5

К6

СА

СВ

СС

СД

Диф. Уравнений кинетики

1

3

4

5

6

7

8

9

10

11

12

13

14

1.

50

0,3

0,2

0,1

-

-

-

0,7

0

0

0

Метод Эйлера

2.

17

0,7

0,65

0,5

0,3

-

-

0,5

0

0

0

Эйлера-Коши

3.

11

0.65

0.6

0.55

-

-

-

0.3

0

0

0

Рунге-Кутта 2-го

порядка

4.

25

0,2

0,3

0,4

-

-

-

1,0

0

0

0

Эйлера

5.

10

0,7

0,6

0,5

-

-

-

1,0

0

0

-

Эйлера-Коши

6.

17

0,37

0,3

-

-

-

-

0,96

0

0

-

Рунге-Кутта 2-го порядка

7.

50

0,5

0,36

0,5

0,3

0,25

0,1

1,1

0

0

-

Эйлера

8.

15

0,95

0,8

0,63

0,45

-

-

0,3

0

0

0

Эйлера-Коши

9.

9

0,85

0,9

0,85

0,6

-

-

0,2

0,1

0

0

Рунге-Кутта 2-го порядка

10.

90

0,09

0,08

0,1

0,06

-

-

0,85

0

0

0

Эйлера

11.

50

0,2

0,16

0,1

-

-

-

1,1

0

0

-

Эйлера

12.

8

0,9

0,95

0,66

-

-

-

0,8

0

0

-

Рунге-Кутта 2-го порядка

13.

90

0,26

0,09

0,22

0,15

0,18

-

1,3

0

0

-

Эйлера

14.

18

0,5

0,5

0,4

0,3

-

-

0,45

0

0

0

Эйлера-Коши

15.

70

0,09

0,09

0,08

0,07

-

-

0,85

0

0

0

Рунге-Кутта 2-го порядка

16.

50

0,2

0,3

0,4

0,1

-

-

0,7

0

0

-

Эйлера

17.

12

0,95

0,8

0,46

0,39

-

-

0,87

0

0

-

Эйлера-Коши

18.

40

0,24

0,2

0,15

-

-

-

1,3

0

0

-

Рунге-Кутта 2-го порядка

19.

25

0,33

0,45

0,4

0,3

0,21

-

0

0,4

0

0

Эйлера

20.

15

0,76

0,9

0,5

0,45

0,6

-

0,7

0

0

0

Эйлера-Коши

21.

9

0,95

0,9

0,85

0,6

-

0,2

0

0

0

Рунге-Кутта 2-го порядка

22.

50

0,82

0,3

0,15

0,1

-

-

0,65

0

0

-

Эйлера

23.

10

0,6

0,48

-

-

-

-

1,35

0

0

-

Эйлера-Коши

24.

25

0,76

0,76

0,94

0,35

0,2

0,2

0

0

0,85

0

Рунге-Кутта 2-го порядка

25.

100

0,09

0,1

0,08

0,06

0,05

-

0,3

0

0

0

Эйлера

26.

50

0,45

0,4

0,3

0,2

0,1

-

1,3

0

0

0

Эйлера-Коши

27.

25

0,5

0,5

0,4

0,3

0,2

-

0,8

0

0

0

Рунге-Кутта 2-го порядка

28.

12

0,8

0,8

0,7

0,5

0,4

-

0,85

0

0

0

Эйлера

29.

18

0,55

0,5

0,64

0,3

0,27

-

1,5

0

0

0

Эйлера-Коши

30.

12

0,93

0,93

0,55

0,4

-

-

1,0

0

0

0

Рунге-Кутта 2-го порядка

31.

12

0,93

0,8

0,76

0,4

0,5

0,5

0,8

0

0

0

Эйлера

32.

55

0,25

0,2

0,3

0,1

0,09

-

1,2

0

0

-

Эйлера-Коши

33.

16

0,85

0,7

0,53

0,35

-

-

1,35

0

0

0

Рунге-Кутта 2-го порядка

34.

30

0,1

0,25

0,3

0,2

0,18

-

0,7

0

0

0

Эйлера

35.

12

0,9

0,8

0,7

0,6

0,5

0,4

1,0

0

0

0

Эйлера-Коши

36.

100

0,09

0,08

0,07

0,06

0,05

-

1,25

0

0

0-

Рунге-Кутта 2-го порядка

37.

20

0,62

0,35

0,5

0,25

-

-

0,9

0

0

0

Эйлера

38.

11

0,9

0,7

0,7

0,6

0,5

0,4

0,85

0

0

0

Эйлера-Коши

39.

20

0,57

0,42

0,3

0,25

-

-

1,6

0

0

-

Рунге-Кутта 2-го порядка

40.

100

0,09

0,06

0,05

-

-

-

1,2

0

0

-

Эйлера

Литература

  1. Л. И. Турчак. Основы численных методов : Учебное пособие .-М.: Наука, 1987.

  2. Методические указания. Выполнение лабораторных работ по вычислительной технике, 1979, №96.

  3. Электронные вычислительные машины: Учебное пособие для вузов, Кн.3. Алгоритмизация и основы программирования .-М.: Высшая школа, 1987.