Engee 文档
Notebook

去除代数循环

让我们来看看从模型中去除代数循环的方法。

引入延迟

反馈电路中的直通单元会在模型中产生代数循环。通过使用 DelayUnitDelay 块引入延迟,可以消除这些代数循环。

打开模型algebraic_loop 。该模型包含三个原子子系统 A、B 和 C。子系统 A 的输出是子系统 B 的输入,子系统 B 的输出是子系统 C 的输入。子系统 C 的输出返回子系统 A 和子系统 B,形成两个反馈回路。

algebraic_loop_27_03_25_09_25_40.png

如果运行该模型,将在诊断窗口中看到一条错误信息。

image.png

要消除模型中的代数环路,可在每个代数变量之前或之后添加延迟。要查看这种解决方案,请打开模型algebraic_loop_two_UnitDelay ,它与模型algebraic_loop 相似,只是在每个反馈回路的增益单位之后添加了单位延迟。

algebraic_loop_two_unitdelay_27_03_25_09_29_04.png

运行模型,确保在组装模型时没有检测到代数循环。

在这种延迟块排列方式下,子系统 A 和子系统 B 使用子系统 C 在前一个时隙的输出。

在此模型中,还可以通过在子系统 B 和子系统 C 之间添加一个单位延迟块来消除代数环路。该信号路径是两个反馈回路的一部分,因此延迟会影响两个代数变量的路径。要查看此解决方案,请打开模型algebraic_loop_one_UnitDelay.engee

algebraic_loop_one_unitdelay_27_03_25_09_27_22.png

在 "一步滞后 "模块的这种安排下,子系统 C 使用子系统 B 输出的前一时间步长的值来获取当前时间步长的反馈值。

消除代数回路的其他方法

如果求解器无法解决代数问题,Engee 会显示错误。请使用下列方法之一消除循环:

  • 重写方程以避免循环依赖;
  • 将 DAU 转换为 ODE,消除代数循环;
  • 对于某些代数循环,为循环中的代数状态指定初始值。例如,您可以使用 IC 块来实现这一目的。

消除原子系统引起的人为代数循环

如果原子子系统导致人工代数循环,则将其转换为虚拟循环。

将原子子系统转换为虚拟子系统:

  • 打开包含原子子系统的模型。

  • 右键单击原子子系统,选择 子系统选项

  • 取消选中 视为原子单元

组合信号创建人工代数循环

在某些模型中,信号被组合成组。即使不存在代数约束,这种分组也会导致 Engee 检测到代数循环。如果重新路由一个或多个信号,就可以消除人为的代数环路。

在本例中,线性化模型模拟了由单泵供水的两个水库系统的动态。INalg_loop_ss.engee

alg_loop_ss_27_03_25_09_34_46.png

  • 容量$q1$ 是指从泵进入储液器的流体流速。

  • 输出$h2$ 是第二个储液器中流体的高度。

  • 状态空间块定义了储液器系统对泵运行的动态响应。

  • 状态空间 "模块的输出是一个包含$q1$ 和$h2$ 的向量。

如果我们尝试模拟该模型,我们将收到一条信息:检测到一个代数循环。要消除循环,请执行以下步骤:

  • 修改矩阵$C$ 和$D$ 如下: image.png

  • 将$q1$ 直接传入输入端,而不是通过状态空间块。

您可以使用编辑后的模型alg_loop_ss_sol.engee 打开已完成的模型。现在输入信号 ($q1$) 并不直接传到输出端 ( 矩阵$D = 0$) ,因此状态空间块不再有直接连接。

alg_loop_ss_sol_27_03_25_09_36_21.png

结论

我们已经研究了几种消除 Engee 模型中代数循环的方法。让我们重申,建立一个带有代数循环的模型是不正确的,也是不理想的。它增加了计算成本,并给结果分析带来困难。因此,我们建议通过重新排列方程或在模型中引入额外的滞后块来避免代数循环。

示例中使用的块