5. Порядок работы
1. Разработать математическую модель реактора.
2. Уяснить задачу и подготовить исходные данные в соответствии с алгоритмом для ввода их с терминала ЭВМ.
3. Для запуска программы необходимо запустить на исполнение файл react.exe.
4. Ввести исходные данные из таблицы (по варианту, указанному преподавателем). Ввести значения V = 2, S = 2, L = 10, Т = (температура из интервала температур, указанного в задании к лабораторной работе, п.4), SHAG = 1, EPS = 0.001 - 0.0001.
5. Помимо вывода результатов расчёта на экран ЭВМ, в программе предусмотрен вывод в файл report.rpt, который содержит все этапы работы программы.
6. По полученным результатам расчета определить область существования экстремума для целевого компонента. Оптимум по температуре определяется путем сравнения расчетов для нескольких температур из указанного интервала.
7. Если интервалы существования оптимума по времени пребывания и температуре определены, то можно приступать к оптимизации. Результаты оптимизации будут выводиться на печать.
8. Если интервалы существования оптимума не определены, то необходимо обработать результаты расчета и построить статические характеристики (см. рис.5).
9. Следует учесть, что для проведения оптимизации после выхода из программы с целью построения зависимостей (см. рис.5), следует снова запустить программу, провести расчет реактора для любого начального режима, чтобы оказаться в той части программы, где осуществляется процесс оптимизации (рис.4. блок 12). При этом ход и результаты оптимизации появятся на экране, а если подключен канал вывода в файл, то результаты оптимизации зафиксируются в соответствующем файле.
6. ТРЕБОВАНИЯ К ОТЧЕТУ
Отчет должен содержать следующее:
-
Постановка задачи, исходные данные.
-
Математическая модель реактора.
-
Результаты расчета на ЭВМ в виде распечаток.
-
Статические характеристики в виде графических зависимостей.
-
Результаты оптимизации.
-
Схема управления реактором.
-
Выводы по работе.
7. ПРОГРАММА К ЛАБОРАТОРНОЙ РАБОТЕ
МОДЕЛИРОВАНИЕ И ОПТИМИЗАЦИЯ РЕАКТОРОВ
НЕПРЕРЫВНОГО ДЕЙСТВИЯ НА ЭВМ
(РЕАКТОР ИДЕАЛЬНОГО ВЫТЕСНЕНИЯ)
Program React;
uses Crt;
Label
Again,1000,back,a1;
Const
R=1.985;
Var
X : Array[0..9]of Real;
Y : Array[0..9]of Real;
Y1 : Array[0..9]of Real;
Y2 : Array[0..9]of Real;
YFin : Array[0..9]of Real;
Z : Array[0..9]of Real;
K : Array[0..9]of Real;
S0 : Real;
Yp : Real;
NN : Byte;
Xt : Real;
H : Real;
XFin : Real;
Iss : integer;
HS : Real;
Prim,Ot,F1,F2 : Boolean;
OPT : Real;
TOpt : Real;
TAUOpt : Real;
A : Real;
Tp : Real;
Temp : Real;
Key : Char;
i : Byte;
Out : Text;
St : String;
TAU1,TAU2 : Real;
T1,T2 : Real;
SHAG1 : Real;
DT : Real;
Const T0 : Array[0..19] of Real=
(45,59,68,-52,66,62,40,-60,50,-66,-45,
-70, -68,-56,80,-85,-75,35,72,-95);
Const NC : Integer=4;
Const NOM : byte=7;
Const NSt : Integer=5;
Const TAU : Real=10.00;
Const T : Real=60;
Const V : Real=2.00;
Const S : Real=2.00;
Const L : Real=10.00;
Const Eps : Real=0.001;
Const Shag : Real =1.00;
Const N : Byte=5;
Const Fl : Boolean=False;
Function Str(N:Real):String;
var
s:String;
begin
System.Str(N,S);
Str:=S;
end;
Procedure GetConstants_K;
var
i:integer;
label 1,2;
begin
Write(Out,'-----------------------------------------------');
i:=1;
repeat
K[i-1]:=0.2*i*exp(-100*i/(R*(T+273)));
if ((T0[nom-1]<0)and(T>=Abs(T0[Nom-1]))) then goto 2;
if (T>T0[nom-1]) then goto 1;
2: Tp:=2*Abs(T0[nom-1]);
K[i-1]:=0.2*i*exp(-100*(i+1)/(R*(Tp-T+273)));
1:
i:=i+1;
until i>NSt;
end;
Procedure OBM(var Y:array of Real;N:Byte);
begin
for i:=0 to N-1 do X[i]:=Y[i];
for i:=1 to N-1 do
if N-1=i then X[i]:=Yp;
end;
Procedure F(Xt:Real;Y:array of Real;N:Byte;var Z:array of Real);
begin
OBM(Y,N);
case Nom of
1:begin
Z[0]:=-X[0]*K[0]+X[1]*K[2];
Z[1]:=X[0]*K[0]-K[1]*X[1]-K[2]*X[1];
end;
2:begin
Z[0]:=-X[0]*K[1]+X[1]*K[0];
Z[1]:=X[0]*K[1]-X[1]*K[0]-X[1]*K[3]+X[2]*K[2];
end;
3:begin
Z[0]:=-X[0]*K[3]-X[0]*K[1]+X[1]*K[2];
Z[1]:=X[0]*K[3]-X[1]*K[2]-X[1]*K[0];
Z[2]:=X[0]*K[1];
end;
4:begin
Z[0]:=-X[0]*K[1]+X[2]*K[2]-X[0]*K[3];
Z[1]:=X[0]*K[1]-X[1]*K[0];
end;
5:begin
Z[0]:=-X[0]*K[0]+X[1]*K[1];
Z[1]:=X[0]*K[0]-X[1]*K[1]-X[1]*K[2]+X[3]*K[4];
Z[2]:=X[1]*K[2]-X[2]*K[3];
end;
6:begin
Z[0]:=-X[0]*K[0]-X[0]*K[1];
Z[1]:=X[0]*K[0]-X[1]*K[2];
Z[2]:=X[1]*K[2]+X[3]*K[3]-X[2]*K[4];
Z[3]:=X[0]*K[1]-X[3]*K[3];
end;
7:begin
Z[0]:=-X[0]*K[0];
Z[1]:=X[0]*K[0]-X[1]*K[1]-X[1]*K[2]-X[1]*K[4]+X[3]*K[3];
Z[2]:=X[1]*K[1];
Z[3]:=X[1]*K[2]-X[3]*K[3];
end;
8:begin
Z[0]:=-X[0]*X[1]*K[0];
Z[1]:=-X[0]*X[1]*K[0]-X[1]*X[2]*K[1];
Z[2]:=X[0]*X[1]*K[0]-X[1]*X[2]*K[1];
end;
9:begin
Z[0]:=-X[0]*X[1]*K[0]+X[2]*K[1]-X[2]*X[0]*K[2];
Z[1]:=-X[0]*X[1]*K[0]+X[2]*K[1];
Z[2]:=X[0]*X[1]*K[0]-X[2]*K[1]-X[2]*X[0]*K[2];
end;
10:begin
Z[0]:=-X[0]*X[1]*K[0]-X[0]*X[3]*K[1];
Z[1]:=-X[0]*X[1]*K[0];
Z[2]:=X[0]*X[1]*K[0]; Z[3]:=-X[0]*X[3]*K[1];
end;
11:begin
Z[0]:=-X[0]*K[0];
Z[1]:=X[0]*K[0]-X[1]*K[1]+X[2]*K[2];
end;
12:begin
Z[0]:=-X[0]*K[0]+X[2]*K[2]-X[0]*K[3];
Z[1]:=X[0]*K[0]-X[1]*K[1];
end;
13:begin
Z[0]:=-X[0]*K[0]+X[2]*K[1];
Z[1]:=X[0]*K[0]-X[1]*K[2]+X[3]*K[4];
Z[2]:=X[1]*K[2]-X[2]*K[3];
end;
14:begin
Z[0]:=-X[0]*K[0]+X[3]*K[1];
Z[1]:=X[0]*K[0]-X[1]*K[2]-X[1]*K[3];
Z[2]:=X[1]*K[2];
end;
15:begin
Z[0]:=-X[0]*K[0];
Z[1]:=X[0]*K[0]-X[1]*K[2]+X[2]*K[1]+X[3]*K[4];
Z[2]:=-X[2]*K[1]+X[1]*K[2]-X[2]*K[3];
end;
16:begin
Z[0]:=-X[0]*K[0]+X[1]*K[1];
Z[1]:=X[0]*K[0]-X[1]*K[1]-X[1]*K[2]+X[2]*K[3];
Z[2]:=X[1]*K[2]-X[2]*K[3]-X[2]*K[4]+X[3]*K[5];
end;
17:begin
Z[0]:=-X[0]*K[0]-X[0]*K[4]+X[3]*K[5];
Z[1]:=X[0]*K[0]-X[1]*K[1]+X[2]*K[2];
Z[2]:=X[1]*K[1]-X[2]*K[2]+X[3]*K[3];
end;
18:begin
Z[0]:=-X[0]*X[1]*K[1];
Z[1]:=-X[0]*X[1]*K[1]-X[2]*X[1]*K[0];
Z[2]:=X[0]*X[1]*K[2]-X[2]*X[1]*K[0];
end;
19:begin
Z[0]:=-X[0]*K[0]+X[3]*K[2];
Z[1]:=X[0]*K[0]-X[1]*K[1];
Z[2]:=X[1]*K[1]-X[2]*K[3];
end;
20:begin
Z[0]:=-X[0]*X[1]*K[0]-X[0]*X[3]*K[1];
Z[1]:=-X[0]*X[1]*K[0];
Z[2]:=X[0]*X[1]*K[0]-X[0]*X[2]*K[1];
end; end;
Z[N-1]:=V/S;
end;
Procedure RKStep(N:byte;Xt:Real;Y:array of Real;H:Real;
var Xh:Real;var YH:Array of Real);
var
A :Array[0..4] of Real;
W :Array[0..99]of Real;
l,j :integer;
begin
A[0]:=0.5*H; A[1]:=0.5*H; A[2]:=H; A[3]:=H; A[4]:=0.5*H;
Xh:=Xt;
For l:=0 to N-1 do begin Yh[l]:=Y[l];W[l]:=Y[l];end;
for j:=0 to 3 do
begin
F(Xh,W,N,Z);
Xh:=Xt+A[j];
for l:=0 to N-1 do
begin
Yh[l]:=Yh[l]+A[j+1]*Z[l]/3;
W[l]:=Y[l]+A[j]*Z[l];
end;
end;
end;
Procedure Runge(Xt:Real;Y:array of Real;N:byte;EPS:Real;
Prim:Boolean;XFin:Real;var YFin:Array of Real);
var
Y1,Y2,Y3 : Array[0..99] of Real;
X1,X2,X3 : Real;
k:integer;
Label 11,12,13,100,10,21;
begin
if Prim then begin
H:=XFin-Xt; Iss:=0;
end else H:=HS;
11: F1:=(Xt+2.01*H-XFin)>0;
F2:=H>0;
if (F1 and F2)or((Not F1)and(Not F2))then begin
HS:=H;
Ot:=True;
H:=(XFin-Xt)/2;
end;
RKStep(N,Xt,Y,2*H,X1,Y1);
12: RKStep(N,Xt,Y,H,X2,Y2);
RKStep(N,X2,Y2,H,X3,Y3);
for k:=0 to N-1 do if (Abs(Y1[k]-Y3[k])>Eps) then goto 13;
Xt:=X3;
if Ot then goto 100;
for k:=0 to N-1 do Y[k]:=Y3[k];
if Iss=5 then Goto 10;
21: Iss:=Iss+1;
goto 11;
10: Iss:=0;
H:=2*H;
Goto 21;
13: H:=0.5*H;
Ot:=False;
X1:=X2;
for k:=0 to N-1 do Y1[k]:=Y2[k];
Goto 12;
100: for k:=0 to N-1 do YFin[k]:=Y3[k];
end;
Procedure Optimization;
Label
5000,Rep,1,2;
begin
T:=T1;
Opt:=0;
Rep:
for i:=0 to NN-1 do Y1[i]:=Y2[i];
i:=1;
repeat
K[i-1]:=0.2*i*exp(-100*i/(R*(T+273)));
if ((T0[nom-1]<0)and(T>=Abs(T0[Nom-1]))) then goto 2;
if (T>T0[nom-1]) then goto 1;
2: Tp:=2*Abs(T0[nom-1]);
K[i-1]:=0.2*i*exp(-100*(i+1)/(R*(Tp-T+273)));
1:
i:=i+1;
until i>NSt;
Xt:=TAU1;
5000:
Prim:=True;
Runge(Xt,Y1,NN,Eps,Prim,XFin,YFin);
Xt:=XFin; S0:=0;
for i:=0 to NN-1 do begin
if (YFin[i]<0)then YFin[i]:=0;
Y1[i]:=YFin[i]; S0:=S0+Y1[i];
end;
Yp:=1-(S0-Y1[NN-1]); A:=Y1[NN-1]; Y1[NN-1]:=Yp;
if (Abs(Y1[NC-1])>Abs(Opt)) then begin
Opt:=Y1[NC-1]; TOpt:=T; TAUOPt:=Xt;
if (Xt>=TAU1) then
Writeln(Out,'Концентрация X опт.=',Opt:6:6,',
при T опт.=',TOpt:2:2,', TAUопт.=',TAUOpt:2:2);
end;
Y1[NN-1]:=A; XFin:=Xt+SHAG1; if Xt<=TAU2 then goto 5000;
T:=T+DT;
if T<=T2 then goto Rep;
Writeln(Out,'-----------Результаты оптимизации----------------');
Writeln(Out,'-----------Оптимальные параметры:----------------');
Writeln(Out,'Время пребывания в реакторе (мин.)=',TAUOpt:2:2);
Writeln(Out,'Температура (С)=',TOpt:2:2);
Writeln(Out,'Максимальная концентрация целевого ',NC,'-го
компонента равна ',Opt:6:6,’ мольн.доли’);
end;
begin
Again:
ClrScr;
Writeln('╔═══════════════════════════════════════════════════╗');
Writeln('║ Расчет реактора идеального вытеснения. ║');
Writeln('╚═══════════════════════════════════════════════════╝');
Writeln('Введите исходные данные:');
write(' Номер варианта=>');Readln(Nom);
write(' Число реагентов в реакции=>');Readln(N);
write(' Число стадий в реакции=>');Readln(NSt);
writeln(' Начальные концентрации реагентов в реакции:');
a1:S0:=0;
for i:=1 to N do
begin
write(' Концентрация ',i,'-го компонента=>');
readln(X[i-1]);
S0:=S0+X[i-1];
if (X[i-1]<0)or(X[i-1]>1) then begin Dec(i); Continue;End;
if S0>1 then begin Writeln('Суммарная концентрация
не может быть неравной единице.');goto a1;end;
if S0=1 then Break;
end;
if S0<1 then Goto a1;
write(' Номер целевого компонента=>');readln(NC);
write(' Объемная скорость потока=>');readln(V);
write(' Сечение реактора=>');readln(S);
write(' Температура в реакторе=>');readln(T);
write(' Время пребывания в реакторе (мин.)=>');readln(TAU);
write(' Шаг печати=>');readln(SHAG);
write(' Точность интегрирования=>');readln(EPS);
Writeln('----------------------------------------------------');
Write('Желаете повторить ввод данных? [Y-Да/N-Нет]=>');
Repeat Key:=ReadKey;
Until (Key='Y')or(Key='y')or(Key='N')or(Key='n');
if (Key='Y')or(Key='y') then Goto Again;
Writeln;
Write('Вы желаете вывести результат в файл? [Y-Да/N-Нет]=> ');
Repeat Key:=ReadKey;
Until (Key='Y')or(Key='y')or(Key='N')or(Key='n');
if (Key='Y')or(Key='y') then
begin Assign(Out,'Report.Rpt');Fl:=True;end
else Assign(Out,'');
Writeln; ReWrite(Out);
GetConstants_K;
TAU:=L*S/V;
for i:=0 to N-1 do Y[i]:=X[i];
for i:=0 to N-1 do if N=i+1 then Yp:=X[i];
NN:=N; Xt:=0; Y[NN]:=0;
for i:=0 to NN-1 do begin Y2[i]:=Y[i]; Y1[i]:=Y[i]; end;
ClrScr;
Writeln(Out,'---------------------Расчет--------------------');
Writeln(Out,'Объемная скорость V=',V:2:2);
Writeln(Out,'Температура (C) T=',T:2:2);
Writeln(Out,'Высота реактора L=',L:2:2);
Writeln(Out,'Сечение реактора S=',S:2:2);
Writeln(Out,'Время пребываения (мин.) TAU=',TAU:2:2);
Writeln(Out,'Номер целевого компонента NC=',NC);
Writeln(Out,'Точность интегрирования EPS=',EPS:6:6);
Writeln(Out,'-----Результаты расчета----------------------');
Write(Out,'TAU');
for i:=1 to N do Write(Out,'.......X[',i,']');
Writeln(Out);
Write(Out,Xt:2:2);
for i:=1 to N do Write(Out,' ',X[i-1]:6:6);
Writeln(Out);
1000:
XFin:=Xt+Shag;
Prim:=True;
Runge(Xt,Y,NN,EPs,Prim,XFin,YFin);
Xt:=XFin;
S0:=0;
For i:=0 to NN-1 do begin
if (YFin[i]<0) then YFin[i]:=0;
Y[i]:=YFin[i];
S0:=S0+Y[i];
end;
Yp:=1-(S0-Y[NN-1]);
Writeln(Out);
if Xt<10 then Write(Out,' ',Xt:2:2) else Write(Out,Xt:2:2);
for i:=0 to NN-2 do Write(Out,' ',Y[i]:6:6);
Write(Out,' ',Yp:6:6);
if Xt<10 then Write(Out,' ',Y[NN-1]:2:2) else Write(Out,'
',Y[NN-1]:2:2);
if Xt<TAU then goto 1000;
Temp:=Yp;
Yp:=Y[NN-1];
Y[NN-1]:=Temp;
Writeln(Out);
Write(Out,'Выход целевого ',NC,'-го компонента=',Y[NC-1]:6:6);
Y[N]:=Yp;
Writeln(Out);
Write('Желаете оптимизировать данные? [Y-Да/N-Нет]=>');
Repeat Key:=ReadKey;
Until (Key='Y')or(Key='y')or(Key='N')or(Key='n');
if (Key='N')or(Key='n') then Goto Back;
Writeln(Out);
Writeln;
Write('Задайте нижнюю границу поиска по времени TAU1=');
readln(TAU1);
Write('Задайте верхнюю границу поиска по времени TAU2=');
readln(TAU2);
Write('Задайте шаг поиска по времени SHAG1=');
readln(SHAG1);
Write('Задайте нижнюю границу поиска по температуре T1=');
readln(T1);
Write('Задайте верхнюю границу поиска по температуре T2=');
readln(T2);
Write('Задайте шаг поиска по температуре DT=');
readln(DT);
if Fl then Writeln(Out,'TAU1=',TAU1:2:2,’ мин’);
if Fl then Writeln(Out,'TAU2=',TAU2:2:2,’ мин’);
if Fl then Writeln(Out,'SHAG1=',SHAG1:2:2,’ мин’);
if Fl then Writeln(Out,'T1=',T1:2:2,’ С’);
if Fl then Writeln(Out,'T2=',T2:2:2,’ С’);
if Fl then Writeln(Out,'DT=',DT:2:2,’ С’);
ClrScr;
Write('Ждите...');
Optimization;
back:
Write('Желаете начать заново? [Y-Да/N-Нет]=>');
Repeat Key:=ReadKey;
Until (Key='Y')or(Key='y')or(Key='N')or(Key='n');
if (Key='Y')or(Key='y') then Goto Again;
Close(Out);
end.
СПИСОК ЛИТЕРАТУРЫ
1. Кафаров В.В. Методы кибернетики химико-технологических процессов. - М.: Химия,1971. - 496с.
2. Безденежных А.А. Математические модели химических реакторов - Киев: Наука, 1970. - 171с.
3. Агеев М.И. и др. Библиотека технической кибернетики. – М.: Наука, 1985. -Вып.1. - 175с.
4. Бояринов А.И., Кафаров В.В. Методы оптимизации в химической технологии. - М.: Химия, 1975. - 576с.