Теперьрассмотримещеоднупрограммупотойжезадаче . 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Теперьрассмотримещеоднупрограммупотойжезадаче .



При запуске программы нажатием на кнопку ВЫЧИСЛИТЬ открывается окно с вопросом, откуда взять массив исходных данных (рис.3.3.1). Надо согласиться с предложенным по умолчанию.

Рис.3.3.1.(а). После того как будет сделан выбор, считывается из файла массив экспериментальных данных.

Затем таким же образом считывается второй массив экспериментальных данных.

 

Рис.3.3.1.(б). После того как будет сделан выбор, считывается из файла массив экспериментальных данных.

 

Потом (рис.3.3.2) вычисляются результаты.

Для построения графика необходимо выбрать исходную величину-аргумент (будет отображаться по горизонтальной оси), диапазон и шаг ее изменения, а также величину-функцию, зависящую от аргумента (вертикальная ось). Построенный график покажет, как будет изменяться зависимая величина при изменении аргумента (при этом значения всех остальных исходных величин, которые были введены в окна ввода исходных величин будут оставаться неизменными) – рис. 3.3.3.Для построения трехмерного графика также надо выбрать необходимые данные. По умолчанию стоит ноль (0) в окошке ввода номера аргумента. Пока там ноль, программа будет строить двумерный график.

Рис.3.3.2. Вычисление результатов.

Рис.3.3.3. Построение графиков (в данном случае открыты из файла).

Осмотр массива экспериментальных данных (если пользователь не хочет использовать без предварительного ознакомления то, что уже есть в файле) производится следующим образом (разумеется, осмотр экспериментальных данныхпроизводится до нажатия на кнопку ВЫЧИСЛИТЬ).Для осмотра массива экспериментальных данных надо начать с нажатия на кнопку ВРЕМЯ ЭКСП (например), и тогда откроется окно (рис.3.3.4), оно открывается прямо поверх уже существующего окна.

Рис.3.3.4. После нажатия на кнопку ВРЕМЯ ЭКСП откроется окно.

Затем надо нажать на кнопку OPEN (рис.3.3.5) и откроется массив данных.

Рис.3.3.5. Нажать на кнопку OPEN - откроется массив данных.

Приэтомвокошке Numberofelements появилась цифра 61 это и есть количество элементов массива.

Ввод массива экспериментальных данных (если пользователь не хочет использовать то, что уже есть в файле) производится следующим образом (разумеется, ввод экспериментальных данныхпроизводится до нажатия на кнопку ВЫЧИСЛИТЬ).Для ввода массива экспериментальных данных надо начать с нажатия на кнопку КОНЦ Р ЭКСП (например), и тогда откроется окно (рис.3.3.6), оно открывается прямо поверх уже существующего окна.

Рис.3.3.6. После нажатия на кнопку КОНЦ Р ЭКСП откроется окно.

Надо ввести в окошко Numberofelements цифру (рис.3.3.7), это и есть количество элементов массива, который пользователь хочет ввести.

Рис.3.3.7. Ввести в окошко Numberofelements число элементов массива.

Затем нажать на кнопку INPUT. Появится (рис.3.3.8) автоматически в окошке Row число 1. Это означает что будет вводиться пользователем элемент массива (столбца) первый, то есть расположенный в строке 1.

Рис.3.3.8. Нажать на кнопку INPUT. Появится в окошке Row число 1.

Теперь пользователь вводит (рис.3.3.9) в окошко InputData значение первого элемента массива, то есть то число, которое он считает первым среди экспериментальных данных.

Рис.3.3.9. Пользователь вводит в окошко InputData первый элемент.

Теперь пользователь нажимает (рис.3.3.10) на кнопку InputNewColumnElement и в большом окошке появляется то самое число, ранее введенное в окошко InputData, это теперь значение первого элемента массива, оно уже введено и отображается в большом окошке (оно предназначено для отображения значений элементов массива).

Рис.3.3.10. Пользователь нажимает на кнопку InputNewColumnElement и в большом окошке появляется число, введенное в окошко InputData.

Теперь пользователь вводит (рис.3.3.11) в окошко InputData значение второго элемента массива, то есть то число, которое он считает вторым среди экспериментальных данных. Затем пользователь нажимает на кнопку InputNewColumnElement и в большом окошке появляется то самое число, ранее введенное в окошко InputData, это теперь второе значение массива, оно уже введено и отображается вслед за предыдущим значением в большом окошке (оно предназначено для отображения значений элементов массива). Если элементов массива несколько, то они отображаются в строку и заключаются в скобки.

Рис.3.3.10. Пользователь нажимает на кнопку InputNewColumnElement и в большом окошке появляется второе число, введенное в окошко InputData. Теперь таким же образом вводятся все остальные элементы массива.

Текст программы начнем с тех самых вышеописанных двух открывающихся окошек с экспериментальными данными.

Итак,функция OptimHTP_S1_3_f1_Time_Experimental_In. Она имеет собственный визуальный (Windows-подобный) интерфейс.Ее функции (описанные внутри функции OptimHTP_S1_3_f1_Time_Experimental_In) описаны ниже.

Функцияpushbutton3_Callback сохраняет данные в файл. Вызывается при нажатии на кнопку «SAVE». Кнопке должен быть указан тэгpushbutton3. Она считывает количество элементов массива – переменнуюNumberRows – изокошкастэгомedit1иподписью Number of elements. Затемфункцияpushbutton3_Callbackсчитывает переменнуюVector(массив чисел) функциейstr2num, преобразующей строку символов в строку чисел, из окна с тэгомedit4– это большое нижнее окно для ввода элементов массива. Затемсохраняетмассиввфайл.

% --- Executes on button press in pushbutton3. SAVE

function pushbutton3_Callback(hObject, eventdata, handles)

NumberRows=str2double(get(handles.edit1,'String')); 

Vector=str2num(get(handles.edit4,'String'));       

%OPEN FILE WT

[f,p]=uiputfile('C:\MATLAB701\work\OptimHTP_S1_3_f1_Time_Experimental_In.txt','Окновыбора');

   KudaZapisat=strcat(p,f);

   f=fopen(KudaZapisat,'wt');

   fprintf(f,'%d\n',NumberRows);

