代码之家  ›  专栏  ›  技术社区  ›  oliver

求解静态方程(或其系统)

  •  4
  • oliver  · 技术社区  · 6 年前

    我想在Modelica中做以下的事情:在一个特定的模型中,我有几个参数h,我想通过求解参数和其他值之间的一组隐式方程,从中推导出一些与时间无关的值k。由于方程本质上是隐式的,我不能简单地指定一个表达式,我宁愿让解算器找到解。

    由于参数是常数,所以我希望在系统其余部分(例如包含k作为系数的微分方程)实际时间积分发生之前,仅能在开始时解一次方程。

    请参阅下面的示例,了解我想写什么:

    model ConstantTest
      parameter Real h = 2;
      const Real k;
    initial equation
      k*k=h; // just an example of an implicit equation, which in this simple case could also be written explicitly
    end ConstantTest;
    

    但这失败了,因为模型ica中的“常数”不仅是具有消失时间导数意义上的常数,而且在求解初始方程时它已经是不可变的。所以解算器抱怨它不能解初始方程0=2,这是因为它假设k总是等于0。

    当然,我可以将k设为一个变量,但是我必须明确地告诉解算器k有消失的时间导数(相当于它在幼稚的物理意义上实际上是“常数”):

    model ConstantTest
      parameter Real h = 2;
      Real k;
    initial equation
      k*k=h;
    equation
      der(k) = 0;
    end ConstantTest;
    

    这是可行的,但有点奇怪,因为解算器必须在每个时间步解一个小的微分方程,以便基本上对k什么都不做,这将浪费计算资源。

    在不引入“时间演化开销”的情况下,有没有办法用Modelica求解静态隐式方程?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Adrian Pop    6 年前

    我想你可以这样做:

    model ConstantTest
      parameter Real h = 2;
      parameter Real k(fixed=false);
    initial equation
      k*k=h;
    end ConstantTest;
    

    K将在初始化时计算。

        2
  •  2
  •   sjoelund.se    6 年前

    我认为定义这些系统的最佳方法是:

    model ConstantTest
      parameter Real h = 2;
      Real k;
    equation
      2*k=h;
    end ConstantTest;
    

    OpenModelica将把它放在一个初始部分,并且只解决一次。我认为OpenModelica对您的系统的行为是一个bug,因为它多次解一个时间无关的方程。