我为糟糕的头衔道歉,但我发现很难以一种易于理解的方式描述这个问题。
我想要做的是解决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
替代方案相结合。这似乎有效。欢迎提出其他建议。
答案 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工具都不支持这样的变量索引系统。