exponenta event banner

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

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

Рекомендации по использованию MATLAB в качестве языка действий по событиям

Как правило, использование 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 не позволяют:

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

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

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

См. также

| | | | | | | | |

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

Подробнее