КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Выполнение работы. I. Система , дифференциальных уравнения, представлявшая кинетическую модель данной химической реакции:I. Система , дифференциальных уравнения, представлявшая кинетическую модель данной химической реакции:
2. Расчетные формулы метода Эйлера:
3. Результаты численного решения системы дифференциальных уравнений на калькуляторе. h= 0,2; 5 шагов по времени.
Таблица результатов расчета
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.
|