%SAVE VALUES OF ARGUMENTS AND RESULTS

for i=1:NumberRows

       fprintf(f,'%g\t',Vector(i));

       fprintf(f,'\n');

end

   fclose(f);

end

Функцияpushbutton1_Callbackвызываетсянажатиемкнопки «INPUT»итэгомpushbutton1.Она выводит единицу в окно с тэгомedit3и подписью Row. Затем функция очищает (выводит пробел в окно) окошко с тэгомedit4 – большое нижнее окно для элементов массива.

% --- Executes on button press in pushbutton1. INPUT_NUMBER_OF_ELEMENTS

function pushbutton1_Callback(hObject, eventdata, handles)

S=sprintf('%g',1);

set(handles.edit3,'String',S);

S=sprintf('%s',' ');

set(handles.edit4,'String',S);

end

Функцияpushbutton2_Callbackвызываетсякнопкой «INPUT NEW COLUMN ELEMENT» итэгомpushbutton2. Онасчитывает число всех возможных элементов (максимальный размер массива) в переменнуюNumberRowsизокнастэгомedit1иподписью Numberofelements, считываетномер очередного элемента массива из окна с тэгом edit3и подписью Row, считывает массив Vectorфункциейstr2num (преобразующей строку символов в массив чисел) из окна с тэгомedit4 – большое нижнее окно ввода массива.

Затем функцияpushbutton2_Callback проверяет, что i<=NumberRowsне превышено максимальное возможное число элементов массива. И после этого считывает в массив очередной элементVector(i) из окна с тэгомedit2 и подписью Columnelement и преобразуетS=mat2str(Vector);массив в строку символов.

Затем функцияpushbutton2_Callback выводит массив Vectorв большое окно с тэгомedit4. После этого выводит число на единицу больше прежнего номера элемента в окно с тэгом edit3 и подписью Row. Потом стирает содержимое окна с тэгомedit2 и подписью Columnelement.

% --- Executes on button press in pushbutton2. INPUT NEW VECTOR ELEMENT

function pushbutton2_Callback(hObject, eventdata, handles)

NumberRows=str2double(get(handles.edit1,'String'));

i=str2double(get(handles.edit3,'String'));

Vector=str2num(get(handles.edit4,'String'));

if i<=NumberRows

Vector(i)=str2double(get(handles.edit2,'String'));

           S=mat2str(Vector);

           set(handles.edit4,'String',S);

           a=i+1;

           S=sprintf('%g',a);

           set(handles.edit3,'String',S);

           S=sprintf('%s',' ');

           set(handles.edit2,'String',S);

end

end

Функцияpushbutton4_Callbackвызываетсянажатиемнакнопкустэгомpushbutton4 инадписью«OPEN». Она открывает файл и выводит в большое окно массив, а в маленькое окно с тэгомedit1 размер массива.

% --- Executes on button press in pushbutton4. OPEN

function pushbutton4_Callback(hObject, eventdata, handles)

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3_f1_Time_Experimental_In.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila matricu OptimHTP_S1_3_f1_Time_Experimental_In(n)

n=fscanf(f,'%d',1);

for i=1:n

   Vector(i)=fscanf(f,'%g',1);

end

fclose(f);

S=mat2str(Vector);

set(handles.edit4,'String',S);

S=n;

set(handles.edit1,'String',S);

end

Текст программы продолжим второй из тех самых вышеописанных двух открывающихся окошек с экспериментальными данными. Итакфункция OptimHTP _ S 1_3_ f 2_ Concentr _ P _ Experimental _ In. Она имеет собственный визуальный (Windows-подобный) интерфейс.

Ее функции (описанные внутри функции OptimHTP_S1_3_f2_Concentr_P_Experimental_In) описаны ниже. Они аналогичны вышеописанным функциям для предыдущей функции OptimHTP_S1_3_f1_Time_Experimental_In. Отличия заключаются в том, что при сохранении используется файл с другим названием.

Функцияpushbutton3_Callback сохраняет данные в файл. Вызывается при нажатии на кнопку «SAVE». Кнопке должен быть указан тэгpushbutton3. Она считывает количество элементов массива – переменнуюNumberRows – изокошкастэгомedit1иподписью Number of elements. Затемфункцияpushbutton3_Callbackсчитывает переменнуюVector(массив чисел) функциейstr2num, преобразующей строку символов в строку чисел, из окна с тэгомedit4– это большое нижнее окно для ввода элементов массива. Затемсохраняетмассиввфайл.

% --- Executes on button press in pushbutton3. SAVE

function pushbutton3_Callback(hObject, eventdata, handles)

NumberRows=str2double(get(handles.edit1,'String')); 

Vector=str2num(get(handles.edit4,'String'));       

%OPEN FILE WT

[f,p]=uiputfile('C:\MATLAB701\work\OptimHTP_S1_3_f2_Concentr_P_Experimental_In.txt','Окновыбора');

   KudaZapisat=strcat(p,f);

   f=fopen(KudaZapisat,'wt');

   fprintf(f,'%d\n',NumberRows);

%SAVE VALUES OF ARGUMENTS AND RESULTS

for i=1:NumberRows

       fprintf(f,'%g\t',Vector(i));

       fprintf(f,'\n');

end

   fclose(f);

end

Функцияpushbutton1_Callbackвызываетсянажатиемкнопки «INPUT» итэгомpushbutton1. Она выводит единицу в окно с тэгомedit3 и подписью Row. Затем функция очищает (выводит пробел в окно) окошко с тэгомedit4 – большое нижнее окно для элементов массива.

% --- Executes on button press in pushbutton1. INPUT_NUMBER_OF_ELEMNTS

function pushbutton1_Callback(hObject, eventdata, handles)

S=sprintf('%g',1);

set(handles.edit3,'String',S);

S=sprintf('%s',' ');

set(handles.edit4,'String',S);

end

