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

  显示原文与译文双语对照的内容

我对这个题目很抱歉,但我发现很难用易懂的方式描述这个问题。

我想做的是解决一个 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) = ( - ( 如果时间 <= 10,则x-x_init其他 a*x ) )/( ( 如果时间 <= 10,则 0.0其他 1.0 ) )的单数不一致的标量系统= -1e-011/0

我考虑写

 
der(x) = 0

 

代替

 
x = init_x

 

在语句中,该语句将避免错误消息。 然而,在集成开始之前,在这种方法中,我失去了修改x_init的能力,换句话说,的起点。 例如假设x_init在 time = 7 处从 3更改为 4.

是否有工作来执行我想要的工作? 谢谢。

将这些子模型用于网络,但是子模型不会同时启动,因此 startTime -variable和在集成之前改变初始条件的能力是不可能,

我已经尝试了以下的建议:


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

der(x) = 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
 der(x) = der(x_init);
 else
 der(x) = -a*x;
 end if;
end testModel;

否则,我觉得最好的方法是让 x 变量在 startTime 之前是一个非常快的第一步追踪器。

这里的基本问题是,你试图建立一个变量索引模型。 我所认识的Modelica工具都不支持这样的可变索引系统。

作者:
...