在simulink下做仿真的过程中需要进行迭代运算,于是做了一个小实验试验simulink中迭代运算的方法及规则。
需要用到UnitDelay模块+matlab function模块
实验lay out如下

UnitDelay模块:起Z变换中的1/z的作用,也就是记录上一次的数据。这里如果不加入该模块,simulink会报"代数环(algebraic loop)"错误。
Matlab Function模块:一个普通的函数模块,这里就实现一个简单的a++功能。

在输出端接一个示波器,运行并观察输出。可以看到输出每次加1。

值得一提的是,这里我对"last_a"的值没有设置任何初值,这也是在我做这个实验之前比较困惑我的一点,因为声明last_a初值为0这段代码不管放在哪里都会导致每次经过它时last_a都被设置成0,导致逻辑错误。
但是似乎Simulink自动将该初值设置为0,这也许和UnitDelay模块有关,因为如果不加UnitDelay,报错中会提到"it consists of blocks that cannot be assigned algebraic variables"无法给模块设定代数变量。
当然这只是我的推测,欢迎讨论。
本文介绍了如何在Simulink环境中使用UnitDelay和MatlabFunction模块进行迭代运算。通过设置一个简单的a++函数,实验表明UnitDelay模块起到了Z变换中的延迟作用,避免了代数环错误。实验中未初始化的变量last_a在Simulink中似乎默认被设置为0,这可能与UnitDelay模块有关。不使用UnitDelay模块会导致代数变量分配问题。作者推测Simulink自动处理了初始值,但确切机制有待进一步探讨。
488