Функцияpushbutton2_Callbackвызываетсякнопкой «INPUTNEWCOLUMNELEMENT» итэгомpushbutton2. Онасчитывает число всех возможных элементов (максимальный размер массива) в переменнуюNumberRowsизокнастэгомedit1иподписью Numberofelements, считываетномер очередного элемента массива из окна с тэгом edit3 и подписью Row, считывает массив Vectorфункциейstr2num (преобразующей строку символов в массив чисел) из окна с тэгомedit4 – большое нижнее окно ввода массива.

Затем функцияpushbutton2_Callback проверяет, что i<=NumberRowsне превышено максимальное возможное число элементов массива. И после этого считывает в массив очередной элементVector(i) из окна с тэгомedit2 и подписью Columnelement и преобразуетS=mat2str(Vector);массив в строку символов.

Затем функцияpushbutton2_Callback выводит массив Vectorв большое окно с тэгомedit4. После этого выводит число на единицу больше прежнего номера элемента в окно с тэгом edit3 и подписью Row. Потом стирает содержимое окна с тэгомedit2 и подписью Columnelement.

% --- Executes on button press in pushbutton2. INPUT NEW VECTOR ELEMENT

function pushbutton2_Callback(hObject, eventdata, handles)

NumberRows=str2double(get(handles.edit1,'String'));

i=str2double(get(handles.edit3,'String'));

Vector=str2num(get(handles.edit4,'String'));

if i<=NumberRows

Vector(i)=str2double(get(handles.edit2,'String'));

           S=mat2str(Vector);

           set(handles.edit4,'String',S);

           a=i+1;

           S=sprintf('%g',a);

           set(handles.edit3,'String',S);

           S=sprintf('%s',' ');

           set(handles.edit2,'String',S);

end

end

Функцияpushbutton4_Callbackвызываетсянажатиемнакнопкустэгомpushbutton4 инадписью«OPEN». Она открывает файл и выводит в большое окно массив, а в маленькое окно с тэгомedit1 размер массива.

% --- Executes on button press in pushbutton4. OPEN

function pushbutton4_Callback(hObject, eventdata, handles)

%Otkrit is faila OptimHTP_S1_3_f2_Concentr_P_Experimental_In

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3_f2_Concentr_P_Experimental_In.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila matricu OptimHTP_S1_3_f2_Concentr_P_Experimental_In(n)

n=fscanf(f,'%d',1);

for i=1:n

   Vector(i)=fscanf(f,'%g',1);

end

fclose(f);

S=mat2str(Vector);

set(handles.edit4,'String',S);

S=n;

set(handles.edit1,'String',S);

end

Теперь перейдем к основной программе Optim_HTP_S1_3_om.

Функция VvodIshodnDannihописанная ниже, обеспечивает считывание значений исходных данных из соответствующих «окон» ввода в интерфейсе, показанном выше на рис.3.3.2.

КаквидноизтекстафункцииVvodIshodnDannih, тэги окон ввода (элементов типа EditText) это edit1, …, edit5. Как видно, нумерация идет подряд (на рис.3.3.2 – сверху вниз по окнам ввода).

Затем открывается окно выбора файла, содержащего массив данных для функцииOptimHTP_S1_3_f1_Time_Experimental_In(рис.3.3.1), выбирается, из какого файла (можно соглашаться по умолчанию, если он один) будет считан массив.

Затем открывается окно выбора файла, содержащего массив данных для функцииOptimHTP_S1_3_f2_Concentr_P_Experimental_In(рис.3.3.1), выбирается, из какого файла (можно соглашаться по умолчанию, если он один) будет считан массив.

%Программа расчета максимального выхода продукта Р в%изотермическом периодическом реакторе со стехиометрической схемой%реакции A - P - S

function VvodIshodnDannih(hObject, eventdata, handles)

global xa0 k1 k2 t_a t_b t_exp xp_exp;

%1. Концентрация реагента А в долях в реакции A-P-S (мольные доли)

xa0=str2double(get(handles.edit1,'String'));

%2. Константыскоростейреакций (час^(-1))

k1=str2double(get(handles.edit2,'String'));

k2=str2double(get(handles.edit3,'String'));

%3. Левая граница поиска оптимального времени пребывания в реакторе (час)

t_a=str2double(get(handles.edit4,'String'));

%4. Правая граница поиска оптимального времени пребывания в реакторе (час)

t_b=str2double(get(handles.edit5,'String'));

%Otkrit is faila Time_Experimental_In

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3_f1_Time_Experimental_In.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila vector Time_Experimental_In

n=fscanf(f,'%d',1);

for i=1:n

   Time_Experimental_In(i)=fscanf(f,'%g',1);       

end

fclose(f);

t_exp=Time_Experimental_In;

%Otkrit is faila Concentr_P_Experimental_In

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3_f2_Concentr_P_Experimental_In.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila vector Concentr_P_Experimental_In

n=fscanf(f,'%d',1);

for i=1:n

   Concentr_P_Experimental_In(i)=fscanf(f,'%g',1);       

end

fclose(f);

xp_exp=Concentr_P_Experimental_In;

end

Функцияpushbutton16_Callback вызывается при нажатии на кнопку «ВРЕМЯ ЭКСП» с тэгомpushbutton16, она вызывает функцию OptimHTP_S1_3_f1_Time_Experimental_In, позволяющую ознакомиться и, если надо, изменить исходные данные.

function pushbutton16_Callback(hObject, eventdata, handles)

OptimHTP_S1_3_f1_Time_Experimental_In();

end

Функцияpushbutton17_Callback вызывается при нажатии на кнопку «КОНЦ Р ЭКСП» с тэгомpushbutton17, она вызывает функцию OptimHTP_S1_3_f2_Concentr_P_Experimental_In, позволяющую ознакомиться и, если надо, изменить исходные данные.

function pushbutton17_Callback(hObject, eventdata, handles)

OptimHTP_S1_3_f2_Concentr_P_Experimental_In();

end

ФункцияVivodArgumentovNaEkran, описанная ниже, обеспечивает вывод в окна с тэгамиedit1, …, edit5, то есть те же самые, которые служат для ввода исходной информации.

function VivodArgumentovNaEkran(hObject, eventdata, handles)

