Скачать 113.69 Kb.
|
В ходе провндения химической реакции получены следующие кинетические кривые для компонентов А, В, С. В ходе моделирования процесса предложить и обосновать ктнетику реакции и рассчитать константы скоростей частных реакций. Концентрации СА0=400 г/л, СВ0=200 г/л. ^ ![]()
Кинетический кривые, полученные в ходе эксперимента, показаны на рисунке 1. Из условия постоянства массы можно заключить, что на диаграмме не изображен четвертый компонент. Построим его график. Диаграмма примет вид, показанный на рисунке 2. ![]()
По имеющемуся набору кривых определим вид реакции. Количество исходных веществ и продуктов реакции одинаково, материальный баланс сходиться. Из анализа графических данных делаем вывод, что в системе протекают обратимые реакции превращения вещества А в вещество D (константы скорости реакции k1 и k2) и вещества В в вещество С (константы скорости реакции k3 и k4). Составим систему дифференциальных уравнений, описывающую эти равновесные превращения. ![]() Решая данную систему методом Эйлера, находим путем подбора значения констант k1, k2, k3, k4. После этого получаем зависимости CA = F(), CB = F(), CC = F(), CD = F(). Аналитические зависимости должны хорошо аппроксимировать опытные данные. ^ 4.1Метод Эйлера 4.1.1Блок-схема алгоритма 4.1.2Список идентификаторов
4.2Метод двойного просчета 4.2.1Блок-схема алгоритма 4.2.2Список идентификаторов
В результате решения системы дифференциальных уравнений получены следующие значения констант скоростей реакции. k1 = 0.08 k2 = 0.025 k3 = 0.7 k4 = 0.7 Аналитически зависимости примут вид, указанный на рисунке 3. ![]()
6ВыводыВ ходе лабораторной работы освоили методику формирования математической модели кинетики химической реакции в форме дифференциальных уравнений Подобраны численные значения констант скорости реакции по исходным экспериментальным данным кинетического исследования с использованием метода Эйлера. Получены в ходе решения системы дифференциальных уравнений концентрационные зависимости для компонентов A, B, C, D. Данные зависимости практически совпадают с опытными кинетическими кривыми по соответствующим компонентам (среднеквадратичное отклонение 0,71%). Вычисленные значения констант подтверждают верность выбранной математической модели кинетики процесса, так как при достижении =40 мин (время достижения равновесных концентраций) скорости обратимых реакций выравниваются. ^ program lab_2; const array_max = 30; { global types * } type point = record t: real; ca: real; cb: real; end; table_t = array [1..array_max] of point; vector = array[1..array_max] of real; { reporting of errors * } procedure error(msg: string); begin writeln('ERROR: ',msg); readln; halt; end; { method of Euler * } procedure euler( k1: real; k2: real; dt: real; var c: table_t; n: integer); var ca: real; cb: real; pca: real; pcb: real; t: real; i: integer; begin t := c[1].t; ca := c[1].ca; cb := c[1].cb; for i:= 2 to n do begin while c[i].t-t >= dt do begin pca := ca; pcb := cb; ca := pca + (-k1*pca + k2*pcb)*dt; cb := pcb + (k1*pca - k2*pcb)*dt; t := t + dt; end; c[i].ca := ca; c[i].cb := cb; end; end; { double calculation method * } procedure double_calc( k1: real; k2: real; e: real; var c: table_t; n: integer); const k = 0.5; var ca: vector; cb: vector; dt: real; ef: real; e_pred: real; d: real; i: integer; begin dt := (c[n].t-c[1].t)/100; repeat euler(k1, k2, dt, c, n); e_pred := ef; ef := 0; for i:= 2 to n do begin d := abs(c[i].ca - ca[i]); if d > ef then ef := d; d := abs(c[i].cb - cb[i]); if d > ef then ef := d; ca[i] := c[i].ca; cb[i] := c[i].cb; end; dt := k*dt; until (ef < e) or (ef > e_pred); end; { difference between two tables * } function difference( t1: table_t; t2: table_t; n: integer): real; var i: integer; max: real; s: real; d: real; begin max := 0; for i:=2 to n do begin d := abs(t1[i].ca - t2[i].ca); s := s + sqr(d/t1[i].ca); if d > max then max := d; d := abs(t1[i].cb - t2[i].cb); s := s + sqr(d/t1[i].cb); if d > max then max := d; end; difference := 100*sqrt(s/2/n); end; { printing a table * } procedure print_table(const table: table_t; n: integer); var i: integer; begin writeln(' time | Ca | Cb'); writeln('------------------------------------'); for i:= 1 to n do writeln( table[i].t:10:3,' | ', table[i].ca:10:3,' | ', table[i].cb:10:3); writeln; end; { reading a table * } procedure read_table(var table: table_t; n: integer); var i: integer; begin for i:= 1 to n do begin writeln(i,':'); write(' t : '); readln(table[i].t); write(' Ca: '); readln(table[i].ca); write(' Cb: '); readln(table[i].cb); end; end; { copy from array to table * } procedure copy( const src: array of point; var dst: table_t; n: integer ); var i: integer; begin for i:= 1 to n do dst[i] := src[i-1]; for i:= n+1 to array_max do begin dst[i].t := 0; dst[i].ca := 0; dst[i].cb := 0; end; end; { input data * } procedure input_data( var c: table_t; var n: integer); var i: integer; begin write('Enter number of points: '); readln(n); writeln('Enter graph data'); read_table(c,n); end; { display a menu * } function choice( const v: array of string; n: integer; var selected: integer): boolean; var i: integer; begin writeln; for i:=0 to n-1 do writeln(i+1,' - ',v[i]); writeln; write('Your choice: '); readln(selected); if (selected > n) or (selected < 1) then begin writeln('Nothing selected'); choice := false; end else choice := true; end; { get data * } procedure get_data( var c: table_t; var n: integer); const menu: array [1..3] of string = ('Your own data', 'Sample data. Variant 1', 'Sample data. Variant 2'); sample_1: array [1..3] of point = ((t: 0; ca: 400; cb: 0), (t: 10; ca: 200; cb: 200), (t: 40; ca: 100; cb: 300)); sample_2: array [1..3] of point = ((t: 0; ca: 200; cb: 0), (t: 5; ca: 150; cb: 50), (t: 40; ca: 100; cb: 100)); var ch: integer; begin writeln('Select type of data'); if choice(menu, 3, ch) then case ch of 1: { own data } input_data(c,n); 2: { sample 1 } begin n := 3; copy(sample_1,c,3); end; 3: { sample 2 } begin n := 3; copy(sample_2,c,3); end; end else error('Unable to read data'); end; { manual run * } procedure manual_run; var str: string; ch: integer; make_check: boolean; c: table_t; rc: table_t; c_tmp: table_t; n: integer; m: integer; k1: real; k2: real; i: integer; time: real; interval: real; prec: real; d: real; begin { read the data } make_check := true; get_data(c,n); writeln('You have selected the following data'); print_table(c,n); c_tmp := c; {define some reference points} write('Enter total time(min): '); readln(time); write('Enter reference interval(min): '); readln(interval); m := trunc(time/interval) + 1; for i:= 1 to m do rc[i].t := (i-1)*interval; rc[1].ca := c[1].ca; rc[1].ca := c[1].ca; write('enter precision: '); readln(prec); repeat { enter the constants } writeln('Enter the constants'); write('k1 = '); readln(k1); write('k2 = '); readln(k2); { build the table } double_calc(k1, k2, prec, rc, m); print_table(rc,m); { calculate diffefence } if make_check then begin double_calc(k1, k2, prec, c_tmp, n); d := difference(c, c_tmp, n); writeln('maximum difference is ',d:8:3); end; write('Press enter to continue. Type ''exit'' to exit: '); readln(str); until 'exit' = str; end; { main program * } var c: integer; begin writeln('Hello'); writeln; manual_run; writeln('Finished. Press enter'); readln; end. ^ При помощи метода Эйлера получены таблично заданные функции
Enter the constants k1 = 0.08 k2 = 0.025 time | Ca | Cb ------------------------------------ 0.000 | 400.000 | 0.000 1.000 | 374.938 | 25.062 2.000 | 351.936 | 48.064 3.000 | 320.932 | 79.068 4.000 | 302.372 | 97.628 5.000 | 277.354 | 122.646 6.000 | 262.377 | 137.623 7.000 | 242.190 | 157.810 8.000 | 230.105 | 169.895 9.000 | 213.815 | 186.185 10.000 | 199.493 | 200.507 11.000 | 190.920 | 209.080 12.000 | 179.363 | 220.637 13.000 | 172.445 | 227.555 14.000 | 163.120 | 236.880 15.000 | 157.538 | 242.462 16.000 | 150.013 | 249.987 17.000 | 145.508 | 254.492 18.000 | 139.437 | 260.563 19.000 | 135.802 | 264.198 20.000 | 130.903 | 269.097 21.000 | 127.970 | 272.030 22.000 | 124.016 | 275.984 23.000 | 121.650 | 278.350 24.000 | 118.460 | 281.540 25.000 | 116.550 | 283.450 26.000 | 113.976 | 286.024 27.000 | 112.435 | 287.565 28.000 | 110.358 | 289.642 29.000 | 109.115 | 290.885 30.000 | 107.438 | 292.562 31.000 | 106.435 | 293.565 32.000 | 105.083 | 294.917 33.000 | 104.273 | 295.727 34.000 | 103.182 | 296.818 35.000 | 102.529 | 297.471 36.000 | 101.648 | 298.352 37.000 | 101.121 | 298.879 38.000 | 100.410 | 299.590 39.000 | 99.985 | 300.015 40.000 | 99.595 | 300.405 maximum difference is 0.710
Enter the constants k1 = 0.07 k2 = 0.07 time | Ca | Cb ------------------------------------ 0.000 | 200.000 | 0.000 1.000 | 189.114 | 10.886 2.000 | 179.412 | 20.588 3.000 | 166.804 | 33.196 4.000 | 159.532 | 40.468 5.000 | 150.080 | 49.920 6.000 | 144.628 | 55.372 7.000 | 137.543 | 62.457 8.000 | 133.456 | 66.544 9.000 | 128.144 | 71.856 10.000 | 123.676 | 76.324 11.000 | 121.098 | 78.902 12.000 | 117.748 | 82.252 13.000 | 115.816 | 84.184 14.000 | 113.305 | 86.695 15.000 | 111.857 | 88.143 16.000 | 109.974 | 90.026 17.000 | 108.888 | 91.112 18.000 | 107.477 | 92.523 19.000 | 106.663 | 93.337 20.000 | 105.605 | 94.395 21.000 | 104.995 | 95.005 22.000 | 104.202 | 95.798 23.000 | 103.745 | 96.255 24.000 | 103.150 | 96.850 25.000 | 102.807 | 97.193 26.000 | 102.361 | 97.639 27.000 | 102.104 | 97.896 28.000 | 101.770 | 98.230 29.000 | 101.578 | 98.422 30.000 | 101.327 | 98.673 31.000 | 101.183 | 98.817 32.000 | 100.995 | 99.005 33.000 | 100.887 | 99.113 34.000 | 100.746 | 99.254 35.000 | 100.665 | 99.335 36.000 | 100.559 | 99.441 37.000 | 100.498 | 99.502 38.000 | 100.419 | 99.581 39.000 | 100.373 | 99.627 40.000 | 100.333 | 99.667 maximum difference is 0.231 |
![]() | Виды дифференциальных уравнений. Интеграл дифференциального уравнения. Общий интеграл. Интегральная кривая | ![]() | Тема: Нахождение решений обыкновенных дифференциальных уравнений и систем дифференциальных уравнений при помощи формул Эйлера и Рунге... |
![]() | ... | ![]() | Итерационные методы решения интегральных уравнений, особенность частичной сходимости |
![]() | Лабораторная работа №1. Основные этапы создания программ (на примере программы для решения квадратных уравнений) 2 | ![]() | Комплексная форма уравнений поля. Решение основных уравнений поля при известных токах и зарядах |
![]() | Локальные и глобальные сети Принципы построения и основные топологии локальных cетей, прободные и беспроводные сети | ![]() | Цель: научиться применять численные методы для уточнения корней алгебраических и трансцендентных уравнений |
![]() | Оду называются такие уравнения, которые содержат одну или несколько производных от искомой функции. В общем виде оду первого порядка... | ![]() | Некоторые физические системы могут быть адекватно описаны математической моделью в виде системы линейных алгебраических уравнений... |