Функция образца не работает на 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.
У кого-нибудь есть идеи по этой проблеме?


person lars    schedule 19.02.2013    source источник
comment
Вы используете вектор {(sample(0, delta_t) and j<k), j==1} как условие для уравнения когда. Две строки кода внутри вашего уравнения «когда» становятся активными в тот момент, когда одно из двух условий в вашем векторе становится истинным. В time=0 условие j==1 становится истинным, и код выполняется в тот же момент.   -  person matth    schedule 19.02.2013
comment
@matth Нет, условие j==1 не становится истинным в момент времени=0, оно верно, поскольку j==1 и pre(j==1) = false.   -  person Willi    schedule 19.02.2013


Ответы (2)


Имейте в виду, что 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.

person Michael Tiller    schedule 19.02.2013
comment
Обратите внимание, что x будет равен 0 в момент времени = [0, delta_t). Я уверен, если бы модельер ожидал этого. - person Willi; 19.02.2013
comment
хорошо, теперь j начинается с 1 в момент времени 0. Но в момент времени t = 0,5 значение j возвращается к 1 и начинает увеличиваться в момент времени t=1. Курс вы видите на картинке. !Value_j. - person lars; 19.02.2013

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

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

person Willi    schedule 19.02.2013