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 |
- |
Эйлера |
Литература
Л. И. Турчак. Основы численных методов : Учебное пособие .-М.: Наука, 1987.
Методические указания. Выполнение лабораторных работ по вычислительной технике, 1979, №96.
Электронные вычислительные машины: Учебное пособие для вузов, Кн.3. Алгоритмизация и основы программирования .-М.: Высшая школа, 1987.