В этом примере показано, как оптимизировать проект, когда существуют неопределенные переменные. Вы оптимизируете размерности Постоянно реактора смесителя (CSTR), чтобы минимизировать изменение концентрации продукта и стоимость изготовления в случае варьирования, или сомнительный, запас канала.
Постоянно Реакторы Смесителя (CSTRs) распространены в перерабатывающей промышленности. Модель Simulink, sdoCSTR
, моделирует покрытое кожухом диабатическое (т.е. неадиабатическая) реактор бака, описанный в [1]. CSTR принят, чтобы быть отлично смешанным с одной экзотермической и необратимой реакцией первого порядка., реагент, преобразован в, продукт.
В этом примере вы используете следующую модель CSTR с двумя состояниями, которая использует основные принципы учета и энергосбережения:
, и - Концентрации в CSTR и в канале [kgmol/m^3]
, и - CSTR, канал и температуры хладагента [K]
и - Объемный расход [м^3/ч] и плотность материала в CSTR [1/м^3]
и - Высота [m] и нагретая площадь поперечного сечения [м^2] CSTR.
- Предэкспоненциальный нетепловой фактор для [1/h] реакции
и - Энергия активации и тепло реакции для [kcal/kgmol]
- Газовая константа Больцманна [kcal / (kgmol * K)]
и - Теплоемкость [kcal/K] и коэффициенты теплопередачи [kcal / (м^2 * K * h)]
Откройте модель Simulink.
open_system('sdoCSTR');
Модель включает каскадный ПИД-регулятор в Controller
подсистема. Контроллер регулирует реакторную температуру и реакторную остаточную концентрацию.
Примите, что CSTR является цилиндрическим с хладагентом, к которому применяются основа цилиндра. Настройте площадь поперечного сечения CSTR и высоту CSTR, чтобы удовлетворить следующим целям проекта:
Минимизируйте изменение остаточной концентрации. Изменения остаточной концентрации негативно влияют на качество продукта CSTR. Минимизация изменений также улучшает прибыль CSTR.
Минимизируйте среднюю температуру хладагента. Нагревание или охлаждение температуры хладагента конверта являются дорогими. Минимизация средней температуры хладагента улучшает прибыль CSTR.
Проект должен допускать изменения в качестве концентрации канала предоставления и питать температуру. CSTR питается каналом от различных поставщиков. Качество канала отличается от поставщика поставщику и также варьируется в каждом пакете предоставления.
Выберите следующие параметры модели как переменные проекта для оптимизации:
Цилиндрическая площадь поперечного сечения
Цилиндрическая высота
p = sdo.getParameterFromModel('sdoCSTR',{'A','h'});
Ограничьте площадь поперечного сечения областью значений [1 2] м^2.
p(1).Minimum = 1; p(1).Maximum = 2;
Ограничьте высоту областью значений [1 3] m.
p(2).Minimum = 1; p(2).Maximum = 3;
Выберите концентрацию канала и питайте температуру как неопределенные переменные. Вы оцениваете проект с помощью различных значений температуры канала и концентрации.
pUnc = sdo.getParameterFromModel('sdoCSTR',{'FeedCon0','FeedTemp0'});
Создайте пространство параметров для неопределенных переменных. Используйте нормальные распределения в обеих переменных. Задайте среднее значение как текущее значение параметров. Задайте отклонение 5% среднего значения для концентрации канала и 1% среднего значения для температуры.
uSpace = sdo.ParameterSpace(pUnc); uSpace = setDistribution(uSpace,'FeedCon0',makedist('normal',pUnc(1).Value,0.05*pUnc(1).Value)); uSpace = setDistribution(uSpace,'FeedTemp0',makedist('normal',pUnc(2).Value,0.01*pUnc(2).Value));
Концентрация канала обратно пропорционально коррелируется с температурой канала. Добавьте эту информацию в пространство параметров.
%uSpace.RankCorrelation = [1 -0.6; -0.6 1];
Матрица порядковой корреляции имеет строку и столбец для каждого параметра с (i, j) запись, задающая корреляцию между i и j параметрами.
Произведите пространство параметров. График рассеивания показывает корреляцию между концентрацией и температурой.
rng('default'); %For reproducibility uSmpl = sdo.sample(uSpace,60); sdo.scatterPlot(uSmpl)
Идеально вы хотите оценить проект для каждой комбинации точек в проекте и неопределенных пробелах, который подразумевает 30*60 = 1 800 симуляций. Каждая симуляция занимает приблизительно 0,5 секунды. Можно использовать параллельные вычисления, чтобы ускорить оценку. Для этого примера вы вместо этого только используете выборки, которые имеют максимальную & минимальную концентрацию и температурные значения, уменьшая время оценки приблизительно до 1 min.
[~,iminC] = min(uSmpl.FeedCon0); [~,imaxC] = max(uSmpl.FeedCon0); [~,iminT] = min(uSmpl.FeedTemp0); [~,imaxT] = max(uSmpl.FeedTemp0); uSmpl = uSmpl(unique([iminC,imaxC,iminT,imaxT]) ,:);
Конструктивные требования требуют сигналов модели логгирования. Во время оптимизации модель симулирована с помощью текущего значения переменных проекта. Регистрируемые сигналы используются, чтобы оценить конструктивные требования.
Регистрируйте следующие сигналы:
Концентрация CSTR, доступная во втором выходном порту sdoCSTR/CSTR
блок
Conc = Simulink.SimulationData.SignalLoggingInfo; Conc.BlockPath = 'sdoCSTR/CSTR'; Conc.OutputPortIndex = 2; Conc.LoggingInfo.NameMode = 1; Conc.LoggingInfo.LoggingName = 'Concentration';
Температура хладагента, доступная при первом выходе sdoCSTR/Controller
блок
Coolant = Simulink.SimulationData.SignalLoggingInfo; Coolant.BlockPath = 'sdoCSTR/Controller'; Coolant.OutputPortIndex = 1; Coolant.LoggingInfo.NameMode = 1; Coolant.LoggingInfo.LoggingName = 'Coolant';
Создайте и сконфигурируйте тестовый объект симуляции регистрировать необходимые сигналы.
simulator = sdo.SimulationTest('sdoCSTR');
simulator.LoggingInfo.Signals = [Conc,Coolant];
Создайте функцию, чтобы оценить проект CSTR. Эта функция вызвана в каждой итерации оптимизации.
Используйте анонимную функцию с одним аргументом, который вызывает sdoCSTR_design
функция.
evalDesign = @(p) sdoCSTR_design(p,simulator,pUnc,uSmpl);
evalDesign
функция:
Имеет один входной параметр, который задает размерности CSTR
Возвращает значение цели оптимизации
sdoCSTR_design
функционируйте использует for
цикл, который выполняет итерации через демонстрационные значения, заданные для концентрации канала. В цикле, функции:
Симулирует модель с помощью тока, выполняют итерации, концентрация канала, и питают температурные значения
Вычисляет остаточное изменение концентрации и затраты температуры хладагента
Чтобы просмотреть целевую функцию, введите edit sdoCSTR_design
.
Вызовите evalDesign
функция с начальными размерностями CSTR.
dInit = evalDesign(p)
dInit = struct with fields: F: 11.3356 costConc: 6.4390 costCoolant: 4.8965
Постройте ответ модели для первоначального проекта. Симулируйте модель с помощью демонстрационных значений концентрации канала. График показывает изменение остаточной концентрации и температуры хладагента.
sdoCSTR_plotModelResponse(p,simulator,pUnc,uSmpl);
sdoCSTR_plotModelResponse
графики функций ответ модели. Чтобы просмотреть эту функцию, введите edit sdoCSTR_plotModelResponse
.
Передайте целевую функцию и начальные размерности CSTR к sdo.optimize
.
pOpt = sdo.optimize(evalDesign,p)
Optimization started 26-Jul-2019 21:06:57 max First-order Iter F-count f(x) constraint Step-size optimality 0 4 5.17535 0 1 8 3.81522 0 2.01 7.83 2 12 2.63696 0 0.57 3.01 3 16 2.53152 0 0.159 0.252 4 20 2.51758 0 0.0144 0.365 5 24 2.49208 0 0.105 0.814 6 29 2.4815 0 0.0506 0.248 7 33 2.47929 0 0.0118 0.0315 8 34 2.47929 0 0.000659 0.0183 Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance. pOpt(1,1) = Name: 'A' Value: 2 Minimum: 1 Maximum: 2 Free: 1 Scale: 0.5000 Info: [1x1 struct] pOpt(2,1) = Name: 'h' Value: 2.2441 Minimum: 1 Maximum: 3 Free: 1 Scale: 2 Info: [1x1 struct] 2x1 param.Continuous
Вызовите evalDesign
функция с оптимизированными размерностями CSTR.
dFinal = evalDesign(pOpt)
dFinal = struct with fields: F: 2.4793 costConc: 1.4506 costCoolant: 1.0287
Постройте ответ модели для оптимизированного проекта. Симулируйте модель с помощью демонстрационных значений концентрации канала. Оптимизированный проект уменьшает остаточное изменение концентрации и среднюю температуру хладагента для различных запасов канала.
sdoCSTR_plotModelResponse(pOpt,simulator,pUnc,uSmpl);
Чтобы изучить, как использовать анализ чувствительности, чтобы исследовать пробел проекта CSTR и выбрать первоначальный проект для оптимизации, см. "Оптимизацию проекта с Неопределенными Переменными (Код)".
[1] Bequette, Б.В. Просесс Динэмикс: Моделирование, Анализ и Симуляция. 1-й редактор Верхний Сэддл-Ривер, NJ: Prentice Hall, 1998.
% Close the model bdclose('sdoCSTR')