OpenModelica解算器达到最大迭代次数,但无法找到根

OpenModelica解算器达到最大迭代次数,但无法找到根,modelica,openmodelica,systemmodeler,Modelica,Openmodelica,Systemmodeler,我试图模拟一个由3个滑动体组成的一维系统,如下所示: 下面是我实现的代码: model friction //constants parameter Real muk = 0.2; parameter Real mus = 0.3; parameter Real m1 = 1.0; parameter Real m2 = 2.0; parameter Real m3 = 3.0; parameter Real Fn12 = 3.0; parameter Real

我试图模拟一个由3个滑动体组成的一维系统,如下所示:

下面是我实现的代码:

model friction
  //constants
  parameter Real muk = 0.2;
  parameter Real mus = 0.3;
  parameter Real m1 = 1.0;
  parameter Real m2 = 2.0;
  parameter Real m3 = 3.0;
  parameter Real Fn12 = 3.0;
  parameter Real Fn23 = 2.0;
  parameter Real absTol = 0.1;
  //variables
  Real X1, X2, X3, V1, V2, V3, A1, A2, A3, F1, F2, F3, Ff12, Ff23, Fs12, Fs23;

initial equation
  X1 = 0;
  X2 = 0;
  X3 = 0;
  V1 = 0;
  V2 = 0;
  V3 = 0;
equation
  F1 = 2 * sin(5 * time);
  F2 = 2 * sin(7 * time);
  F3 = 3 * sin(11 * time);
  V1 = der(X1);
  V2 = der(X2);
  V3 = der(X3);
  A1 = der(V1);
  A2 = der(V2);
  A3 = der(V3);
  m1 * A1 = F1 - Ff12;
  m2 * A2 = F2 + Ff12 - Ff23;
  m3 * A3 = F3 + Ff23;
  Fs12 = (m2 * F1 - m1 * (F2-Ff23)) / (m1 + m2);
  Fs23 = (m3 * (F2 + Ff12) - m2 * F3) / (m2 + m3);

  if abs(V1 - V2) < absTol and abs(Fs12) < mus * Fn12 then
    Ff12 = Fs12;
  else
    Ff12 = muk * Fn12 * sign(V1 - V2);
  end if;

  if abs(V3 - V2) < absTol and abs(Fs23) < mus * Fn23 then
    Ff23 = Fs23;
  else
    Ff23 = muk * Fn23 * sign(V2 - V3);
  end if;


end friction;
模型摩擦
//常数
参数Real muk=0.2;
参数Real mus=0.3;
参数实数m1=1.0;
参数实m2=2.0;
参数实际m3=3.0;
参数实Fn12=3.0;
参数实Fn23=2.0;
参数Real Absol=0.1;
//变数
实X1、X2、X3、V1、V2、V3、A1、A2、A3、F1、F2、F3、Ff12、Ff23、Fs12、Fs23;
初始方程
X1=0;
X2=0;
X3=0;
V1=0;
V2=0;
V3=0;
方程式
F1=2*sin(5*time);
F2=2*sin(7*time);
F3=3*sin(11*time);
V1=der(X1);
V2=der(X2);
V3=der(X3);
A1=der(V1);
A2=der(V2);
A3=der(V3);
m1*A1=F1-Ff12;
m2*A2=F2+Ff12-Ff23;
m3*A3=F3+Ff23;
Fs12=(m2*F1-m1*(F2-Ff23))/(m1+m2);
Fs23=(m3*(F2+Ff12)-m2*F3)/(m2+m3);
如果abs(V1-V2)
Wolfram SystemModeler能够运行模拟直到t=6秒,但结果并不是我预期的那样。当我使用OpenModelica解决模拟时,我得到以下错误:

C:/Users/foo/AppData/Local/Temp/OpenModelica/OMEdit/friction.exe-port=64457-logFormat=xmltcp-override=startTime=0,stopTime=10,步长=0.02,公差=1e-6,解算器=dassl,输出格式=mat,变量过滤器=.*-r=friction\u res.mat-jacobian=colorednumeric-w-lv=LOG\u STATS 警告:已达到最大迭代次数,但未找到根 警告:已达到最大迭代次数,但未找到根 求解非线性系统42时0.2的误差 求解非线性系统42时0.2的误差 非线性系统42失效:t=0.2时 求解非线性系统42在时间=0.2时失败。 有关更多信息,请使用-lv LOG\U NLS。 模拟过程失败。已退出,代码为-1


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

您正在尝试编写自己的摩擦模型

在Modelica中,通常的方法是使用s参数化,例如继承自:Modelica.Mechanics.Translational.Interfaces.PartialPriction(或使用现有模型进行此操作)

其文档可在线访问:


特别是Fs12和Fs23,它们是粘附力的最大摩擦力,如果摩擦力是恒定的,那么摩擦力就起作用,但这里它们取决于Ff12和Ff23,反过来它们又取决于Fs12和Fs23;这不起作用。

对于干摩擦建模,我可以推荐以简单、干净的方式重用Modelica.Mechanics.Translational.Interfaces.PartialFriction的方法。

谢谢您的回答。那么我应该如何更改代码呢?如果您能提供正确的modelica代码,我将不胜感激。谢谢。您能告诉我代码的哪一部分是错误的,以及如何修复它吗?