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

Можно записать использование действий 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 вы не можете:

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

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

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

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

| | | | | | | | |

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

Больше о