2013-02-19 3 views
2

Я пытаюсь скомпилировать следующий код Dymola:функция образца не работает на Dymola

class abc 
    import Modelica.SIunits; 
    parameter SIunits.Time delta_t=0.5; 

    constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6}; 
    Real x; 
    Integer j(start=1); 
    Integer k=size(a, 1); 

algorithm 
    when {(sample(0, delta_t) and j < k),j == 1} then 
    x := a[j]; 
    j := j + 1; 
    end when; 
end abc; 

и time = 0 переменная j начинается с 2. Но он должен начинаться с j = 1.
У кого-нибудь есть идея по этой проблеме?

+0

Вы используете вектор '{(sample (0, delta_t) и j matth

+0

@matth Нет, условие j == 1 не _become_ true в момент времени = 0, это верно, так как «j == 1 и pre (j == 1) = false». – Willi

ответ

3

Имейте в виду, что sample(x,y) означает, что образец истинно в x+i*y где i начинается с нуля. То есть sample(0, ...) становится действительным на time=0.

С j начинается с 1 и k предположительно более 1, мне не кажется неожиданным, что sample(0, delta_t) and j<k должен стать истинным в начале моделирования.

Я подозреваю, что вы хотите:

class abc 
    import Modelica.SIunits; 
    parameter SIunits.Time delta_t=0.5; 

    constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6}; 
    Real x; 
    Integer j(start=1); 
    Integer k=size(a, 1); 

algorithm 
    when {(sample(delta_t, delta_t) and j < k),j == 1} then 
    x := a[pre(j)]; 
    j := pre(j) + 1; 
    end when; 
end abc; 

Я не вижу смысла условия j==1. Это правда с самого начала, что означает, что оно не «становится» истинным тогда. И так как j никогда не уменьшается, я не понимаю, почему он должен когда-либо возвращаться к значению 1, как только он будет увеличиваться в первый раз.

Обратите внимание, что я добавил pre вокруг значений правой части для j. Если это было в разделе equation, я уверен, что потребуется pre. Поскольку это раздел algorithm, в основном для документирования намерения кода. Он также делает код надежным для перехода от equation к разделу algorithm.

+0

Обратите внимание, что x будет 0 в момент времени = [0, delta_t). Я уверен, что модельер ожидал бы этого. – Willi

+0

ok, теперь j начинается с 1 во время 0. Но в момент времени t = 0,5 значение j возвращается на 1 и начинает увеличиваться при t = 1. Вы видите курс на изображении. ! [Value_j] (https://dl.dropbox.com/u/17773229/Variable_j_falsch.PNG). – lars

1

Конечно, есть событие в момент времени = 0, вызванное выражением sample(0, delta_t) and j<k, которое становится истинным.

Но в старых версиях Dymola существует ошибка с инициализацией дискретных переменных. Например, даже если вы удалите sample(0.0, delta_t) and j<k в dymola74, j станет 2 во время = 0. Проблема заключалась в том, что предварительные значения аргументов when, где не инициализированы, правильны. Насколько я знаю, это исправляется по крайней мере, в версии FD1 2013.

Смежные вопросы