Modelica дискретная семантика

Я пытаюсь понять семантику Modelica для дискретного сигнала. Дан шаговый сигнал, который мгновенно переходит от 0.0 к 1.0 с бесконечным наклоном при t = 0.5 Тогда, скажем, у вас также есть оператор when, как в следующем коде:

model test_discrete
  Modelica.Blocks.Interfaces.RealOutput q(start = -1.0);
  Modelica.Blocks.Sources.Step step(
    height=1,
    offset=0,
    startTime=0.5)

algorithm 
  when time >= 0.5 and time <= 0.5 then
    q := step.y;
  end when;
equation 
end test_discrete;

У меня вопрос, будет ли д будет 0,0 или 1,0? Предположим, что q инициализирован в -1. Когда я реализую код, он переходит на 1.0, но я путаюсь с тем, что 0.0 также удовлетворит уравнение. Поэтому мне просто интересно, существуют ли какие-либо правила, предотвращающие недетерминированное поведение. Если бы кто-то мог помочь или указать мне какую-либо литературу, это было бы очень ценно! Спасибо за ваше время.

2 ответа

Решение

Ну и несколько комментариев. Во-первых, ваш код недетерминирован. Нет никаких гарантий относительно порядка событий, которые каким-то образом не связаны друг с другом через общую "причину". В Modelica 3.3 есть функции, позволяющие сделать вашу систему синхронной (что устраняет неоднозначности). Но вам придется прочитать спецификацию для этого.

Но я также хотел бы указать, что по сути является ошибкой в ​​вашем коде. Ты говоришь:

when time >= 0.5 and time <= 0.5 then
  q := step.y;
end when;

Я предполагаю, что вы пытаетесь установить значение q в тот же "момент", что step.y устанавливается (а затем еще интересует, что решается первым). Но это не так, как when Заявление работает. Я подозреваю, что вы пытаетесь представить "момент", который step.y устанавливается как time >= 0.5 and time <= 0.5, Но это не правильно. Момент, когда это установлено time >= 0.5 в одиночестве. Ключевым моментом здесь является when это не то же самое, что if,

Чтобы выразить это более формально, уравнение внутри предложения when становится активным, когда условие, связанное с when пункт становится правдой. Это действительно выходит за рамки вашего вопроса, но вы должны ознакомиться с различиями между when а также ifпотому что это очень важная семантика.

Мой инстинкт подсказывает мне, что вам может понадобиться pre() для условий, но это только мое предположение.

Другие вопросы по тегам