【问题标题】:Modelica: initial condition for step functionModelica:阶跃函数的初始条件
【发布时间】:2014-07-16 01:05:17
【问题描述】:

想问一个Modelica什么时候函数的问题,下面的源码不能正常运行。变量 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;

【问题讨论】:

    标签: modelica dymola openmodelica


    【解决方案1】:

    我看到这段代码有两个问题。主要问题与这就是所谓的“变量索引”问题有关。我会解决的。但首先,我想指出您的 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,而是为x_calc 指定初始条件0,然后执行一个微分方程,表明x_calc 的值不会改变,即, @ 987654339@。换句话说,通过将代数方程设置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 运行(尽管我对您的问题或预期结果知之甚少,无法真正验证结果)。

    希望对你有帮助。

    【讨论】:

    • 嗨,迈克尔,非常感谢!很有帮助!
    • 如果这回答了您的问题,请将其标记为答案(单击答案旁边的复选标记)。
    • 好的,抱歉这是我第一次使用这个平台。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2014-04-15
    • 2016-12-25
    • 2013-02-17
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多