КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ В ХИМИИ. ПРАКТИЧЕСКАЯ ЧАСТЬ

Примеры решения химических задач на компьютере

Попробуем решить простую химическую задачу - Составить кинетическую модель необратимой реакции второго порядка вида , если известны: начальные концентрации реагентов СА(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