Спроектируйте оптимизацию с неопределенными переменными (код)

В этом примере показано, как оптимизировать проект, когда существуют неопределенные переменные. Вы оптимизируете размерности Постоянно реактора смесителя (CSTR), чтобы минимизировать изменение концентрации продукта и стоимость изготовления в случае варьирования, или сомнительный, запас канала.

Модель Постоянно реактора смесителя (CSTR)

Постоянно Реакторы Смесителя (CSTRs) распространены в перерабатывающей промышленности. Модель Simulink, sdoCSTR, моделирует покрытое кожухом диабатическое (т.е. неадиабатическая) реактор бака, описанный в [1]. CSTR принят, чтобы быть отлично смешанным с одной экзотермической и необратимой реакцией первого порядка$A\rightarrow B$.$A$, реагент, преобразован в$B$, продукт.

В этом примере вы используете следующую модель CSTR с двумя состояниями, которая использует основные принципы учета и энергосбережения:

$$\frac{d C_A}{dt} = \frac{F}{A * h}(C_{feed} - C_A)-r*C_A$$

$$\frac{d T}{dt} = \frac{F}{A * h}(T_{feed} - T) - \frac{H}{c_p \rho} r
-\frac{U}{c_p*\rho*h}(T - T_{cool})$$

$$r = k_0*e^{\frac{-E}{R*T}}$$

  • $C_A$, и$C_{feed}$ - Концентрации в CSTR и в канале [kgmol/m^3]

  • $T$$T_{feed}$, и$T_{cool}$ - CSTR, канал и температуры хладагента [K]

  • $F$ и$\rho$ - Объемный расход [м^3/ч] и плотность материала в CSTR [1/м^3]

  • $h$ и$A$ - Высота [m] и нагретая площадь поперечного сечения [м^2] CSTR.

  • $k_0$ - Предэкспоненциальный нетепловой фактор для$A\rightarrow B$ [1/h] реакции

  • $E$ и$H$ - Энергия активации и тепло реакции для$A\rightarrow B$ [kcal/kgmol]

  • $R$ - Газовая константа Больцманна [kcal / (kgmol * K)]

  • $c_p$ и$U$ - Теплоемкость [kcal/K] и коэффициенты теплопередачи [kcal / (м^2 * K * h)]

Откройте модель Simulink.

open_system('sdoCSTR');

Модель включает каскадный ПИД-регулятор в Controller подсистема. Контроллер регулирует реакторную температуру $T$и реакторную остаточную концентрацию$C_A$.

Проблема проектирования CSTR

Примите, что CSTR является цилиндрическим с хладагентом, к которому применяются основа цилиндра. Настройте площадь поперечного сечения CSTR $A$и высоту CSTR$h$, чтобы удовлетворить следующим целям проекта:

  • Минимизируйте изменение остаточной концентрации$C_A$. Изменения остаточной концентрации негативно влияют на качество продукта CSTR. Минимизация изменений также улучшает прибыль CSTR.

  • Минимизируйте среднюю температуру хладагента$T_{cool}$. Нагревание или охлаждение температуры хладагента конверта являются дорогими. Минимизация средней температуры хладагента улучшает прибыль CSTR.

Проект должен допускать изменения в качестве концентрации канала предоставления $C_{feed}$и питать температуру$T_{feed}$. CSTR питается каналом от различных поставщиков. Качество канала отличается от поставщика поставщику и также варьируется в каждом пакете предоставления.

Задайте переменные проекта

Выберите следующие параметры модели как переменные проекта для оптимизации:

  • Цилиндрическая площадь поперечного сечения $A$

  • Цилиндрическая высота $h$

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 30-Jan-2020 02:10:51

                               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')