报错信息中的"Algebraic loop involving integers or booleans"是什么意思

What is the meaning of "Algebraic loop involving integers or booleans" in the error message

我正在使用 Dymola 平台制作 PI 控制器,我遇到了如下错误消息

这是我的一些代码,其中包括计算 disp 的阀门和控制 disp 量的 PI 控制器。 他们正在使用 flag

相互交流
  //PI controller///

  if flag_input==1 then //flag_input==1 : Stop control / flag_input==0 : Restart control//
    control:=0;
  else
    control:=(P_term+I_term)/unit;
  end if;

  if error<0 then // error<0 : flag to Valve to restart calculating the disp//
    flag_output:=1;
  else
    flag_output:=0;
  end if;

//Valve//

  if (26/5)*(thetta/(2*pi))*0.001>0.026 and flag_input==0 then
  //restart calculating the disp when received flag==1 from the PI controller//
    disp:=0.026;
    flag:=1;
  elseif (26/5)*(thetta/(2*pi))*0.001<0 and flag_input==0 then
    disp:=0;
    flag:=1;
  else
    disp:=(26/5)*(thetta/(2*pi))*0.001;
    flag:=0;
  end if;

谁能告诉我algebraic loop error是什么意思并找出问题所在?

从您的代码片段中很难说出问题的确切位置。

Dymola 告诉您,您在顶部 Unknowns 下列出的所有变量和下方 Equations 部分中列出的方程式上创建了一个大型代数环。 当您使用相互依赖的变量创建 if 语句时,很容易发生这种情况。通常你只需要在正确的地方使用 pre() 来打破循环。

我们再用一个小例子来说明问题。 出于某种原因,我们尝试计算当前模拟中经过的完整毫秒数,并在达到 100 时停止。

model count_ms
  Integer y(start=0);
equation 
  if y >= 100 then
    y = 100;
  else
    y = integer(1000*time);
  end if;
end count_ms;

此代码将产生与您的类似的错误:

An algebraic loop involving Integers or Booleans has been detected.
Unknowns: y

Equations: y = (if y >= 100 then 100 else integer(1000*time));

从错误消息中我们看到 y 无法求解,因为 if 语句产生的方程。该方程不可解,因为 y 取决于自身。为了解决此类问题,引入了 pre,它使您可以访问触发事件时变量的值。

要修复上面的代码,我们只需在检查 y

时使用 pre
if pre(y) >= 100 then

并且模型按预期进行模拟。