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

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

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

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

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

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

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

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

РаспределениеПараметрыИспользованиеТребуется Statistics and Machine Learning 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)

Шкала (а)

Форма (b)

gamrnd(b,a)

Да

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

Среднее (м)

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

m + d*randn

Нет

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

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

geornd(P)

Да

Пуассон

Среднее (м)

poissrnd(m)

Да

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

Порог (T)

Му (му)

Сигма (S)

T + lognrnd(mu,S)

Да

Логарифмическая логистика

Порог (T)

Шкала (а)

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)

Шкала (а)

Форма (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 для каждого блока в вашей модели. Если вы используете статистический шаблон, можно вручную изменить начальное начальное значение на уникальное значение для каждого блока, чтобы сгенерировать независимые выборки из распределений.

Чтобы сбросить начальное начальное значение каждый раз, когда симуляция начинается, используйте код 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 задан seed. Это может привести к снижению эффективности в симуляции.

Рассмотрим этот код как пример.

% 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».

Для получения примера смотрите Моделирование пересечений трафика как сети очереди.

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

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

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

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

  • Параметры, которые вы определяете с помощью Simulink.Parameter объект.

Примечание

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

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

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

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

См. также

| | | | | | | | |

Похожие примеры

Подробнее о