Modelica事件和混合建模

Ass*_*ero 6 solver numerical-integration ode modelica openmodelica

我想从数字的角度理解混合建模(特别是状态事件)背后的一般思路(虽然我不是数学家:)).鉴于以下Modelica模型:

model BouncingBall
    constant Real g=9.81 
    Real h(start=1);
    Real v(start=0);
equation
    der(h)=v;
    der(v)=-g;
algorithm
    when h < 0 then
         reinit(v,-pre(v));
    end when;

end BouncingBall;
Run Code Online (Sandbox Code Playgroud)

我理解的概念whenreinit.

  1. when声明中的等式仅在条件成立时才有效吗?
  2. 让我们假设球会完全击中地板2sec.由于我使用多步求解器,这意味着求解器"超过2秒",识别出h<0(假设在模拟time = 2.5sech = -0.7).这是什么意思"使用交叉函数搜索事件的时间?是否有简单的解释(示例)?
  3. 解算器现在要回去了吗?采取较小的步长?
  4. pre()在这种情况下,操作意味着什么?
  5. noEvent():"表达式是字面意义而不是生成交叉函数.由于没有交叉函数,因此没有要求表达式可以在事件限制之外进行评估":这是什么意思?给出与弹跳球相同的例子:求解器在时间2.5检测到h = 0.7.有没有区别noEvent()

Han*_*son 5

  1. 是的,什么时候只在事件中执行.
  2. 简单视图:求解器采用步骤,然后使用连续扩展为上一步生成(平滑)插值公式.该插值公式可用于生成绘图,也可用于查找h已越过零的第一个点(可能为2.000000001).然后在该插值点处完成事件迭代 - 然后重新启动解算器.
  3. 我不会说解算器会回来.它需要一个步骤,然后继续前进.一些求解器需要在事件发生后大量减小步长 - 其他人则不需要.
  4. pre(x) 在事件之前设置为x的值.
  5. noEvent(h<0)基本上意味着将表达式评估为没有交叉函数的所有钟声和口哨.你不能使用when noEvent(h<0) then

还有许多附加要点:如果您熟悉Sturm序列或控制理论,您可能会发现没有必要插入公式来确定它是否在一个区间内交叉为零(有些工具使用它).功能不一定平滑的事实使其更复杂,并且还意味着不能使用衍生测试.求解器重置的程度取决于求解器的类型.一步求解器(Runge-Kutta)可以直接重新启动,就像几乎没有发生任何事情一样,而多步求解器(BDF/Adams - 例如dassl/lsodar/cvode)需要从较低阶和较小步长开始.