OpenModelica:“警告:已达到最大迭代次数,但未找到根”,带有条件方程式

时间:2019-10-07 08:40:27

标签: simulation modelica openmodelica dymola

我是OpenModelica的初学者,试图为具有恒定电压和电流限制的DC / DC转换器建模。基本上,应该假设输出端提供恒定电压,直到达到最大电流为止,然后通过降低电压来保持该电流。

到目前为止,这是我代码的等式部分:

xlim

每当我进行仿真时,电压和电流的结果看起来都像我期望的那样,因此计算似乎是正确的。但是,我得到警告

  

已达到最大迭代次数,但未找到根。

有人可以向我解释吗?谢谢!

2 个答案:

答案 0 :(得分:2)

  

但是,我得到警告

maximum number of iteration reached, but no root found.
     

有人可以向我解释吗?谢谢!

这样做的原因是,积分器无法求解您公式化的方程组。
潜在的问题是,您试图更改连续状态(此处为n.i)而没有告知积分器。


如果您想在事件中更改状态变量的值,则需要使用reinit-operator,该参数仅在when公式内。

您可以执行类似于以下模型的操作:

package minExample
  model DC_DC "Voltage source with current limiting"
    import SI = Modelica.SIunits;

    parameter SI.Voltage Vnom(start=1) "Value of nominal output voltage";
    parameter SI.Current Inom(start=1) "Value for maximum continous output current";
    parameter SI.Current Imax(start=1) "Value for maximum output current";

    Modelica.Electrical.Analog.Interfaces.PositivePin p "Positive electrical pin";
    Modelica.Electrical.Analog.Interfaces.NegativePin n "Negative electrical pin";
    SI.Voltage v "Voltage drop of the two pins (= p.v - n.v)";
  equation
    when n.i > Imax then
      reinit(n.i,Imax);
    end when;

    if n.i > Imax then
      v = 0;
    else
      Vnom = p.v - n.v;
    end if;

    // Connect equations
    0 = p.i + n.i;
    v = p.v - n.v;
  end DC_DC;

  model test
    Modelica.Electrical.Analog.Basic.Ground ground1;
    Modelica.Electrical.Analog.Basic.Inductor inductor1(L = 0.5);
    DC_DC dc_dc1;
  equation
    connect(inductor1.n, ground1.p);
    connect(dc_dc1.n, ground1.p);
    connect(inductor1.p, dc_dc1.p);
  end test;
end minExample;

答案 1 :(得分:2)

不幸的是,您必须了解s参数化才能解决此问题,例如在Modelica.Electrical.Analog.Ideal.IdealDiode。

除了进行单元检查外,您还应该执行以下操作:

 Real s;
equation 

  v = p.v - n.v;

  if s<0 then
    s=v-Vnom;
    n.i=Imax;
  else
    Vnom = v;
    s=Imax-n.i;
  end if;
  0 = p.i + n.i;

我相信最初的参考文献是https://ieeexplore.ieee.org/document/808640

通过添加新变量并重写if-equations,也可以使用这种样式来重写此模型

  Boolean saturatedCurrent=s<0;
equation
  v-vNom=if saturatedCurrent then s else 0;
  Imax-n.i=if saturatedCurrent then 0 else s;