Решатель 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 рано отказывается, заключается в том, что он вызывает утверждения, а не ошибки конвергенции или событие. Вероятно, это ошибка.