你所说的这种问题在Simulink里被称为代数环(Algebraic Loops),基本概念就是要计算一个信号,必须要用到信号自身。从数学的角度来说相当于是求一个隐函数;在Simulink里面,有个术语叫直接馈通(direct feedthrough),代数环就是由一个或多个直接馈通的模块构成了回路。要细说起来内容比较多,想深入了解的话,可以用上述两个关键词查一下相关的文档。
解决代数环的方法有多种,用哪种视具体的问题而定。比较简单的有这样两种:
1、在代数环中加入Memory模块,相当于把信号延后一个步长再输出(即信号的前一次采样值),由于Memory不是直接馈通的,也就不存在代数环了。如果问题本身不是要求用前一步的采样值,这种做法就引入了本来不存在的动态,在某些情况下会导致错误的结果。从你的描述看,似乎刚好符合使用这个模块的条件。Memory模块位于Discrete库。
2、如果有的问题不适用Memory,可以考虑使用IC模块。IC模块可以为代数状态变量一个初始估计,使得计算能够得以启动。该模块位于Signal Attributes库。
顺便说一句:建议用S函数的多数属于不懂装懂的大尾巴狼,根本没必要搞那么复杂。S函数的确非常有用,但用在这种场合有点杀鸡用牛刀了。
使用延迟模块:离散库里的z-1,输出为上次采样值