OpenModelica: «Предупреждение: максимальное количество итераций достигнуто, но корень не найден» с условным уравнением - PullRequest
1 голос
/ 07 октября 2019

Я новичок в OpenModelica, пытаюсь смоделировать DC / DC преобразователь с постоянным ограничением напряжения и тока. В основном выход должен обеспечивать постоянное напряжение до тех пор, пока не будет достигнут максимальный ток, а затем удерживать этот ток путем снижения напряжения.

Это пока часть уравнения моего кода:

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 
    annotation (Placement(transformation(extent={{-110, -10},{-90,10}})));
  Modelica.Electrical.Analog.Interfaces.NegativePin n 
    annotation (Placement(transformation(extent={{110, -10},{90,10}})));

  SI.Voltage v;

equation 

  v = p.v - n.v;

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

end DC_DC;

Всякий раз, когда я симулирую, результаты для напряжения и тока выглядят так, как будто я ожидал этого, поэтому расчет кажется правильным,Тем не менее, я получаю предупреждение

максимальное число итераций достигнуто, но корень не найден.

Можно мне это объяснить? Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

К сожалению, вы должны узнать о 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

  Boolean saturatedCurrent=s<0;
equation
  v-vNom=if saturatedCurrent then s else 0;
  Imax-n.i=if saturatedCurrent then 0 else s; 
2 голосов
/ 07 октября 2019

Однако я получаю предупреждение

maximum number of iteration reached, but no root found.

Можно мне это объяснить? Спасибо!

Причина этого в том, что интегратор не может решить сформулированную вами систему уравнений.
Основная проблема заключается в том, что вы пытались изменить непрерывное состояние (здесь n.i) не сообщая интегратору.


Если вы хотите изменить значение переменной состояния в событии, вам нужно использовать reinit-оператор , который разрешен только внутри уравнения 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;
...