OpenModelica抱怨负值可能';不要消极

OpenModelica抱怨负值可能';不要消极,modelica,openmodelica,jmodelica,systemmodeler,Modelica,Openmodelica,Jmodelica,Systemmodeler,接下来,我修改了我描述的基于能量的控制器,以避免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; //variable

接下来,我修改了我描述的基于能量的控制器,以避免
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;
模型
//常数
参数实m=1;
参数实k=2;
参数Real Fmax=3;
参数实x0=1;
参数实x1=2;
参数实t1=5;
参数实v0=-2;
//变数
实x,v,a,xy,F,vm,K;
初始方程
x=x0;
v=v0;
方程式
v=der(x);
a=der(v);
m*a+k*x=F;
算法
如果时间0,则
vm:=符号(xy-x)*平方米(2*K/m);
F:=Fmax*符号(vm-v);
其他的
F:=Fmax*符号(x-xy);
如果结束;
如果结束;
注释(
试验(开始时间=0,停止时间=20,公差=1e-06,间隔=0.001),
__OpenModelica_模拟标志(lv=“LOG_STATS”,outputFormat=“mat”,s=“euler”);
终端模型;
但是,它不断地给我错误:

以下断言在时间7.170000时被违反

模型错误:sqrt(K/m)的参数为-1.77973e-005应大于等于0

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

以下断言在时间7.169500时被违反

模型错误:sqrt(K/m)的参数为-6.5459e-006应大于等于0

模型终止|模拟在7.1695时由断言终止

统计数字

模拟过程失败。已退出,代码为-1


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

您创建的代码会进行事件定位,以确定if语句中的条件何时变为true和/或false。在此搜索过程中,平方根中的表达式可能变为负数,尽管您使用if语句“避免”了它


试着阅读并应用这里介绍的解决方案。扰流板:基本上可以归结为添加一个
noEvent()
语句,用于布尔条件…

谢谢。将
K>0
更改为
noEvent(K>0)
解决了问题。同时证明我的控制器存在根本性的问题。:)