Решатель DASSL в OpenModelica и Dymola

У меня есть вопрос, касающийся обработки событий в OpenModelica и Dymola. Следующая модель ограничивает входной сигнал определенным порогом. Это необходимо, чтобы избежать отрицательного аргумента log(). Для этого создается событие, и переменная аргумента 'l' изменяется, когда событие становится истинным.

Насколько я понял, решатель DASSL должен распознать событие и автоматически адаптировать его размер шага для правильного разрешения события. Заданное количество интервалов используется только для определения количества точек, сохраненных на выходе.

Решение модели "CompleteModel" с помощью DASSL в Dymola в течение 10 секунд и с количеством интервалов 100 работает нормально, а переменная "l" ограничена 0,05. Решение модели только с 10 интервалами не удается. Как ни странно, DASSL в OpenModelica решает модель правильно, независимо от заданного количества интервалов.

Можно ли ожидать такого поведения? Есть большие различия между решателями DASSL Dymola и OpenModelica? На мой взгляд, правильное решение модели с DASSL должно быть независимым от количества (сохраненных) интервалов (как в OpenModelica).

package EventHandling

 model LimitSignal
  Real l;
  Real lmin(start = 1, fixed = true);
  Real x;
  Boolean Event(start = false, fixed = true);
  input Real InputSignal;
 algorithm 
  when InputSignal <= 0.05 then
   Event := true;
   lmin := pre(InputSignal);
  end when;
 equation 
  l = if Event then lmin else InputSignal;
  x = log(l);
 end LimitSignal;

 model RampSignal
  parameter Real start = 1;
  parameter Real height = 2;
  parameter Real Time = 10;
  output Real y;
 equation 
  y = 1 - (height/Time)*time;
 end RampSignal;

 model CompleteModel
  LimitSignal EventHandling(InputSignal = Signal.y);
  RampSignal Signal;
 end CompleteModel;

end EventHandling;

1 ответ

Решение

Решатели DASSL разные. OpenModelica имеет множество различных решателей DASSL, поэтому даже OpenModelica отличается от самого себя. Код dassl OpenModelica основан на daskr (ранее это был ddasl). Опции включают в себя такие вещи, как:

dasslJacobian=[coloredNumerical (default)|numerical|internalNumerical|coloredSymbolical|symbolical]
dasslnoRootFinding
dasslnoRestart
maxStepSize
maxIntegrationOrder

Обработка событий выполняется отдельно от числового интегратора, поэтому она также выполняется по-разному в разных инструментах. OpenModelica также ведет себя по-разному, если вы изменяете выходной интервал, потому что он используется в качестве эвристики для определения некоторого номинального размера шага / значений эпсилона / и т. Д.

Но да, вы должны быть в состоянии получить правильное решение с помощью решателя с переменным шагом.

Примечание: я пробовал это в OpenModelica и stopTime=10, numberOfIntervals=10 также терпит неудачу с dassl там. Он просто отображает значение до момента подтверждения. Таким образом, он достигает времени =4,5, пытается перейти к времени =5,0 (триггеры подтверждения), пытается время =6,0 (триггеры подтверждения), пытается время =5,25 (триггеры подтверждения), сдается. Причина, по которой OpenModelica рано отказывается, заключается в том, что он вызывает утверждения, а не ошибки конвергенции или событие. Вероятно, это ошибка.

Другие вопросы по тегам