КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ В ХИМИИ. ПРАКТИЧЕСКАЯ ЧАСТЬ
Примеры решения химических задач на компьютере
Попробуем решить простую химическую задачу - Составить кинетическую модель необратимой реакции второго порядка вида
, если известны: начальные концентрации реагентов СА(0) и СВ(0), кмоль/м3, константа скорости реакции к, м3/(кмоль×с). Получить кинетические зависимости компонентов реакции в виде графиков функций СА(t), CB(t), CD(t); определить время 50%-ного превращения компонента А. Кинетические уравнения имеют вид:
для компонента А -
,
для компонента В -![]()
,
для компонента D -
. Искомые кинетические зависимости СА(t), CB(t), CD(t) получаем в виде графиков, по графику СА(t) определяем время 50%-ного превращения компонента А.
В описании задания уже приведена модель процесса, состоящая из трех уравнений, остается добавить уравнение, выражающее изменение времени
, где dt стремится к нулю. Согласно принципу вычисления интегралов на ЭВМ (методические указания «Компьютерное моделирование в естествознании. Часть II. Химия»), имеем систему уравнений – модель процесса:
![]()
.
Для определения концентрации веществ в каждый момент времени, запишем уравнения в другом виде:![]()
. Другими словами, новое значение переменной – есть прежнее значение плюс его изменение:
![]()
![]()
Приходим к простому расчету суммы. Необходимо составить компьютерную программу с использованием данной модели. Условием работы программы, исходя из условия задания, будет обращение в нуль либо компонента А, либо компонента В, т. к. реакция является необратимой.
Пример текста программы, написанной на языке TurboPascal 7, и результатов выполнения программы приводятся ниже.
programchim4;
usescrt, graph;
typemas= array [0..1000] ofreal;
varca0, cb0, cd0, t1, dt, k, dca, cam, cbm, cdm, max, mash:real;
ca, cb, cd, t,a, b,d, o : mas;
gd, gm, i,j, m ,im: integer;
t2:string;
proceduredan(a, b,d, t:mas ); {присвоение начальных данных и вывод на экран}
var dca, dt:real;
i, j,m:integer;
begin
ca[0]:=ca0; cb[0]:=cb0; cd[0]:=cd0; t[0]:=0;
writeln(ca[i]:8:3,cb[j]:8:3,cd[m]:8:3,t[i]:8:3);
end;
procedure graf(mash:real){(var ca, cb, cd, t:mas)};{построениеграфическихзависимостей}
var dca, dt:real;
i, j,m:integer;
begin
line(20,460,600,460);
line(20,20,20,460);
{ t[0]:=0;}
putpixel(round(20+t[0]), 460-round(ca0), 3);
putpixel(round(20+t[0]), 460-round(cb0), 5);
putpixel(round(20+t[0]), 460-round(cd0), 15);
i:=0; j:=0; m:=0;
repeat
begin
putpixel(20+round(t[i]*640/t1), 460-round(ca[i]*500/mash), 3);
setcolor(3);
outtextxy(400,200,'veshestvo A');
putpixel(20+round(t[i]), 460-round(cb[j]*500/mash), 5);
setcolor(5);
outtextxy(400,220,'veshestvo B');
putpixel(20+round(t[i]), 460-round(cd[m]*500/mash), 15);
setcolor(15);
outtextxy(400,240,'veshestvo D');
i:=i+1; j:=j+1; m:=m+1;
end;
until t[i]=t1;
str(t1,t2);
outtextxy(300,400,concat('vremya reakcii', t2));
end;
functionpmax(varo:mas):real; {определение максимального значения}
var i, im:integer;
max:real;
begin
i:=0; max:=o[i];
for i:=1 to im do
if o[i]>o[i-1] then max:=o[i];
{ writeln(max:8:3);}
pmax:=max;
end;
procedurerasc{(varca, cb, cd, t: mas)}; {расчет значений концентраций и времени}
var dca, dt, max, mash:real;
i, j,m, im:integer;
begin
ca[0]:=ca0; cb[0]:=cb0; cd[0]:=cd0; i:=1; j:=1; m:=1;
dt:=0.5; t[0]:=0;
repeat
t[i]:=t[i-1]+dt;
dca:=k*ca[i-1]*cb[j-1]*dt;
ca[i]:=ca[i-1]-dca;
cb[j]:=cb[j-1]-dca;
cd[m]:=cd[m-1]+dca;
t1:=t[i];
writeln(i,' ',ca[i]:8:3,cb[j]:8:3,cd[m]:8:3,t[i]:8:3);
i:=i+1; j:=j+1; m:=m+1;
if abs(cd[m]-cd[m-1])<=0.001 then break;
until (abs(ca[i]-ca[i-1])<=0.001);
writeln; writeln; readkey;
writeln('vremya reakcii',t1:8:3);
im:=i-1; writeln(im);
cam:=pmax(ca);
cbm:=pmax(cb);
cdm:=pmax(cd);
if cam>cbm then mash:=cam else mash:=cbm;
if cdm>mash then mash:=cdm;
writeln(mash:8:3);
readln;
clrscr;
gd:=detect; gm:=0;
initgraph(gd, gm,'F:\Зоя\диск-Адаменко\FP\BGI');
graf(mash){(ca, cb, cd, t)};
end;
begin{основная программа}
clrscr;
writeln('vvesti nach. konc. ca0, cb0 i const skorosri reakcii k');
readln(ca0,cb0,k);
cd0:=0;
writeln('N ca cb cd t');
dan(ca, cb, cd, t);
rasc{(ca, cb, cd, t)};
readln;
{clrscr;
gd:=detect; gm:=0;
initgraph(gd, gm,'F:\путькфайлу’);
i:=0;
graf(ca, cb, cd, t); }
readkey;
closegraph; end.


Рис. 1 Таблица результатов расчета концентраций исходных веществ А, В и продуктов реакции D от времени.

Рис. 2 Графические зависимости A(t), B(t), D(t).
Рассмотрим другой пример - необходимо получить модели простой необратимой реакции первого порядка, сложной мономолекулярной реакции, протекающей в две последовательные стадии, сложной обратимой реакции первого порядка. Получить кинетические кривые для всех компонентов химических реакций.
- получение модели необратимой реакции первого порядка вида А ® В, если известны: начальные концентрации СА(0), кмоль/м3, СВ(0), кмоль/м3, константа скорости химической реакции при температурах Т1 и Т2. Требуется найти для каждой температуры кинетические зависимости компонентов реакции в виде функций СА(t), СВ(t) и время 50%-ного и 80%-ного превращения компенента А.
Для моделирования запишем кинетичекие уравнения для компонента А и В
(1)
(2).
Уравнения (1) и (2) представляют систему линейных уравнений с заданными начальными условиями.
Результаты выводятся в виде таблицы, графиков С(t). Для сравнения времени 50%-го и 80%-го превращения компонента А с теоретическим значением применяют выражение:
.
Принцип решения задачи аналогичен предыдущему. В тексте задания приведена модель, остается грамотно составить программу. Ниже приводится текст программы, реализованной в среде Delphi 7(6) и результаты выполнения программы (рис.3-5).
unitUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);{выполнениепрограммы}
procedure Button2Click(Sender: TObject);{очисткаэкрана}
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
k1,k2,dt, c,cc:extended;
c1,c2,t:array [0..5000] of real;
i, j,k, n:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
C1[0]:=strtofloat(Edit1.Text);
C2[0]:=strtofloat(Edit2.Text);
k1:=strtofloat(Edit3.Text);
k2:=strtofloat(Edit4.Text);
dt:=strtofloat(Edit5.Text);
t[0]:=0; i:=0;
repeat
inc(i);
c:=c1[i-1];
cc:=c2[i-1];
c1[i]:=c1[i-1]-k1*c1[i-1]*dt;
c2[i]:=c2[i-1]+k1*c1[i-1]*dt;
t[i]:=t[i-1]+dt;
until (abs((c1[i]-c))<=0.001) or( abs((c2[i]-cc))<=0.001);
edit6.Text:=floattostr(c1[i]);
edit7.Text:=floattostr(c2[i]);
edit8.Text:=floattostr(t[i]);
for j:=0 to i do begin
with Image1.Canvas do
Pixels[round(t[j]*image1.Width/t[i]),image1.Height+10-round(c1[j]*image1.Height/c1[0])]:=clred;
with Image1.Canvas do
Pixels[round(t[j]*image1.Width/t[i]),image1.Height+10-round(c2[j]*image1.Height/c1[0])]:=clblack;
end;
edit6.Text:=floattostr(c1[i]);
edit7.Text:=floattostr(c2[i]);
edit8.Text:=floattostr(t[i]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
for k:=0 to 405 do
for n:=0 to 331 do
image1.Canvas. Pixels[k, n]:=clwhite;
edit6.Text:='';
edit7.Text:='';
edit8.Text:='';
end;end.

Рис. 3 Форма к программе.

Рис. 4 Окно программы, ввод данных с клавиатуры.

Рис. 5 Окно с результатами выполнения программы: вывод графиковC1(t), C2(t), конечных значений концентраций реагирующих веществ и времени реакции.
Данную задачу можно решить с использованием пакета Excel, что, конечно, значительно проще по сравнению с языками программирования. В соответствующий столбец записывается каждая из формул и средствами Excelпроизводится расчет (рис.6), а затем при помощи диаграммы выводится графики искомых зависимостей (рис.7).

Рис. 6 Рабочее окно Excel, ввод данных
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 |


