1

我在我的 Modelica 模拟(使用 Dymola)中选择了一些运行良好的变量。现在我想绘制其中某些变量的行为,这些变量已编号(带有索引)。我不想绘制变量与时间的关系,而是与它们的索引。我打算使用这个plotArray功能,但这并不是我在这篇文章中真正感兴趣的。问题是,当我调用它们时,所有变量都为零,这确实是它们的初始值,但我想在稳定状态进入时达到它们的值,比如说当time = 5000. 因此,我需要在这个特定时间评估变量。

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

编辑:经过广泛的谷歌搜索后,我发现了一个名为 的函数val(),它似乎可以满足我的要求,但我无法让它与我的 Dymola 软件一起使用。

编辑2:我已经设法根据需要评估我的变量,但我使用的方法(在我看来)非常乏味。我将 .mat 文件从仿真中提取到 MATLAB 中,在那里我最终设法识别出我想要的变量,然后在所需的时间绘制它们。然而,真正让我吃惊的是 .mat 文件中的变量明显混乱。乍一看,我的变量在 Modelica 模型中的排序方式与它们在 .mat 文件中的排序方式之间几乎没有一致,并且没有变量的命名,让我仅根据比较它们来搜索变量Dymola 模拟的值。我在这里完全误会了,还是有一些更简单的方法可以从 .mat 文件中提取变量?

4

2 回答 2

2

也许我误解了你的问题,但我怀疑这里有一个简单的答案。听起来您有一个数组,并且您想在特定时间用特定变量的值填充该数组,然后绘制该数组。因此,例如,假设您有一个变量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;

当然,写出所有这些when条款是相当乏味的。所以我们实际上可以像这样创建一个更紧凑的版本:

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;

关于这种方法的一些评论。首先,注意pre运算符的使用。这对于区分变量的值i以及子句next_level生成的事件之前和之后是必要的。when其次,您会注意到子句中的if语句when,它阻止索引i变得足够大以“溢出”times缓冲区。这使您可以设置times为您想要的任何大小,并且永远不会冒这样的溢出风险。但是请注意,在此模型中完全有可能将某些值设置times得如此之大,以至于永远不会填充某些值。

我希望这有帮助。

于 2013-08-19T13:16:55.747 回答
1

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

于 2013-08-19T08:12:38.920 回答