我想请教一个Modelica关于when函数的问题,下面的源码无法正常运行。变量Pstart_CONV是if语句中der(x_calc)的初始条件,当“when语句”成立时,Pstart_CONV值由x给出。因为 x 是阶跃函数,所以我想为 der(x_calc) 分配一个初始条件,以便 x 可以在整个域中继续。
非常感谢,
来源:
model Unnamed4
Real Pstart_CONV;
Real P_crit_ratio;
parameter Real P_crit_ratio_criteria = 2.00;
Real x;
Real x_calc(start=0);
equation
P_crit_ratio = 10-time;
when P_crit_ratio <= P_crit_ratio_criteria then
Pstart_CONV = x;
end when;
if P_crit_ratio >= P_crit_ratio_criteria then
x = time^2;
x_calc = 0;
else
der(x_calc) = time * 5;
x = x_calc + Pstart_CONV;
end if;
end Unnamed4;
最佳答案
我发现这段代码有两个问题。主要问题与所谓的“变量索引”问题有关。我会解决这个问题。但首先,我想指出您的 if
和when
子句未正确同步。我的意思是你的 if
所代表的行为变化语句不一定会与when
同时发生。条款已激活。
为了解决这个问题,您可以轻松地将模型重构为如下所示:
model Model1
Real Pstart_CONV;
Real P_crit_ratio;
parameter Real P_crit_ratio_criteria=2.00;
Real x;
Real x_calc(start=0);
Boolean trigger(start=false);
equation
P_crit_ratio = 10-time;
when P_crit_ratio <= P_crit_ratio_criteria then
Pstart_CONV = x;
trigger = true;
end when;
if trigger then
der(x_calc) = time * 5;
x = x_calc + Pstart_CONV;
else
x_calc = 0;
x = time^2;
end if;
end Model1;
现在,if
和when
条款与 trigger
相关多变的。现在我们可以解决您的主要问题,即您的 if
的一侧您拥有的声明:
der(x_calc) = time * 5;
...而在另一边你有:
x_calc = 0;
实际上,这意味着对于您解决的部分模拟 x_calc
在模拟的其他部分中使用微分方程求解 x_calc
使用代数方程。这会导致“变量索引”问题,因为 DAE 的“索引”会根据 trigger
的值是否变化而变化。是真是假。
解决这个问题的一种方法是稍微修改方程。而不是使用方程x_calc = 0
我们指定初始条件 0
对于 x_calc
然后执行一个微分方程,表示 x_calc
的值不变,即 der(x_calc) = 0
。换句话说,通过删除代数方程设置 x_calc
获得相同的行为为一个常数,并将其替换为一个方程,其中我们设置 x_calc
的初始值为所需值,然后添加一个微分方程,该方程实际上只是表示 x_calc
的值没有改变。
对您的案例进行这样的更改会导致以下模型:
model Model2
Real Pstart_CONV;
Real P_crit_ratio;
parameter Real P_crit_ratio_criteria=2.0;
Real x;
Real x_calc(start=0);
Boolean trigger(start=false);
initial equation
x_calc = 0;
equation
P_crit_ratio = 10-time;
when P_crit_ratio <= P_crit_ratio_criteria then
Pstart_CONV = x;
trigger = true;
end when;
if trigger then
der(x_calc) = time * 5;
x = x_calc + Pstart_CONV;
else
der(x_calc) = 0;
x = time^2;
end if;
end Model2;
我测试了它,并且该模型使用 SystemModeler 运行(尽管我对您的问题或预期结果了解不够,无法真正验证结果)。
希望对您有所帮助。
关于Modelica:阶跃函数的初始条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770598/