global xa0 k1 k2 t_a t_b;

%vivod argumentov na ekran   

S=sprintf('%g',xa0);

set(handles.edit1,'String',S);

S=sprintf('%g',k1);

set(handles.edit2,'String',S);

S=sprintf('%g',k2);

set(handles.edit3,'String',S);

S=sprintf('%g',t_a);

set(handles.edit4,'String',S);

S=sprintf('%g',t_b);

set(handles.edit5,'String',S);

end

ФункцияVivodResultNaEkranвыводит результаты вычислений в окна вывода на панели «Результаты вычислений» (рис.3.3.2) с тэгамиedit15, …,edit23, то есть пронумерованными подряд. Вывод происходит в окна в соответствии с подписями рядом с ними (рис.3.3.2) с названиями выводимых расчетных параметров (результатов вычислений). 

function VivodResultNaEkran(hObject, eventdata, handles)

global a t_opt phi_p_max xa_last xp_last;

%vivod resultatov na ekran

%Оптимальные значения режимных параметров реактора

S=sprintf('%g',a(1));

set(handles.edit15,'String',S);

S=sprintf('%g',a(2));

set(handles.edit16,'String',S);

S=sprintf('%g',a(3));

set(handles.edit17,'String',S);

S=sprintf('%g',a(4));

set(handles.edit18,'String',S);

S=sprintf('%g',a(5));

set(handles.edit19,'String',S);

S=sprintf('%g',t_opt);

set(handles.edit20,'String',S);

S=sprintf('%g',phi_p_max);

  set(handles.edit21,'String',S);

S=sprintf('%g',xa_last);

set(handles.edit22,'String',S);

S=sprintf('%g',xp_last);

set(handles.edit23,'String',S);

end

 

function yrr= polynom4(t)

%Программный код файла polynon3.m - расчет значений функции многочлена,%аппроксимирующего зависимость изменения концентрации целевого продукта Р%от времени в реакторе

global a;

yrr=-polyval(a,t);

end

 

functionapproxim

%Программный код файла approxim.m - аппроксимация зависимости изменения%целевого продукта от времени многочленом 4-ой степени

global t_exp xp_exp t xp a yr;

t=t_exp';

xp=xp_exp';

a=polyfit(t,xp,4);

yr=polyval(a,t);

end

 

function dy = difpravreactor(t,y)

%Программный код файла difpravreactor.m - расчет правых частей системы%дифференциальных уравнений математического описания процесса

global k1 k2;

dy=zeros(2,1);

dy(1)=-k1*y(1);

dy(2)=k1*y(1)-k2*y(2);

end

ФункцияReshitZadachu имеет центральное (наиглавнейшее) значение в ходе решения поставленной задачи (об отыскании результатов исходя из известных начальных данных). ФункцияReshitZadachu получает в качестве аргумента функции векторVectorArg который содержит все основные исходные данные, последовательно расположенные как элементы вектора. ФункцияReshitZadachu возвращает (ее возвращаемым значением является) вектор результатовVectorRes, который содержит вычисляемые результаты, которые в дальнейшем другими функциями будут выводиться в качестве результатов в окнах интерфейса (рис.3.3.2) и сохраняться в файл (ниже будет описано).

Как видно из текста [t,y]=ode45(@difpravreactor,[t_at_b],[xa0 0]);, решается дифференциальное уравнение, получаются массивы данных, описывающие зависимости концентраций от времени. Как видно изapproxim;yr=polyval(a,t); аппроксимируется экспериментальная зависимость, подготавливаются данные для построения графика расчетной зависимости. Затем функциястроит график в окне графика на рис.3.3.2, подписывает его, подписывает горизонтальную и вертикальную оси. После этого функция рассчитывает оптимальные параметры.

function [VectorRes]=ReshitZadachu(VectorArg)

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

xa0=VectorArg(1); k1=VectorArg(2); k2=VectorArg(3);t_a=VectorArg(4); t_b=VectorArg(5);

% Моделирование периодического реактора с реакцией A - P - S

[t,y]=ode45(@difpravreactor,[t_a t_b],[xa0 0]);

n=length(t);

for i=1:n

y1(i)=y(i,1);

y2(i)=y(i,2);

end

xa_last=y1(i);

xp_last=y2(i);

%Результат моделирования периодического реактора с реакцией A - P - S% концентрации -- А, -.-. P(мольн.д.)

% Аппроксимация изменения концентрации целевого продукта P со временем

approxim;

yr=polyval(a,t);

% hold on;

plot(t,y1,'k-',t,y2,'r-.',t,xp_exp,'r*',t,yr,'b-');

title('концентрации -- А, -.-. P(моль.д.) Макс. выход продукта Р * экспер., -- расчетн. в период. реакторе с реакцией A - P - S');

xlabel('t (час)');ylabel('-- А, -.-. P, * экс.P, -- расч.P (мол.д.)');

grid on;

% Оптимальные значения режимных параметров реактора

i=0;

for tau=t_a:0.01:t_b

i=i+1;

phi_p(i)=polynom4(tau);

tau_mas(i)=tau;

end

[phi_p_max,k]=min(phi_p);

phi_p_max=-phi_p_max/xa0;

t_opt=tau_mas(k);

VectorRes=[ a(1), a(2), a(3), a(4), a(5),t_opt, phi_p_max, xa_last, xp_last];

end

ФункцияReshitZadachuG аналогична описанной выше функции ReshitZadachu, однаков отличие от нее не строит график. ФункцияReshitZadachuGпредназначена для многократного вызова при расчете точек, например, для трехмерного графика (рис.3.3.3).

function [VectorRes]=ReshitZadachuG(VectorArg)

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

xa0=VectorArg(1); k1=VectorArg(2); k2=VectorArg(3);

t_a=VectorArg(4); t_b=VectorArg(5);

% Моделирование периодического реактора с реакцией A - P - S

[t,y]=ode45(@difpravreactor,[t_a t_b],[xa0 0]);

n=length(t);

for i=1:n

y1(i)=y(i,1);

y2(i)=y(i,2);

end

