我正在尝试模拟内燃机的各个过程。我目前的建模方法是使用不同的子功能来对不同的流程进行建模。
在每个子函数中有一个2级S函数,它求解常微分方程,给出气缸内的状态(压力、温度等)。
我遇到的问题是,每个子函数都是根据当前曲柄角度启用的,当前曲柄角度是从Simulink中的当前时间步长计算得出的。第一个过程工作得很好,因为我手动设置了初始值,但是我无法将最新的柱面内状态(第一个子函数的输出)传递给第二个子函数用作初始条件(它坚持使用我在模拟开始时设置的初始值)。
有什么办法可以解决这个问题吗?目前,我正在沿着全局数据存储的道路前进,但到目前为止还没有任何乐趣。
发布于 2015-11-02 18:59:24
有很多不同的方法来解决这个问题。我将展示其中的一些示例。
Unit dalay块创建附加输出,如下所示:
所以你可以从之前的时间步长中得到曲柄角度的值,并将其用于求解方程的公式中。
你也可以像这样使用一些代码:
if (t == 0)
% equations with your initial values
sred = 0;
else
% equations with other values
y = uOld + myCoeef;
endMatlab function中使用persistent变量来保存上一步中的一些变量的值。Stateflow,你可以创建有两种状态的图表:第一种是用你的系数表示初始矩,第二种是用来解新的方程。如果我理解错了,你可以展示你的代码,我们将提供一些新的想法!
附注:S-Function的使用示例:

我的S函数需要两个值:Q是每一步在simulink中计算的,ro是我从表中的工作空间加载的大矩阵中的初始值,并根据时间取必要的值。因此,在S-Function中没有任何初始值-所有需要的值都是我从simulink传递给它的!
https://stackoverflow.com/questions/33475387
复制相似问题