在Modelica中在特定时间评估变量

在Modelica中在特定时间评估变量,modelica,Modelica,我在Modelica模拟中选择了一些变量(使用Dymola),运行良好。现在我想画出这些变量中某些变量的行为,这些变量被编号(带有索引)。我不想描绘变量与时间的关系,而是与它们的指数的关系。我计划使用plotArray函数,但这并不是我在这篇文章中真正感兴趣的。问题是,当我调用它们时,所有变量都是零,这确实是它们的初始值,但我想在稳态开始时获得它们的值,比如说当time=5000时。因此,我需要在这个特定的时间评估变量 如何在模拟的特定时间或在模拟结束时评估变量 编辑:在大量的谷歌搜索之后,我找

我在Modelica模拟中选择了一些变量(使用Dymola),运行良好。现在我想画出这些变量中某些变量的行为,这些变量被编号(带有索引)。我不想描绘变量与时间的关系,而是与它们的指数的关系。我计划使用
plotArray
函数,但这并不是我在这篇文章中真正感兴趣的。问题是,当我调用它们时,所有变量都是零,这确实是它们的初始值,但我想在稳态开始时获得它们的值,比如说当
time=5000
时。因此,我需要在这个特定的时间评估变量

如何在模拟的特定时间或在模拟结束时评估变量

编辑:在大量的谷歌搜索之后,我找到了一个名为
val()
的函数,它似乎可以实现我想要的功能,但我无法让它与我的Dymola软件一起工作


编辑2:我已经设法按照需要评估了我的变量,但我所使用的方法(在我看来)太单调乏味了。我将模拟中的.mat文件提取到MATLAB中,在那里我最终确定了我想要的变量,然后在期望的时间绘制它们。然而,真正让我吃惊的是.mat文件中变量的明显混乱。乍一看,我的变量在Modelica模型中的排序方式与在.mat文件中的排序方式几乎不一致,并且没有对变量进行命名,这让我只能根据与Dymola模拟值的比较来搜索变量。是我完全弄错了,还是有更简单的方法从.mat文件中提取变量?

您可以使用DymBrowse.m将变量从resultfile加载到Matlab。它应该在\Program Files\Dymola xx\Mfiles\dymtools中可用。
添加目录\m文件。。。到您的matlab路径。

也许我误解了您的问题,但我怀疑这里有一个简单的答案。听起来好像你有一个数组,你想在特定时间用特定变量的值填充该数组,然后绘制该数组。例如,假设您有一个变量
x
,您想记录
x
通过某些阈值的时间。这样一个简单的模型就足够了:

model RecordVariables
  Real x;
  Real times[10];
initial equation 
  x = 11;
equation 
  der(x) = -x;
  when x<=10.0 then
    times[1] = time;
  end when;
  when x<=9.0 then
     times[2] = time;
  end when;
  when x<=8.0 then
    times[3] = time;
  end when;
  when x<=7.0 then
     times[4] = time;
  end when;
  when x<=6.0 then
     times[5] = time;
  end when;
  when x<=5.0 then
     times[6] = time;
  end when;
  when x<=4.0 then
    times[7] = time;
  end when;
  when x<=3.0 then
     times[8] = time;
  end when;
  when x<=2.0 then
    times[9] = time;
  end when;
  when x<=1.0 then
     times[10] = time;
  end when;
end RecordVariables;
关于这种方法的一些评论。首先,注意
pre
运算符的使用。这对于区分由
when
子句生成的事件前后变量
i
next_level
的值是必要的。其次,您将注意到
when
子句中的
if
语句,该语句防止索引
i
变得足够大,从而使
时间
缓冲区“溢出”。这允许您设置
时间
以获得所需的大小,并且决不冒溢出的风险。但是,请注意,在这个模型中,完全有可能使
时间
过大,以至于某些值永远不会被填充

我希望这有帮助

model RecordVariables2
  Real x;
  Real times[5];
  Integer i;
  Real next_level;
initial equation 
  next_level = 10.0;
  x = 11;
  i = 1;
algorithm 
  der(x) :=-x;
  when x<=pre(next_level) then
    times[i] :=time;
    if i<size(times,1) then
      i :=pre(i) + 1;
      next_level :=next_level - 1.0;
    end if;
  end when;
end RecordVariables2;