2015-11-02 61 views
1

我试图模拟内燃机的各个过程。我目前的建模方法是有不同的子功能,模拟不同的过程。Simulink S函数 - 从另一个S函数检索初始值

在每个子函数中都有一个2级S函数,它解决了ODE给出缸内状态(压力,温度等)的问题。

我遇到的问题是每个子功能都是启用的,这取决于当前曲柄角,它是根据Simulink当前的时间步计算出来的。所述第一过程的工作细如我手动设定的初始值,但然后我可以最新的缸状态(从第一子功能的输出)不传递给所述第二子功能作为初始条件使用(它坚持使用我在模拟开始时设置的初始值)。

有没有什么办法呢?目前我正沿着全球数据存储的道路前进,但迄今尚未有任何喜悦。

回答

1

有很多不同的方法来解决这个问题。 我会告诉他们中的一些作为例子。

  1. 您可以创建Unit dalay块这样的添加剂输出: screen shot 所以,你可以从以前的时间步让你的曲轴转角的值,并用它在公式求解方程你。

您也可以使用一些这样的代码:

if (t == 0) 
    % equations with your initial values 
    sred = 0; 
else 
    % equations with other values 
    y = uOld + myCoeef; 
end 
  • 另一个想法:有时我使用Matlab functionpersistent变量从以前保存某些变量的值步。但我认为这会让计算速度变慢。

  • 还有一个想法 - 如果你有Stateflow,你可以创建两种状态的图表:第一个用于系数的初始时刻,第二个用于求解新方程。

  • 如果我以错误的方式了解你,你可以显示你的代码,我们会提供一些新的想法!

    P.S.我的使用S-函数的示例: enter image description here

    我的S-功能需要2个值:Q是在Simulink在每个步骤中计算出,ro是初始予从从工作区中加载表大矩阵采取并采取必要值取决于时间。 所以没有在S-功能的初始值 - 所有需要的值我发射到从SIMULINK!

    +0

    嗨@Mikhail_Sam,感谢您的留言,我的问题是,是否有可能将新的初始值传递到初始化函数之外的MATLAB S-Function中(或者如果可能在启动后的某个时间点运行此初始化模拟)。 该模型的概述如下所示与每个子功能要工作区阵列和全局数据存储的输出。 听起来像Stateflow可能是一种方式去解决,如果没有办法实现上述? –

    +0

    Hi @ChrisLim!我们可以在您的情况下传输初始值,如输入到S-Function吗?我们可以设置S函数= 2(一个用于信号,一个用于首字母)的输入数量,然后在Simulink(或Worspace)中计算初始值,并在恰当的时刻在S函数中传输它。 例如,我使用这种方法:在工作区中创建首字母的矩阵,并在“查找表”块中的Simulink中加载它,并根据时间在每个步骤中选择首字母。 –

    +0

    我用这种方法遇到的问题是,我不知道初始值传递给我的第二个S函数,直到它第一次启用的时间步。 我发现了一种解决方法,我可以重置整个模型(包括S函数),当模型启用时,虽然我不认为它非常优雅 - 然后我必须从数据存储区读取值模型由于执行顺序。 您是否有任何可以将初始值传递给初始化函数之外的S函数的方法示例?我似乎无法在主体中触摸它们。 –

    相关问题