xa_last=y1(i);

xp_last=y2(i);

%Результат моделирования периодического реактора с реакцией A - P - S

концентрации -- А, -.-. P(мольн.д.)

% Аппроксимация изменения концентрации целевого продукта P со временем

approxim;

yr=polyval(a,t);

% Оптимальные значения режимных параметров реактора

i=0;

for tau=t_a:0.01:t_b

i=i+1;

phi_p(i)=polynom4(tau);

tau_mas(i)=tau;

end

[phi_p_max,k]=min(phi_p);

phi_p_max=-phi_p_max/xa0;

t_opt=tau_mas(k);

VectorRes=[ a(1), a(2), a(3), a(4), a(5),t_opt, phi_p_max, xa_last, xp_last];

end

ФункцияPostrGraficстроитграфик, онаиспользуетимя (порядковыйномерподписанныйусоответствующегоокнавинтерфейсе) NameArgаргумента (отображаемогопогоризонтальнойоси), используетимя (порядковыйномерподписанныйусоответствующегоокнавинтерфейсе) NameVarзависимой переменной (отображаемойповертикальнойоси), шкалу по горизонтальной оси отзначенияLeftNameVar до значенияRightNameVar с шагомStepGr (шаг отображается в разметке горизонтальной оси и в шаге между точками графика).

Кроме того, функцияPostrGraficстроитграфик. Затем функция подготавливает подписи к горизонтальной оси и к вертикальной оси и размещает их в соответствующих двух массивах. В каждом из массивов подписи из одинакового количества символов, включая пробелы. Последняя подпись в каждом массиве на один символ длиннее.

Функция подготавливает подпись к горизонтальной оси, учитывая, что длина подписи принимается двенадцать символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером NameArg.

Также функция PostrGrafic подготавливает подпись к вертикальной оси, учитывая, что длина подписи принимается шестнадцать символов (последняя подпись в массиве делается на один знак длиннее).Функция выбирает подпись - элемент массива с номером NameVar.

Затем функция PostrGrafic подписывает оси подготовленными для этого подписями.

КаквидноизтекстаArray_3D=0; zLlabel=0; NumberSteps_3D=0; LeftNameArg_3D=0; StepGr_3D=0; RightNameArg_3D=0;функция PostrGrafic присваивает значения равные нулю переменным, связанным с построением трехмерного графика. Это обеспечивает согласованную работу с некоторыми другими функциями (будут описаны ниже).

