В этом примере показано, как задать пользовательскую целевую функцию для сигнала модели. Вы вычисляете значение целевой функции с помощью переменной та неопределенность параметра моделей.
Модель Simulink sdoPopulation
моделирует простую экологию 2D организма с помощью конкурентоспособных уравнений Lotka-Volterra:
численность населения энного организма.
свойственный темп роста на душу населения каждого организма.
конкурентоспособная задержка каждого организма.
пропускная способность среды организма.
близость этих двух популяций и как строго они влияют друг на друга.
Модель использует нормированные единицы.
Откройте модель.
open_system('sdoPopulation')
Двумерный сигнал, P
, моделирует численности населения для P1
(первый элемент) и P2
(второй элемент). Модель первоначально сконфигурирована с одним организмом, P1
, доминирование над экологией. Population
определите объем показывает P1
население, колеблющееся между высокими и низкими значениями, в то время как P2
является постоянным в 0,1. Population Phase Portrait
блокируйтесь показывает численности населения этих двух организмов друг относительно друга.
Настройтесь, и значения, чтобы соответствовать следующим конструктивным требованиям:
Минимизируйте область значений населения, то есть, максимальную разницу между P1
и P2
.
Стабилизируйте P1
и P2
, то есть, гарантируйте, что никакое население организма не вымирает или становится чрезвычайно многочисленным.
Необходимо настроить параметры для различных значений пропускной способности. Это гарантирует робастность неопределенности пропускной способности среды.
Дважды кликните Open Optimization Tool
блокируйтесь в модели, чтобы открыть предварительно сконфигурированный сеанс Response Optimizer. Сеанс задает следующие переменные:
DesignVars
- Спроектируйте набор переменных для, и параметры модели.
K_unc
- Неопределенный параметр, моделируя пропускную способность среды организма (). K_unc
задает номинальную стоимость и два демонстрационных значения.
P1
и P2
- Регистрируемые сигналы, представляющие популяции этих двух организмов.
Задайте пользовательское требование, чтобы минимизировать максимальную разницу между этими двумя численностями населения. Примените это требование к P1
и P2
сигналы модели.
Откройте диалоговое окно Create Requirement. В Новом списке выберите Custom Requirement.
Задайте следующее в диалоговом окне Create Requirement:
Имя - вводит PopulationRange
.
Введите - Выбирают Minimize функциональный выход из списка.
Функция - вводит @sdoPopulation_PopRange
. Для получения дополнительной информации об этой функции, смотрите Пользовательские Детали Целевой функции Сигнала.
Выберите Signals, и Systems to Bound (Необязательно) - выбирают P1
и P2
флажки.
3. Нажать ОК.
Новая переменная, PopulationRange
, появляется в браузере Response Optimizer.
PopulationRange
использует sdoPopulation_PopRange
функция. Эта функция вычисляет максимальную разницу между популяциями через различные значения пропускной способности среды. Путем минимизации этого значения можно достигнуть обоих голов проекта. Функция вызвана оптимизатором на каждом шаге итерации.
Чтобы просмотреть функцию, введите edit sdoPopulation_PopRange
. Следующее обсуждает детали этой функции.
Ввод/вывод
Функция принимает data
, структура со следующими полями:
DesignVars
- Значения Current iteration, и.
Nominal
- Регистрируемые данные сигнала, полученные путем симуляции модели с помощью значений параметров, заданы data.DesignVars
и номинальная стоимость для всех других параметров. Nominal
поле является самостоятельно структурой с полями для каждого регистрируемого сигнала. Имена полей являются регистрируемыми именами сигнала. Пользовательское требование использует регистрируемые сигналы, P1
и P2
. Поэтому data.Nominal.P1
и data.Nominal.P2
объекты timeseries, соответствующие P1
и P2
.
Uncertain
- Регистрируемые данные сигнала, полученные путем симуляции модели с помощью демонстрационных значений неопределенной переменной K_unc
. Uncertain
поле является вектором из N
структуры, где N
количество демонстрационных значений, заданных для K_unc
. Каждый элемент этого вектора похож на data.Nominal
и содержит результаты симуляции, полученные из соответствующего демонстрационного значения, заданного для K_unc
.
Функция возвращает максимальную разницу между численностями населения через различные пропускные способности. Следующий фрагмент кода в функции выполняет это действие:
val = max(maxP(1)-minP(2),maxP(2)-minP(1));
Область значений времени данных
При вычислении целей проекта отбросьте данные о росте начальной генеральной совокупности, чтобы устранить смещения из начального условия. Следующий фрагмент кода в функции выполняет это действие:
%Get the population data tMin = 5; %Ignore signal values prior to this time iTime = data.Nominal.P1.Time > tMin; sigData = [data.Nominal.P1.Data(iTime), data.Nominal.P2.Data(iTime)];
iTime
представляет временной интервал интереса и столбцы sigData
содержите P1
и P2
данные для этого интервала.
Оптимизация для различных значений пропускной способности
Функция включает эффекты варьирования пропускной способности путем итерации через элементы data.Uncertain
. Следующий фрагмент кода в функции выполняет это действие:
... for ct=1:numel(data.Uncertain) iTime = data.Uncertain(ct).P1.Time > tMin; sigData = [data.Uncertain(ct).P1.Data(iTime), data.Uncertain(ct).P2.Data(iTime)];
maxP = max([maxP; max(sigData)]); %Update maximum if new signals are bigger minP = min([minP; min(sigData)]); %Update minimum if new signals are smaller end ...
Максимальные и минимальные популяции получены через все симуляции, содержавшиеся в data.Uncertain
.
Нажмите Optimize.
Оптимизация сходится после многих итераций.
P1,P2
постройте показывает демографическую динамику, с первым населением организма в синем и вторым населением организма в красном. Пунктирные линии указывают на демографическую динамику для различных полных значений среды. PopulationRange
постройте показывает, что максимальная разница между двумя популяциями организма уменьшает в зависимости от времени.
Population Phase Portrait
блокируйтесь показывает популяции, первоначально варьирующиеся, но они в конечном счете сходятся к устойчивым численностям населения.
% Close the model bdclose('sdoPopulation')