我试图模拟内燃机的各个过程。我目前的建模方法是使用不同的子函数来模拟不同的过程。
在每个子函数中都有一个2级S函数,它解决了ODE给出的气缸状态(压力,温度等)。
我遇到的问题是每个子功能都启用,具体取决于当前曲柄角度,该曲柄角度是根据Simulink中的当前时间步长计算出来的。第一个过程在我手动设置初始值时工作正常,但是我无法将最新的缸内状态(第一个子函数的输出)传递给第二个子函数以用作初始条件(它坚持使用我在模拟开始时设置的初始值。
这有什么办法吗?目前我正走在全球数据商店的道路上,但到目前为止还没有任何乐趣。
答案 0 :(得分:1)
有很多不同的方法可以解决这个问题。 我将展示其中一些作为示例。
Unit dalay
块创建添加剂输出,如下所示:
因此,您可以从之前的时间步长获得曲柄角度的值,并在公式中使用它来求解方程式。 你也可以使用这样的代码:
if (t == 0)
% equations with your initial values
sred = 0;
else
% equations with other values
y = uOld + myCoeef;
end
另一个想法:有时我会在persistent
中使用Matlab function
变量来保存上一步中某些变量的值。但我认为它会使计算速度变慢。
还有一个想法 - 如果你有Stateflow
,你可以创建两个状态的图表:首先是你的系数的初始时刻,第二个是解决新方程。
如果我以错误的方式理解你,你可以展示你的代码,我们会提供一些新的想法!
我的S-Function需要2个值:Q
是在每个步骤的simulink中计算的,ro
是从我从表格中的工作区加载的大矩阵中获取的初始值,并根据时间取得必要的值。
因此,S-Function中没有任何初始值 - 我从simulink传输到所有需要的值!