Установите параметр на основе начального / начального значения переменной Continuous - PullRequest
3 голосов
/ 06 июня 2019

Задание :

  • У меня есть переменная y1, производная которой определяется по некоторому закону
    например y1 = sin(time)
    и для которой я устанавливаюначальное значение
    например, y1 = 3.0
  • У меня есть вторая переменная y2
    , которая определяется как y2 = y1 + offset
  • Теперь я хочу, чтобы это смещение было Parameter (таким образом, постоянная во время моделирования) и должна быть оценена на основе начальных / начальных значений y1 и y2
    , таких как offset = y2.start - y1.start

Код

Концептуально я хочу достичь:

model SetParametersFromInitialValues

Real y1(start = 3.0, fixed = true);
Real y2(start = 3.0, fixed = true);
parameter Real offset(fixed = false);

initial equation
  offset = y2.start - y1.start;
equation
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;

, и я подумал, что это может сработать, поскольку start должен быть атрибутом параметра встроенного типа Real, но его нельзя использовать в этомкстати.

Я тоже думал об использовании discrete вместо parameter, но я не знаю, повлияет ли это на производительность.
Однако даже в этом случае я получаю некоторые опасныепредупреждение (из-за алгебраического цикла), а именно "Не удалось символически проверить данную систему инициализации на предмет согласованности, посколькусоответствующие уравнения являются частью алгебраической петли.Это пока не поддерживается. "

model SetParametersFromInitialValues

Real y1(start = 3.0, fixed = true);
discrete Real offset(fixed = false);
Real y2(start = 5.0, fixed = true);

equation
  when initial() then
    offset = y2 - y1;
  end when;
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;

Вопросы :

  • Есть ли способ добиться того, чего я хочу, с помощью Parameter?Я вынужден использовать более переменную «переменная»?
  • требуются fixed атрибуты? Что, если значения y1 и y2 равны fixed от других компонентов? А что, если это не так?

(обратите внимание, что я думаю, что он отличается от Определить параметр модели как переменную , поскольку мне нужно оценивать параметры, основываясь конкретно на начальных значениях)

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Доступ к начальным значениям переменных осуществляется по их именам в разделе исходного уравнения.С некоторыми небольшими изменениями ваш код работает с Dymola a OpenModlica:

model SetParametersFromInitialValues
  Real y1(start=3.0, fixed=true);
  Real y2(start=2.0, fixed=true);
  final parameter Real offset(fixed=false);
equation 
  der(y1) = sin(time);
  y2 = y1 + offset;
end SetParametersFromInitialValues;

Обратите внимание, что здесь не требуется никакого раздела исходного уравнения, поскольку уравнения также действительны во время инициализации.Подробнее см. Ниже.

Подробная информация об удаленном начальном уравнении

В спецификации Modelica 3.40 записано в главе 8.6 Инициализация, начальное уравнение и начальное значение.алгоритм :

При инициализации используются все уравнения и алгоритмы, которые используются в предполагаемой операции [такой как моделирование или линеаризация].

Поскольку мы уже указали y2 = y1 + offset в разделе уравнений, это уравнение не должно быть снова объявлено в разделе начальных уравнений (offset = y2 - y1 - это то же самое уравнение, только что написанное по-другому).

Фактически, этот пример очень хорошо демонстрирует, как Modelica позволяет вам описывать модели с помощью уравнений вместо простых присваиваний.

Во время инициализации уравнение

y2 = y1 + offset

решается как

offset := y2 - y1

с использованием начальных значений y1 и y2.

Во время моделирования используется то же уравнение для вычисления

y2 := y1 + offset.

Подробная информация офиксированный атрибут

Modelica на примере дает очень хорошее объяснение фиксированного атрибута:

Фиксированный атрибут изменяет способ использования атрибута start при запускеАтрибут используется в качестве начального условия.Обычно начальный атрибут считается начальным условием «откат» и используется только в случае недостаточных начальных условий, явно указанных в разделах начального уравнения.Однако если для атрибута fixed установлено значение true, атрибут start обрабатывается так, как если бы он использовался в качестве явного начального уравнения (т. Е. Он больше не используется в качестве запасного варианта, а вместо этого рассматривается как строгое начальное условие).

Таким образом, без использования fixed = true мы можем переформулировать приведенный выше код следующим образом:

model SetParametersFromInitialValues2
  Real y1;
  Real y2;
  final parameter Real offset(fixed=false);
initial equation 
  y1 = 3;
  y2 = 1;
equation 
  der(y1) = sin(time) + 1;
  y2 = y1 + offset;
end SetParametersFromInitialValues2;
1 голос
/ 06 июня 2019

Вы можете ввести параметры для установки начальных значений, они могут выглядеть менее элегантно, тогда вычисление смещения легко, и это дает возможность установить начальные значения из диалога параметров.

model SetParametersFromInitialValues

parameter Real y1_start = 3.0;
parameter Real y2_start = 3.1;
final parameter Real offset= y2_start - y1_start;

Real y1(start = y1_start, fixed = true);
Real y2(start = y2_start, fixed = true);

equation
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;
...