Этот пример показывает, как задать пользовательскую целевую функцию для сигнала модели. Вы вычисляете значение целевой функции с помощью переменной, которая моделирует неопределенность параметра.
Модель Simulink sdoPopulation
моделирует простую экологию двух организмов, используя конкурентные уравнения Лоток-Вольтерра:
- население размер n-го организма.
- характерные для каждого организма темпы роста на душу населения.
- конкурентная задержка для каждого организма.
- грузоподъемность окружения организма.
близость двух населений и то, насколько сильно они влияют друг на друга.
В модели используются нормированные модули.
Откройте модель.
open_system('sdoPopulation')
Двумерный сигнал, P
, моделирует размеры населения для P1
(первый элемент) и P2
(второй элемент). Модель первоначально сконфигурирована с одним организмом, P1
, доминируя в экологии. The Population
возможности показывают P1
население, колеблющаяся между высокими и низкими значениями, в то время как P2
является постоянным в 0,1. The Population Phase Portrait
блок показывает размеры населения двух организмов относительно друг друга.
Настройте значения, и, чтобы соответствовать следующим проектным требованиям:
Минимизируйте область значений населений, то есть максимальное различие между P1
и P2
.
Стабилизируйте P1
и P2
, то есть убедитесь, что ни одно население организма не отмирает или не растет чрезвычайно большой.
Необходимо настроить параметры для различных значений грузоподъемности,. Это обеспечивает робастность к неопределенности пропускной способности окружения.
Дважды кликните Open Optimization Tool
блокируйте в модели, чтобы открыть предварительно сконфигурированный сеанс Response Optimizer. Сеанс задает следующие переменные:
DesignVars
- Проект переменных для параметров, и модели.
K_unc
- Неопределенный параметр, моделирующий грузоподъемность окружения организма (). K_unc
задает номинальное значение и два выборочных значения.
P1
и P2
- Зарегистрированные сигналы, представляющие населениям двух организмов.
Задайте пользовательское требование, чтобы минимизировать максимальное различие между двумя размерами населения. Примените это требование к P1
и P2
моделировать сигналы.
Откройте диалоговое окно «Создание требования». В списке Создать выберите Пользовательское требование.
В диалоговом окне «Создание требования» задайте следующее:
Имя - Введите PopulationRange
.
Тип - Выберите Минимизировать выход функции из списка.
Функция - Введите @sdoPopulation_PopRange
. Для получения дополнительной информации об этой функции см. Раздел «Детали пользовательской целевой функции сигнала».
Выберите сигналы и системы для ограничения (необязательно) - выберите P1
и P2
флажки.
3. Нажмите кнопку ОК.
Новая переменная, PopulationRange
, появляется в браузере Response Optimizer.
PopulationRange
использует sdoPopulation_PopRange
функция. Эта функция вычисляет максимальное различие между населениями для различных значений пропускной способности окружения. Путем минимизации этого значения можно достичь обеих целей проекта. Функция вызывается оптимизатором на каждом шаге итерации.
Чтобы просмотреть функцию, введите edit sdoPopulation_PopRange
. Ниже рассматриваются детали этой функции.
Ввод/вывод
Функция принимает data
, структура со следующими полями:
DesignVars
- Значения Current iteration, и.
Nominal
- Записанные данные сигнала, полученные путем симуляции модели с помощью значений параметров, заданных data.DesignVars
и номинальные значения для всех других параметров. The Nominal
поле само по себе является структурой с полями для каждого записанного сигнала. Имена полей являются именами зарегистрированных сигналов. Пользовательское требование использует записанные сигналы, P1
и P2
. Поэтому data.Nominal.P1
и data.Nominal.P2
являются ли объекты timeseries соответствующими P1
и P2
.
Uncertain
- Записанные данные сигнала, полученные путем симуляции модели с использованием выборки значений неопределенной переменной K_unc
. The 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
.
Нажмите «Оптимизировать».
Оптимизация сходится после ряда итераций.
The P1,P2
график показывает динамику населения, с первым населением организма в синем и вторым населением организма в красном цвете. Пунктирные линии указывают динамику населения для различных значений емкости окружения. The PopulationRange
график показывает, что максимальное различие между двумя населениями организма уменьшается с течением времени.
The Population Phase Portrait
блок показывает населения, первоначально изменяющуюся, но в конечном счете они сходятся к стабильным размерам населения.
% Close the model bdclose('sdoPopulation')