Modelica 非线性系统求解器不能收敛

Modelica 非线性系统求解器不能收敛,modelica,openmodelica,Modelica,Openmodelica,我使用的是默认的dassl集成器。在我的模型中,音量由布尔函数控制,以打开或关闭4个阀门(2个一起工作)。在布尔值的状态以毫秒为单位更改(从1变为零)后,我收到以下错误消息: 有没有办法进一步了解导致问题的原因 model CONTROLLER Modelica.Blocks.Interfaces.RealInput V_LT_min; Modelica.Blocks.Interfaces.RealInput V_LT_max; Modelica.Blocks.Interfaces

我使用的是默认的dassl集成器。在我的模型中,音量由布尔函数控制,以打开或关闭4个阀门(2个一起工作)。在布尔值的状态以毫秒为单位更改(从1变为零)后,我收到以下错误消息:

有没有办法进一步了解导致问题的原因

model CONTROLLER
  Modelica.Blocks.Interfaces.RealInput V_LT_min;
  Modelica.Blocks.Interfaces.RealInput V_LT_max;
  Modelica.Blocks.Interfaces.RealInput V_LT_lev;
  Modelica.Blocks.Interfaces.BooleanOutput open1(start=true);
  Modelica.Blocks.Interfaces.BooleanOutput open2(start=false);
equation 
  when (V_LT_lev <= V_LT_max) then
    open1 = true;
  elsewhen (V_LT_lev < V_LT_min) then
    open1 = false;
  end when;
  open2 = not open1;
end CONTROLLER;

model EV_LT
  package SI = Modelica.SIunits;
  package Medium = Modelica.Media.Water.WaterIF97_ph;
  Thermofluid_connector port_e;
  Thermofluid_connector port_s;
  parameter Real Kv=3.79;
  Modelica.Blocks.Interfaces.BooleanInput open;
  Real dbM;
  Real delta_p;
equation 
  //dbM=port_e.dbM;
  delta_p = (port_e.p - port_s.p)/10^5;
  if (delta_p >= 10^(-5)) then
    dbM = Kv*sqrt(delta_p)*1000/3600;
  else
    dbM = 0;
  end if;
  port_e.dbM = if open then dbM else 0;
  port_e.dbM + port_s.dbM = 0;
  port_s.dbH = port_s.dbM*port_s.h;
  port_e.h = port_s.h;
end EV_LT;

connector Thermofluid_connector
  package SI = Modelica.SIunits;
  SI.AbsolutePressure p;
  flow SI.MassFlowRate dbM;
  SI.SpecificEnthalpy h;
  flow SI.EnthalpyFlowRate dbH;
equation 

end Thermofluid_connector;
模型控制器
Modelica.Blocks.Interfaces.RealInput V_LT_min;
Modelica.Blocks.Interfaces.RealInput V_LT_max;
Modelica.Blocks.Interfaces.RealInput V_LT_lev;
Modelica.Blocks.Interfaces.boolean输出open1(start=true);
Modelica.Blocks.Interfaces.BooleanOutput open2(start=false);
方程式
当(V_LT_lev=10^(-5))时
dbM=Kv*sqrt(δp)*1000/3600;
其他的
dbM=0;
如果结束;
端口_e.dbM=如果打开,则为dbM,否则为0;
端口_e.dbM+端口_s.dbM=0;
port_.s.dbH=port_.dbM*port_.s.h;
port_e.h=port_s.h;
结束EVU LT;
热流体连接器
包SI=Modelica.SIunits;
SI.绝对压力p;
流量SI.质量流量dbM;
SI.比焓h;
流量SI.焓流率dbH;
方程式
端部热流体连接器;

我对这个模型进行了更深入的研究,我不知道为什么这些都能在您的系统上运行。我试着模拟这个模型,结果遇到了一个结构奇异点,从系统的角度看,这是非常明显的

您定义等式
port_e.dbM+port_s.dbM=0.0port_e
port_s
均未连接到任何对象,因此会生成方程
port_e.dbM=0.0
port_e.dbM=0.0
(未连接的连接器的流量设置为零)。这是三个只有2个未知数的方程->结构奇点。编译器实际上试图通过区分这些(索引缩减)来解决这个问题,但正如您可能想象的那样,这不会产生任何额外的信息

你确定你模拟了上述的精确模型吗

如果您只讨论控制器的模拟,这确实有效,但非常乏味,因为它根本不依赖于时间


编辑:你能提供你正在使用的omc版本吗?我用1.14和1.16~dev对它进行了测试。也许你有一个旧版本,应该升级

我对这个模型进行了更深入的研究,我不知道为什么这些都能在您的系统上运行。我试着模拟这个模型,结果遇到了一个结构奇异点,从系统的角度看,这是非常明显的

您定义等式
port_e.dbM+port_s.dbM=0.0port_e
port_s
均未连接到任何对象,因此会生成方程
port_e.dbM=0.0
port_e.dbM=0.0
(未连接的连接器的流量设置为零)。这是三个只有2个未知数的方程->结构奇点。编译器实际上试图通过区分这些(索引缩减)来解决这个问题,但正如您可能想象的那样,这不会产生任何额外的信息

你确定你模拟了上述的精确模型吗

如果您只讨论控制器的模拟,这确实有效,但非常乏味,因为它根本不依赖于时间


编辑:你能提供你正在使用的omc版本吗?我用1.14和1.16~dev对它进行了测试。也许你有一个旧版本,应该升级

你是否直接影响阀门状态的导数?如果你把它设为零,那可能就是问题所在。您可能已经创建了一个具有动态差异索引的系统,需要以不同的方式进行建模。如果您能提供示例代码,这将有所帮助。我添加了使用阀门质量流量方程的控制器模型:port_e.dM=if open dbM else 0;其中dbM=kvdta_p*rho如果您能够以文本形式提供示例模型,那么其他人就可以将其复制并粘贴到他们的工具中并运行它,这会有所帮助。在您提供的图片中,您正在使用我添加的阀门模型和控制器模型来控制阀门的开/关状态,感谢@matthDo您直接影响阀门状态的导数吗?如果你把它设为零,那可能就是问题所在。您可能已经创建了一个具有动态差异索引的系统,需要以不同的方式进行建模。如果您能提供示例代码,这将有所帮助。我添加了使用阀门质量流量方程的控制器模型:port_e.dM=if open dbM else 0;其中dbM=kvdta_p*rho如果您能够以文本形式提供示例模型,那么其他人就可以将其复制并粘贴到他们的工具中并运行它,这会有所帮助。在您提供的图片中,您使用的是我添加的控制阀门开/关状态的阀门模型和控制器模型,谢谢@matth