Modelica:使用der()和显式声明计算变量

时间:2014-01-16 12:55:53

标签: modelica

我为糟糕的头衔道歉,但我发现很难以一种易于理解的方式描述这个问题。

我想要做的是解决ODE,但我不想开始在time = 0进行整合。我希望初始值,即集成的起点,可以在集成开始之前进行更改。我将尝试用一段代码来说明这一点:

model testModel "A test"
  parameter Real startTime = 10 "Starting time of integration";
  parameter Real a = 0.1 "Some constant";
  Real x;
  input Real x_init = 3;
initial equation
  x = x_init;
equation
  if time <= startTime then
    x = x_init;
  else
    der(x) = -a*x;
  end if;
end testModel;

请注意,x_init被声明为输入,可以连续更改。此代码会产生错误消息,据我所知,这是因为我已将x声明为der(x) =x =。错误消息是:

错误:der(x)的奇异不一致标量系统=( - (如果时间&lt; = 10然后x-x_init,否则a * x))/((如果时间&lt; = 10然后0.0其他1.0))= -1E-011/0

我想过写作

der(x) = 0

而不是

x = init_x
在if语句中

,这将避免错误消息。然而,这种方法的问题在于,在集成开始之前,我失去了修改x_init的能力,即集成的起点。可以说,例如,x_init在time = 7处从3变为4。

是否有解决方法来执行我想要的操作?感谢。

(我将使用它来模拟几个子模型作为网络的一部分,但子模型不会同时启动,因此startTime - 变量和更改初始值的能力积分前的条件。)

建议的解决方案:我已经尝试了以下内容:

when time >= startTime
  reinit(x,x_init);
end when;

der(x) = 0替代方案相结合。这似乎有效。欢迎提出其他建议。

1 个答案:

答案 0 :(得分:1)

如果您的输入是可区分的,这应该有效:

model testModel "A test"
  parameter Real startTime = 10 "Starting time of integration";
  parameter Real a = 0.1 "Some constant";
  Real x;
  input Real x_init = 3;
initial equation
  x = x_init;
equation
  if time <= startTime then
    der(x) = der(x_init);
  else
    der(x) = -a*x;
  end if;
end testModel;

否则,我怀疑你能做的最好的事情就是让x变量成为startTime之前非常快速的一阶跟踪器。

这里的根本问题是您正在尝试建模变量索引DAE。我所知道的Modelica工具都不支持这样的变量索引系统。