Можно писать действия SimEvents ®, используя:
Код MATLAB ® - используйте MATLAB. Сведения о руководстве по использованию кода MATLAB в качестве языка действий с событиями см. в разделе Руководство по использованию MATLAB в качестве языка действий с событиями.
Функции Simulink ® - используйте блок функции Simulink. Блок Simulink Function не принимает объекты в качестве входных данных.
Как правило, использование MATLAB в качестве языка действий события SimEvents соответствует тем же правилам, что и использование MATLAB в блоке функции MATLAB.
Включить префикс типа для идентификаторов перечисляемых значений - идентификатор TrafficColors.Red является действительным, но Red не является.
Использовать формат MATLAB для комментариев - Использовать % для указания комментариев для согласования с MATLAB. Например, допустим следующий комментарий:
% This is a valid comment in the style of MATLABИспользовать индексирование по одному для векторов и матриц - индексирование по одному соответствует синтаксису MATLAB.
Используйте круглые скобки вместо скобок для индексирования на векторы и матрицы - Эта инструкция действительна:
a(2,5) = 0;
Недопустимый оператор:
a[2][5] = 0;
Рекомендации по постоянным переменным:
Управление состояниями, не входящими в структуру сущности, с помощью постоянных переменных MATLAB.
Постоянные переменные, определенные в любом действии события блока, определяются только этим действием.
Блок может совместно использовать постоянные переменные во всех действиях события, управляя им в функции MATLAB на пути (который вызывается из действий события).
Два разных блока не могут совместно использовать одну и ту же постоянную переменную.
Назначение начального значения локальным и выходным данным - при использовании MATLAB в качестве языка действий считывание данных без начального значения приводит к ошибке.
Не используйте параметры массива ячеек типа данных.
Можно создавать случайные числа с помощью различных распределений. Существует два подхода моделирования для использования начальных чисел во время генерации случайных чисел.
Для инициализации уникальных начальных значений для каждого блока в модели можно использовать постоянные переменные.
Вы можете использовать coder.extrinsic() функция для создания начальных значений без постоянных переменных.
Чтобы создать эти случайные распределения, используйте код в столбце Использование (Usage) этой таблицы в блоках SimEvents, которые поддерживают действия события или действия времени между поколениями.
| Распределение | Параметры | Использование | Требуется продукт Toolbox™ статистики и машинного обучения |
|---|---|---|---|
Показательный | Среднее (м) |
-m * log(1-rand) | Нет |
Униформа | Минимум (м) Максимум (М) |
m + (M-m) * rand | Нет |
Бернуллиевый | Вероятность выхода 1 (P) |
binornd(1,P) | Да |
Двучлен | Вероятность успеха в одном испытании (P) Число судебных разбирательств (N) |
binornd(N,P) | Да |
Треугольный | Минимум (м) Максимум (М) Режим (режим) |
persistent pd
if isempty(pd)
pd = makedist('Triangular',...
'a',m,'b',mode,'c',M)
end
random(pd)
| Да |
Гамма | Пороговое значение (T) Шкала (a) Форма (b) |
gamrnd(b,a) | Да |
Гауссов (нормальный) | Среднее (м) Стандартное отклонение (d) |
m + d*randn | Нет |
Геометрический | Вероятность успеха в одном испытании (P) |
geornd(P) | Да |
Пуассон | Среднее (м) |
poissrnd(m) | Да |
Логарифмически нормальный | Пороговое значение (T) Му (му) Сигма (S) |
T + lognrnd(mu,S) | Да |
Логистика журнала | Пороговое значение (T) Шкала (a) |
persistent pd
if isempty(pd)
pd = makedist('Loglogistic',...
'mu',m,'sigma',S);
end
random(pd)
| Да |
Бета | Минимум (м) Максимум (М) Параметр формы a (a) Параметр формы b (b) |
betarnd(a,b) | Да |
Дискретная однородность | Минимум (м) Максимум (М) Количество значений (N) |
persistent V P
if isempty(V)
step = (M-m)/N;
V = m : step : M;
P = 0 : 1/N : N;
end
r = rand;
idx = find(r < P, 1);
V(idx)
| Нет |
Weibull | Пороговое значение (T) Шкала (a) Форма (b) |
T + wblrnd(a,b) | Да |
Произвольный непрерывный | Вектор значения (V) Вектор кумулятивной вероятностной функции (P) |
r = rand;
if r == 0
val = V(1);
else
idx = find(r < P,1);
val = V(idx-1) + ...
(V(idx)-V(idx-1))*(r-P(idx-1));
end
| Нет |
Произвольный дискретный | Вектор значения (V) Вектор вероятности (P) |
r = rand; idx = find(r < cumsum(P),1); V(idx) | Нет |
Пример см. в разделе Моделирование пересечений трафика как сети очередей.
Если требуется дополнительное распределение случайных чисел, см. раздел Статистика и инструментарий машинного обучения.
Чтобы создать случайные числа, инициализируйте уникальное начальное число для каждого блока в модели. При использовании статистического шаблона можно вручную изменить начальное значение на уникальное значение для каждого блока, чтобы создать независимые выборки из распределений.
Чтобы сбрасывать начальное значение при каждом запуске моделирования, используйте код MATLAB для инициализации постоянной переменной в действиях события, например:
persistent init if isempty(init) rng(12234); init=true; end
Вот пример кода. Вектору значений присваивается значение FinalStop:
% Set the initial seed. persistent init if isempty(init) rng(12234); init=true; end % Create random variable, x. x=rand(); % % Assign values within the appropriate range % using the cumulative probability vector. if x < 0.3 entity.FinalStop = 2; elseif x >= 0.3 && x< 0.6 entity.FinalStop = 3; elseif x >= 0.6 && x< 0.7 entity.FinalStop = 4; elseif x >= 0.7 && x< 0.9 entity.FinalStop = 5; else entity.FinalStop = 6; end
В некоторых сценариях случайные числа генерируются без использования постоянных переменных. В этом случае используйте coder.extrinsic() чтобы убедиться, что SimEvents использует функцию в MATLAB, а начальное число определено в базовом рабочем пространстве MATLAB. Это может привести к снижению производительности моделирования.
Рассмотрим этот код в качестве примера.
% Random number generation coder.extrinsic('rand'); value = 1; value = rand(); % Pattern: Exponential distribution mu = 0.5; dt = -1/mu * log(1 - value);
Выходом внешней функции является mxArray. Чтобы преобразовать его в известный тип, переменная val = 1 объявляется для установки его типа double и rand назначается этой переменной val=rand. Сведения о внешних функциях см. в разделе Работа с mxArrays.
Пример см. в разделе Моделирование пересечений трафика как сети очередей.
В действии события можно обратиться к следующим параметрам:
Параметры маски, определяемые с помощью панели «Параметры редактора масок».
Любая переменная, определенная в рабочем пространстве (например, базовое рабочее пространство или рабочее пространство модели).
Параметры, определяемые с помощью Simulink.Parameter объект.
Примечание
Действия SimEvents не позволяют:
Изменение параметров из действия события.
Настройка параметров во время моделирования.
Действия события не поддерживаются строковым типом данных сущности.
Генератор объектов | Очередь сущностей | Репликатор сущностей | Сервер сущностей | Терминатор объекта | Функция MATLAB | Очередь получения многоадресной рассылки | Приобретатель ресурсов | Функция симулятора | Simulink.Parameter