function PostrGrafic(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

VectorArg=[xa0, k1, k2, t_a, t_b];

VectorArg(NameArg)=LeftNameVar;

k1Array(1)=LeftNameVar;

[VectorRes]=ReshitZadachuG(VectorArg);

v1Array(1)=VectorRes(NameVar);

for i=2:NumberSteps+1

   k1Array(i)=k1Array(i-1)+StepGr;

   VectorArg(NameArg)=k1Array(i);       

   [VectorRes]=ReshitZadachuG(VectorArg);

   v1Array(i)=VectorRes(NameVar);

end

plot(k1Array,v1Array,'o-');

set(gca,'XGrid','on');

set(gca,'YGrid','on');

%podpisi k osyam

TextVectorArg=[' xa0(мол.д.)',' k1(1/час) ',' k2(1/час) ',' tau a(час) ',' tau b(час) '];

TextVectorRes=[' a(1)      ',' a(2)      ',' a(3)      ',' a(4)      ',' a(5)      ',' tau opt(час) ',' phi p max ',' xalast(мол.д.) ',' xp last(мол.д.) '];

xLlabel=' ';

for i=((NameArg-1)*12+1):(NameArg*12+1)

   xLlabel=strcat(xLlabel,TextVectorArg(i));

end

yLlabel=' ';

for i=((NameVar-1)*16+1):(NameVar*16+1)

   yLlabel=strcat(yLlabel,TextVectorRes(i));

end

xlabel(xLlabel);

ylabel(yLlabel);

Array_3D=0;

zLlabel=0;

NumberSteps_3D=0;

LeftNameArg_3D=0;

StepGr_3D=0;

RightNameArg_3D=0;

end

ФункцияPostrGrafic_3Dстроиттрехмерныйграфик. Функция использует для третьей оси (второй оси в горизонтальной плоскости) значение NameArg_3Dкак имя (номер указанный в подписях к элементам интерфейса) переменной по третьей оси (второй аргумент при построении графика зависимости от двух аргументов), шкалу по третьей оси от LeftNameArg_3D доRightNameArg_3D с шагом StepGr_3D. В конце работы функция присваиваетv1Array=0; для совместимости с некоторыми другими функциями (будут описаны ниже)

function PostrGrafic_3D(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

VectorArg=[xa0, k1, k2, t_a, t_b];

for i=1:NumberSteps+1

if i==1

       k1Array(i)=LeftNameVar; 

else

       k1Array(i)=k1Array(i-1)+StepGr;           

end%if

   VectorArg(NameArg)=k1Array(i);

for j=1:NumberSteps_3D+1

if j==1

           z1Array(j)=LeftNameArg_3D; 

else

           z1Array(j)=z1Array(j-1)+StepGr_3D;   

end%if

       VectorArg(NameArg_3D)=z1Array(j);

       [VectorRes]=ReshitZadachuG(VectorArg);

       Array_3D(j,i)=VectorRes(NameVar);

end%for j

end%for i

[x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D);

%x %числостолбцов=NumberSteps+1 числострок=NumberSteps_3D+1

%y %числостолбцов=NumberSteps+1 числострок=NumberSteps_3D+1

%Array_3D %числостолбцов=NumberSteps+1 числострок=NumberSteps_3D+1

mesh(x,y,Array_3D);

%podpisi k osyam

TextVectorArg=[' xa0(мол.д.)',' k1(1/час) ',' k2(1/час) ',' tau a(час) ',' tau b(час) '];

TextVectorRes=[' a(1)      ',' a(2)      ',' a(3)      ',' a(4)      ',' a(5)      ',' tau opt(час) ',' phi p max  ',' xalast(мол.д.) ',' xp last(мол.д.) '];

xLlabel=' ';

for i=((NameArg-1)*12+1):(NameArg*12+1)

   xLlabel=strcat(xLlabel,TextVectorArg(i));

end

yLlabel=' ';

for i=((NameArg_3D-1)*12+1):(NameArg_3D*12+1)

   yLlabel=strcat(yLlabel,TextVectorArg(i));

end

zLlabel=' ';

for i=((NameVar-1)*16+1):(NameVar*16+1)

   zLlabel=strcat(zLlabel,TextVectorRes(i));

end

xlabel(xLlabel);

ylabel(yLlabel);

zlabel(zLlabel);

v1Array=0;

end

Функцияpushbutton13_Callbackвызываетсяпринажатиикнопкиинтерфейсаснадписью«ПОСТРОИТЬ ГРАФИК». Необходимо присвоить этой кнопке тэгpushbutton13 при создании интерфейса. Функция считывает значения переменных из окон интерфейса. NameVarиз окна «номер зависимой переменной» с тэгом edit31,LeftNameVarиз окна «минимальное значение аргумента» с тэгомedit29,RightNameVarиз окна «максимальное значение аргумента» с тэгомedit30,NameArgиз окна «номер аргумента» с тэгомedit28,StepGrиз окна«шаг аргумента» с тэгомedit32, а также с панели для построения трехмерного графика «Объемный график»считывает NameArg_3Dиз окна «номер аргумента» с тэгомedit33,LeftNameArg_3Dиз окна «минимальный» с тэгомedit34,RightNameArg_3Dиз окна «максимальный» с тэгомedit36,StepGr_3Dиз окна «шаг» с тэгомedit35. Необходимо присвоить этим окнам соответствующие тэги.

Если NameArg_3Dравеннулю, то вызывается функцияPostrGrafic для построения плоского графика. По умолчанию в окне панели для построения трехмерного графика «Объемный график» NameArg_3D«номер аргумента» (рис.3.3.2) стоит ноль. Его надо указать при создании интерфейса как значение ‘String’.

Если NameArg_3Dне равеннулю, то вызывается функцияPostrGrafic_3D для построения трехмерного графика.

function pushbutton13_Callback(hObject, eventdata, handles)

global PG;

if PG==1       

else

   clear global;

end%if

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

NameVar=str2double(get(handles.edit31,'String'));

LeftNameVar=str2double(get(handles.edit29,'String'));

RightNameVar=str2double(get(handles.edit30,'String'));

NameArg=str2double(get(handles.edit28,'String'));

StepGr=str2double(get(handles.edit32,'String'));

VvodIshodnDannih(hObject, eventdata, handles);

NumberSteps=round((RightNameVar-LeftNameVar)/StepGr);

NameArg_3D=str2double(get(handles.edit33,'String'));

if NameArg_3D==0

   PostrGrafic(hObject, eventdata, handles);

else

LeftNameArg_3D=str2double(get(handles.edit34,'String'));

RightNameArg_3D=str2double(get(handles.edit36,'String'));

   StepGr_3D=str2double(get(handles.edit35,'String'));

   NumberSteps_3D=round((RightNameArg_3D-LeftNameArg_3D)/StepGr_3D);

   PostrGrafic_3D(hObject, eventdata, handles);

end%if

end

Функцияpushbutton3_Callbackвызываетсякнопкой «ВЫЧИСЛИТЬ». Необходимо этой кнопке присвоить тэгpushbutton3. Она обеспечивает вызов функцииVvodIshodnDannih то есть ввод исходных данных из окон интерфейса, вызов функцииReshitZadachu то есть вычисление, и вызов функцииVivodResultNaEkranто естьвывод результатов в окна интерфейса.

function pushbutton3_Callback(hObject, eventdata, handles)

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2 xa_last xp_last;

VvodIshodnDannih(hObject, eventdata, handles);

VectorArg=[xa0, k1, k2, t_a, t_b];

[VectorRes]=ReshitZadachu(VectorArg);

a(1)=VectorRes(1); a(2)=VectorRes(2); a(3)=VectorRes(3); a(4)=VectorRes(4); a(5)=VectorRes(5); t_opt=VectorRes(6); phi_p_max=VectorRes(7); xa_last=VectorRes(8); xp_last=VectorRes(9);

VivodResultNaEkran(hObject, eventdata, handles);

end

Функцияpushbutton2_Callbackвызываетсякнопкой «ВЫЧИСЛИТЬИСОХРАНИТЬ», необходимоприсвоитьэтойкнопкетэгpushbutton2, онаобеспечиваетвычислениерезультатовисохранениевфайл.

function pushbutton2_Callback(hObject, eventdata, handles)

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2 xa_last xp_last;

%Vichislit resultati

pushbutton3_Callback(hObject, eventdata, handles);

%otkrit fail dlya zapisi

[f,p]=uiputfile('C:\MATLAB701\work\OptimHTP_S1_3Res.txt','Окновыбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

%gotovim dannije dlja avtomaticheskogo schitivanija

VectorArg=[xa0, k1, k2, t_a, t_b];

VectorRes=[a(1), a(2), a(3), a(4), a(5),t_opt, phi_p_max, xa_last, xp_last ];

for i=1:9

   fprintf(f,'%g\t',VectorRes(i));

end

for i=1:5

   fprintf(f,'%g\t',VectorArg(i));

end

%sohranit v fail resultati vichislenij Оптимвремяпровед-яхимр-иваппаратеидеальнсмешения

fprintf(f,'\nOptimHTP_S1_3 OPTIM VREMYA V REACTORE IDEALN SMESH\n');

fprintf(f,'RESULTATI VICHISLENIY\n');

TextString=strcat(' a(1)      ',' a(2)          ',' a(3)      ',' a(4)      ',' a(5)      ',' tau opt(час) ',' phi p max  ',' xalast(мол.д.) ',' xp last(мол.д.) ');

fprintf(f,TextString);

fprintf(f,'\n');

for i=1:7

   fprintf(f,'%g\t',VectorRes(i));

end

%sohranit v fail ishodnije argumenti

fprintf(f,'\nARGUMENTI VICHISLENIY\n');

TextString=strcat(' xa0(мол.д.)',' k1(1/час) ',' k2(1/час) ',' tau a(час) ',' tau b(час) ');

fprintf(f,TextString);

fprintf(f,'\n');

for i=1:5

   fprintf(f,'%g\t',VectorArg(i));

end

fclose(f);

end

Функция pushbutton14_Callbackвызывается кнопкой «ОТКРЫТЬ ИЗ ФАЙЛА», необходимо этой кнопке присвоить тэгpushbutton14, функция обеспечивает открытие из файла исходных данных и результатов и вывод их в окна интерфейса.

Графиконанестроит.

function pushbutton14_Callback(hObject, eventdata, handles)

clear global;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2 xa_last xp_last;

%Otkrit is faila

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3Res*.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

for i=1:9

   VectorRes(i)=fscanf(f,'%g',1);

end

for i=1:5

   VectorArg(i)=fscanf(f,'%g',1);

end

fclose(f);

a(1)=VectorRes(1); a(2)=VectorRes(2); a(3)=VectorRes(3); a(4)=VectorRes(4); a(5)=VectorRes(5); t_opt=VectorRes(6); phi_p_max=VectorRes(7); xa_last=VectorRes(8); xp_last=VectorRes(9); xa0=VectorArg(1); k1=VectorArg(2); k2=VectorArg(3); t_a=VectorArg(4); t_b=VectorArg(5);

%vivod na ekran

VivodResultNaEkran(hObject, eventdata, handles);

VivodArgumentovNaEkran(hObject, eventdata, handles);

end

Функцияpushbutton8_Callbackвызываетсяпринажатиинакнопку «ПОСТРОИТЬГРАФИКИСОХРАНИТЬ», необходимоэтойкнопкеприсвоитьтэгpushbutton8, функцияобеспечиваетпостроениеграфикаиегосохранениевфайл.

function pushbutton8_Callback(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global PG;

%postroit grafic

PG=1;

pushbutton13_Callback(hObject, eventdata, handles);

PG=0;

%Sohranit grafic v fail

[f,p]=uiputfile('C:\MATLAB701\work\OptimHTP_S1_3Graf.txt','Окновыбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

if Array_3D==0

%gotovim dannije dlja avtomaticheskogo chitivanija

   fprintf(f,'%d\t',NumberSteps);

for i=1:(NumberSteps+1)

       fprintf(f,'%g\t',k1Array(i));

end

   fprintf(f,'\n');

for i=1:(NumberSteps+1)

       fprintf(f,'%g\t',v1Array(i));

end

%podpisi k osyam grafica

   fprintf(f,'%s\t%s\n',xLlabel,yLlabel);

else

%gotovim dannije dlja avtomaticheskogo chitivanija

   NS=0;

   fprintf(f,'%d\n',NS);

fprintf(f,'%d\t%d\t%d\t%d\t%d\t%d\n',LeftNameVar,StepGr,RightNameVar,LeftNameArg_3D,StepGr_3D,RightNameArg_3D);

   fprintf(f,'\n');

for i=1:(NumberSteps_3D+1)

for j=1:(NumberSteps+1)           

          fprintf(f,'%g\t',Array_3D(i,j));

end%for j

       fprintf(f,'\n');

end

   fprintf(f,'\n');

%podpisi k osyam grafica

   fprintf(f,'%s\t%s\t%s\n',xLlabel,yLlabel,zLlabel);       

end%if

%zapisivajem argumenti

VvodIshodnDannih(hObject, eventdata, handles);

VectorArg=[xa0, k1, k2, t_a, t_b];

for i=1:5

  fprintf(f,'%g\t',VectorArg(i));

end

fclose(f);

end

Функцияpushbutton15_Callback вызывается кнопкой «ОТКРЫТЬ ГРАФИК ИЗ ФАЙЛА», необходимо присвоить этой кнопке тэгpushbutton15, функция обеспечивает открытие графика из файла (то есть построение графика) и выводит в окна интерфейса значения исходных данных.

function pushbutton15_Callback(hObject, eventdata, handles)

clear global;

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

%otkrit grafic is faila

[f,p]=uigetfile('C:\MATLAB701\work\OptimHTP_S1_3Graf*.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

NumberSteps=fscanf(f,'%d',1);

if NumberSteps==0

   LeftNameVar=fscanf(f,'%g',1);

   StepGr=fscanf(f,'%g',1);

   RightNameVar=fscanf(f,'%g',1);

   LeftNameArg_3D=fscanf(f,'%g',1);

   StepGr_3D=fscanf(f,'%g',1);

   RightNameArg_3D=fscanf(f,'%g',1);

[x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D);

%числостолбцов=NumberSteps+1 числострок=NumberSteps_3D+1

   NumberSteps_3D=round((RightNameArg_3D-LeftNameArg_3D)/StepGr_3D);

   NumberSteps=round((RightNameVar-LeftNameVar)/StepGr);

for i=1:(NumberSteps_3D+1)

for j=1:(NumberSteps+1)           

          Array_3D(i,j)=fscanf(f,'%g',1);

end%for j

end% for i

%podpisi k osyam grafica

   xLlabel=fscanf(f,'%s',1);

   yLlabel=fscanf(f,'%s',1);

   zLlabel=fscanf(f,'%s',1);

%stroim grafic

   mesh(x,y,Array_3D);

   xlabel(xLlabel);

   ylabel(yLlabel);

   zlabel(zLlabel);

else

for i=1:NumberSteps+1

       k1Array(i)=fscanf(f,'%g',1);

end

for i=1:NumberSteps+1

       v1Array(i)=fscanf(f,'%g',1);

end

%podpisi k osyam grafica

   xLlabel=fscanf(f,'%s',1);

   yLlabel=fscanf(f,'%s',1);

%stroim grafic

   plot(k1Array,v1Array,'o-');

   set(gca,'XGrid','on');

   set(gca,'YGrid','on'); 

   xlabel(xLlabel);

   ylabel(yLlabel);

end%if

for i=1:5

  VectorArg(i)=fscanf(f,'%g',1);

end

fclose(f);

xa0=VectorArg(1); k1=VectorArg(2); k2=VectorArg(3); t_a=VectorArg(4); t_b=VectorArg(5);

%vivod na ekrans);

VivodArgumentovNaEkran(hObject, eventdata, handles);

end

Для начинающих освоение МАТЛАБа, можно рекомендовать такую же по содержанию программу, но без визуального интерфейса.

Ниже изложено ее содержание.

Для наиболее начальной стадии изучения МАТЛАБа можно рекомендовать ее выполнить сначала не всю, а только следующие ее части:

ИСХОДНЫЕ ДАННЫЕ

ВЫЧИСЛИТЬ

ВЫВОД РЕЗУЛЬТАТОВ

Ниже будет пояснено, какие несколько функций для этого надо подготовить.

 

ИСХОДНЫЕ ДАННЫЕ

Функция DATA, необходимая для задания исходных данных, так как графического интерфейса с окнами ввода данных не предусмотрено. Данные помещаются в файлDATA, соответствующие переменные объявляются глобальными. В дальнейшем именно к файлуDATA будут обращаться различные функции, нуждающиеся в исходных данных, вместо прежнего, описанного выше, обращения к функции ввода данных из окон графического интерфейса.

function DATA

%Программный код файла DATA.m - задание исходной информации для расчетов;%Программа расчета максимального выхода продукта Р в%изотермическом периодическом реакторе со стехиометрической схемой%реакции A - P - S

global xa0 k1 k2 n t_a t_b t_exp xp_exp;

%Концентрация реагента А в долях в реакции A-P-S (мольные доли)

xa0=1;

t_exp=[0 0.0001 0.0003 0.0004 0.0006 0.0013 0.0020 0.0027…

0.0034 0.0070 0.0106 0.0142 0.0178 0.0357 0.0537 0.0716…

0.0896 0.1793 0.2690 0.3587 0.4484 0.6984 0.9484 1.1984…

1.4484 1.6984 1.9484 2.19842.4484 2.6984 2.9484 3.1984…

3.4484 3.6984 3.9484 4.1984 4.4484 4.6984 4.9484 5.1984…

5.4484 5.6984 5.9484 6.1984 6.4484 6.6984 6.9484 7.1984…

7.4484 7.6984 7.9484 8.1984 8.4484 8.6984 8.9484 9.1984…

9.4484 9.5863 9.7242 9.8621 10.0000];

 

xp_exp=[0 0.0001 0.0001 0.0002 0.0002 0.0005 0.0007 0.0010…

0.0012 0.0025 0.0037 0.0050 0.0062 0.0124 0.0185 0.0246…

0.0307 0.0601 0.0883 0.1152 0.1410 0.2069 0.2649 0.3155…

 0.3596 0.3977 0.4305 0.4584 0.4819 0.5015 0.5175 0.5303…

 0.5403 0.5477 0.5527 0.5557 0.5569 0.5565 0.5546 0.5515…

0.5472 0.5419 0.5358 0.5290 0.5215 0.5134 0.5049 0.4960…

 0.4868 0.4773 0.4676 0.4577 0.4478 0.4377 0.4277 0.4176…

 0.4075 0.4020 0.3965 0.3910 0.3855];

%3. Левая граница изменения времени в реакторе (час)

t_a=0;

%4. Правая граница изменения времени в реакторе (час)

t_b=10;

n=length(t_exp);

%Константы скоростей реакций (час^(-1))

k1=0.35;

k2=0.13;

end

ВЫЧИСЛИТЬ

function [VectorRes]=ReshitZadachu(VectorArg)

global xa0 t_a t_b t y n t_opt phi_p_max a t_exp xp_exp xp yr k1 k2;

xa0=VectorArg(1); k1=VectorArg(2); k2=VectorArg(3);t_a=VectorArg(4); t_b=VectorArg(5);

% Моделирование периодического реактора с реакцией A - P - S

[t,y]=ode45(@difpravreactor,[t_a t_b],[xa0 0]);

n=length(t);

for i=1:n

y1(i)=y(i,1);

y2(i)=y(i,2);

end

xa_last=y1(i);

xp_last=y2(i);

%Результат моделирования периодического реактора с реакцией A - P – S

% концентрации -- А, -.-. P(мольн.д.)

% Аппроксимация изменения концентрации целевого продукта P со временем

approxim;

yr=polyval(a,t);

% hold on;

plot(t,y1,'k-',t,y2,'r-.',t,xp_exp,'r*',t,yr,'b-');

title('концентрации -- А, -.-. P(моль.д.) Макс. выход продукта Р * экспер., -- расчетн. в период. реакторе с реакцией A - P - S');

xlabel('t (час)');ylabel('-- А, -.-. P, * экс.P, -- расч.P (мол.д.)');

grid on;

% Оптимальные значения режимных параметров реактора

i=0;

for tau=t_a:0.01:t_b

i=i+1;

phi_p(i)=polynom4(tau);

tau_mas(i)=tau;

end

[phi_p_max,k]=min(phi_p);

phi_p_max=-phi_p_max/xa0;

t_opt=tau_mas(k);

VectorRes=[ a(1), a(2), a(3), a(4), a(5),t_opt, phi_p_max, xa_last, xp_last];

end

 

function yrr= polynom4(t)

%Программный код файла polynon3.m - расчет значений функции многочлена,%аппроксимирующего зависимость изменения концентрации целевого продукта Р%от времени в реакторе %Программа расчета максимального выхода продукта Р в

%изотермическом периодическом реакторе со стехиометрической схемой%реакцииA - P - S

global a;

yrr=-polyval(a,t);

end

 

function dy = difpravreactor(t,y)

%Программный код файла difpravreactor.m - расчет правых частей системы%дифференциальных уравнений математического описания процесса

global k1 k2;

dy=zeros(2,1);

dy(1)=-k1*y(1);

dy(2)=k1*y(1)-k2*y(2);

end

 

function approxim



Поделиться:


Последнее изменение этой страницы: 2021-01-08; просмотров: 84; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.109.141 (0.622 с.)