Метод класса Modelica

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

optimization Moo(objective=-x(finalTime), startTime = 0, finalTime = 12)
  parameter Real e = 0.05;

  Real x(start=2, fixed=true, min=0, max=100);

  input Real v (min=0, max=1);

  function omega
    input  Real t;
    output Real y;
  algorithm
    y := e;
  end omega;

equation
  der(x) = v*omega(time);
constraint
  v<=1;
end Moo;

Я бы хотел, чтобы переменная e в функции omega была переменной, чтобы я мог легко изменить ее значение в более поздний момент времени, когда я выполняю поиск параметров. К сожалению, функция omega, похоже, не знает о переменной e, и компилятор JModelica возвращает ошибку:

Не удается найти объявление класса или компонента для e

Я наивно ожидал, что, поскольку omega и e принадлежат к одному классу, omega сможет видеть e.

Есть ли способ добиться этого?


person Richard    schedule 03.09.2015    source источник


Ответы (2)


Функции-члены не поддерживаются в Modelica, поэтому функция, объявленная внутри модели, действует как автономная функция, не имея доступа к окружающим переменным модели. Функции-члены не разрешены, потому что функции должны быть чистыми, т.е. они не могут иметь побочных эффектов. Это фундаментальное предположение в Modelica, которое позволяет инструменту применять символическое преобразование и переупорядочивать вычисления.

person jWindahl    schedule 06.10.2015
comment
Возможный обходной путь - изменить функцию на блок, добавить к нему параметр, создать экземпляр блока и распространить e на новый параметр, а затем сослаться на blockInstance.y в уравнении. - person jWindahl; 07.10.2015

У вас может быть что-то вроде функции-члена, если вы явно передадите необходимые переменные в качестве дополнительных входных данных в функцию. См. Этот пример:

package MemberFunction
  
  model A
    Real x=1;
    function get_x = MemberFunction.get(u=x);
  end A;

  function get
    input Real u;
    output Real y;
  algorithm 
    y := u;
  end get;

  model Test
      A a;
      Real x;
  equation 
    x = a.get_x();
  end Test;

end MemberFunction;

person Manuel    schedule 31.08.2020