То, что происходит в вашей модели, называется болтовня .Это означает, что происходят очень частые события.
В конкретном случае это вызвано условием T <73 в сочетании с определениями производных.Позвольте мне объяснить, что происходит с предоставленной вами моделью: </p>
- Температура поднимается до 73
- Затем температура начинает падать, потому что условие в выражении ifповороты падают
- Это вызывает немедленное изменение оператора if в true, вызывая повышение температуры
- Это приводит к тому, что оператор if снова изменяется в false, вызывая падение температуры
- goto 3.
Это приводит к изменению условия T <73 с очень высокой частотой, что, в свою очередь, создает много событий, которые должны обрабатываться решателем.Это делает прогресс во времени очень небольшим (то, что вы называете «симуляция останавливается»). </p>
Есть несколько способов решить эту проблему.Одним из них является добавление гистерезиса к модели.Я сделал это в коде ниже.Для описания гистерезисной части я использовал код из Modelica.Blocks.Logical.Hysteresis
.Это изменит логическую переменную upperLimit
(которая заменяет T<73
), только если температура станет выше T_high
и ниже T_low
.Я выбрал это решение, так как оно кажется разумным для термостата.
model thermostat1
parameter Real T0=10;
parameter Real T_High=74;
parameter Real T_Low=72;
Boolean upperLimit "Output of hysteresis block";
Real T(start=T0);
equation
upperLimit =not pre(upperLimit) and T > T_High or pre(upperLimit) and T >= T_Low;
if upperLimit then
der(T)=-T+50;
else
der(T)=-T+80;
end if;
end thermostat1;
Результат моделирования выглядит следующим образом:
Более общая информация может бытьнапример, в http://book.xogeny.com/behavior/discrete/decay/