Modelica:阶跃函数的初始条件

标签 modelica dymola openmodelica

我想请教一个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;

最佳答案

我发现这段代码有两个问题。主要问题与所谓的“变量索引”问题有关。我会解决这个问题。但首先,我想指出您的 ifwhen子句未正确同步。我的意思是你的 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;

现在,ifwhen条款与 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/

相关文章:

icons - Modelica - 创建图标

modelica - Dymola/Modelica 中的 openModelFile 和 openModel 命令有什么区别?

Modelica:混合连接器和直接输入

modelica - 如何在 Modelica 中对在预定时间发生的单个时间事件进行建模?

Modelica 模型及其 fmu 对相同的输入给出不同的结果

modeling - 在仿真工具中求解(非线性)方程

Modelica - 增量不符合条件

modelica - 无法在 Dymola 中生成 Flat Modelica 代码?

executable - 使用 dymosim.exe 而不是 *.mat 将输出文件格式更改为 *.csv

modelica - 将外部生成的 C 代码嵌入 OpenModelica 模型中