1

这个问题之后,我修改了我在这里描述的基于能量的控制器,以避免出现负值sqrt

model Model
  //constants
  parameter Real m = 1;
  parameter Real k = 2;
  parameter Real Fmax = 3;
  parameter Real x0 = 1;
  parameter Real x1 = 2;
  parameter Real t1 = 5;
  parameter Real v0 = -2;

  //variables
  Real x, v, a, xy, F, vm, K;

initial equation
  x = x0;
  v = v0;

equation
  v = der(x);
  a = der(v);
  m * a + k * x = F;

algorithm
  if time < t1 then
    xy := x0;
  else
    xy := x1;
  end if;
  
  K := Fmax * abs(xy - x) + k * (xy^2 - x^2) / 2;
  
  if abs(xy - x) < 1e-6 then
    F := k * x;
  else
    if K > 0 then
      vm := sign(xy - x) * sqrt(2 * K / m);
      F := Fmax * sign(vm - v);
    else
      F := Fmax * sign(x - xy);
    end if;
  end if;
  
  annotation(
    experiment(StartTime = 0, StopTime = 20, Tolerance = 1e-06, Interval = 0.001),
    __OpenModelica_simulationFlags(lv = "LOG_STATS", outputFormat = "mat", s = "euler"));
end Model;

但是,它一直给我错误:

在时间 7.170000 违反了以下断言

模型错误:sqrt(K / m) 的参数是 -1.77973e-005 应该 >= 0

Integrator 尝试使用调用的断言来处理问题。

在时间 7.169500 违反了以下断言

模型错误:sqrt(K / m) 的参数是 -6.5459e-006 应该 >= 0

模型终止 | 模拟被当时的断言终止:7.1695

统计数据 

模拟过程失败。以代码 -1 退出。

如果您能帮助我了解问题所在以及如何解决,我将不胜感激。

4

1 回答 1

3

您创建的代码会进行事件本地化,以找出 if 语句中的条件何时变为真和/或假。在此搜索期间,平方根中的表达式可能变为负数,尽管您使用 if 语句“避免”了它。

尝试阅读本文并应用那里提出的解决方案。剧透:它基本上归结为noEvent()为您添加一个布尔条件语句......

于 2019-02-21T11:33:39.580 回答