Использование оператора if для защиты div by 0 в Modelica - PullRequest
0 голосов
/ 26 ноября 2018

Я сделал простую модель теплового насоса, который использует данные датчика для вычисления его COP.

, в то время как COP = тепло / мощность

иногда нет питания, поэтому система выполняет (не может делить на ноль).Я хотел бы, чтобы эти значения были просто равны нулю.Поэтому я попробовал IF-оператор if-Statement .если power (u) = 0, то COP (y) = 0. почему-то это не работает (см. время 8) Выход COP + данные .Кто-нибудь, кто, кажется, замечает проблему?

редактировать (все еще проблемы во время 8.1 output2.o textview 2.0 редактировать (тепло и мощность) heat/power/COP

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Чтобы сделать вычисления немного более применимыми (например, может измениться знак мощности), взгляните на код ниже.Также может быть хорошей идеей построить из нее функцию (для функции операторы noEvent () - можно не указывать) ...

model DivNoZeroExample
      parameter Real eps = 1e-6 "Smallest number to be used as divisor";
      Real power = 0.5-time "Some artificial value for power";
      Real heat = 1 "Some artificial value for heat";
      Real COP "To be computed";

equation 
    if noEvent(abs(power) < abs(eps)) then
        COP =  if noEvent(power>= 0) then heat/eps else heat/(-eps);
    else
        COP =  heat/power;
    end if;
end DivNoZeroExample;
0 голосов
/ 26 ноября 2018

Реляционные операции работают несколько иначе в Modelica.

Если вы замените if u>0 на if noEvent(u>0), это должно работать так, как вы ожидали.

Подробнее см. В разделе 8.5 События и синхронизация вспецификация Modelica https://modelica.org/documents/ModelicaSpec34.pdf

...