Языки действия события и генерация случайных чисел

Можно записать использование действий SimEvents®:

Инструкции для Использования MATLAB как язык действия события

В целом с помощью MATLAB, когда язык действия события SimEvents следует тем же правилам как использование MATLAB в блоке MATLAB function.

  • Включайте префикс типа для идентификаторов перечисляемых значений — идентификатор, 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 как язык действия, чтение данных без начального значения вызывает ошибку.

  • Не используйте параметры, которые имеют массив ячеек типа данных.

Сгенерируйте случайные числа с действиями события

Можно сгенерировать случайные числа с помощью различных дистрибутивов. Существует два подхода моделирования, чтобы использовать seed во время генерации случайных чисел.

  • Можно использовать персистентные переменные для инициализации уникальных seed для каждого блока в модели.

  • Можно использовать функцию coder.extrinsic(), чтобы сгенерировать seed без персистентных переменных.

Чтобы сгенерировать эти случайные распределения, используйте код в столбце Usage этой таблицы в блоках SimEvents, которые поддерживают действия события или действия времени межгенерации.

РаспределениеПараметрыИспользованиеТребует продукта Statistics and Machine Learning Toolbox™

Экспоненциал

Среднее значение (m)

-m * log(1-rand)

Нет

Универсальная форма

Минимум (m)

Максимум (M)

m + (M-m) * rand

Нет

Бернулли

Вероятность для вывода, чтобы быть 1 (P)

binornd(1,P)

Да

Бином

Вероятность успеха в одном испытании (P)

Количество испытаний (N)

binornd(N,P)

Да

Треугольный

Минимум (m)

Максимум (M)

Режим (режим)

persistent pd
if isempty(pd)
    pd = makedist('Triangular',...
    'a',m,'b',mode,'c',M)
end
random(pd)

Да

\Gamma

Порог (T)

Масштабируйтесь (a)

Сформируйте (b)

gamrnd(b,a)

Да

Гауссов (нормальный)

Среднее значение (m)

Стандартное отклонение (d)

m + d*randn

Нет

Геометрический

Вероятность успеха в одном испытании (P)

geornd(P)

Да

Пуассон

Среднее значение (m)

poissrnd(m)

Да

Логарифмически нормальный

Порог (T)

Му (mu)

Сигма (S)

T + lognrnd(mu,S)

Да

Логистический журналом

Порог (T)

Масштабируйтесь (a)

persistent pd
if isempty(pd)
    pd = makedist('Loglogistic',...
    'mu',m,'sigma',S);
end
random(pd)

Да

\beta

Минимум (m)

Максимум (M)

Сформируйте параметр (a)

Сформируйте параметр b (b)

betarnd(a,b)

Да

Дискретная универсальная форма

Минимум (m)

Максимум (M)

Количество значений (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)

Нет

Для примера смотрите Образцовые Пересечения Трафика как Сеть Постановки в очередь.

Если вам нужны дополнительные дистрибутивы случайных чисел, см. Statistics and Machine Learning Toolbox.

Распределение случайных чисел с персистентными переменными

Чтобы сгенерировать случайные числа, инициализируйте уникальный seed для каждого блока в вашей модели. Если вы используете статистический шаблон, можно вручную изменить начальный seed на уникальное значение для каждого блока, чтобы сгенерировать независимые выборки от дистрибутивов.

Чтобы сбросить начальное значение seed каждый раз, симуляция запускается, используйте код 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, и seed задан в базовом рабочем пространстве 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, как объявляют, устанавливает свой тип удваиваться, и rand присвоен той переменной val=rand. Для получения информации о внешних функциях смотрите Работу с mxArrays (Simulink).

Для примера смотрите Образцовые Пересечения Трафика как Сеть Постановки в очередь.

Параметры в действиях события

Из действия события можно обратиться к этим параметрам:

  • Специфичные для маски параметры вы задаете использование Редактора Маски панель Parameters.

  • Любая переменная вы задаете в рабочей области (такой как базовое рабочее пространство или рабочее пространство модели).

  • Параметры вы задаете использование объекта Simulink.Parameter.

Примечание

С действиями SimEvents вы не можете:

  • Измените параметры из действия события.

  • Настройки параметров во время симуляции.

  • Действия события не поддержаны с типом данных сущности строки.

Смотрите также

| | | | | | | | |

Связанные примеры

Больше о