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() для условий, но это только мое предположение.