Modelica 非线性电感的梯形积分

Modelica 非线性电感的梯形积分,modelica,openmodelica,non-linear,Modelica,Openmodelica,Non Linear,我用Modelica对非线性电感器进行了建模,但梯形积分无法解决电路问题,希望有人能帮助我解决电路问题 model NonlinearInductor import Modelica.SIunits.MagneticFlux; extends Modelica.Electrical.Analog.Interfaces.OnePort; parameter Real T[:,2]=[-1.0015,-1200;-0.0015,-200;0,0;0.0015,200;1.0015,12

我用Modelica对非线性电感器进行了建模,但梯形积分无法解决电路问题,希望有人能帮助我解决电路问题

model NonlinearInductor
  import Modelica.SIunits.MagneticFlux;
  extends Modelica.Electrical.Analog.Interfaces.OnePort;

  parameter Real T[:,2]=[-1.0015,-1200;-0.0015,-200;0,0;0.0015,200;1.0015,1200]
                                                                               "piecewiselinear current versus flux relation";
  Integer nbPoints = size(T,1) "Number of interpolation points";
  Real L;  //Slop of line flux-Current; inductance
  MagneticFlux flux( start=0);

equation
  v =  der(flux);     // Faraday's Low

algorithm
                // Definition of Piecewise nonlinear inductance


if  i < T[2,1] then
   L     := ((T[1,2] - T[2,2]) / (T[1,1] - T[2,1]));
   flux  :=  L  *  (i-T[1,1]) +  T[1,2];

  elseif i >= T[nbPoints-1,1] then
   L     := (( T[nbPoints-1,2] - T[nbPoints,2]) / (T[nbPoints-1,1] - T[nbPoints,1]));
   flux  := L * (i-T[nbPoints-1,1]) +  T[nbPoints-1,2];

  else
      for iter in 2:(nbPoints-2) loop
         if i >= T[iter,1] and i <T[iter+1,1] then
            L      := (( T[iter,2] - T[iter+1,2]) / (T[iter,1] - T[iter+1,1]));
            flux   := L * (i-T[iter,1]) +  T[iter,2];
         end if;
      end for;
 end if;
end NonlinearInductor;

请通过解算器梯形运行示例,停止时间=0.1,间隔=2e-05

使用MSL的插值函数,可以大大简化模型。 据我所知,您的代码与此函数的作用相同:在定义的区间内使用线性插值,在区间外使用线性外推

以下是更新的代码:

model NonlinearInductor2
  extends Modelica.Electrical.Analog.Interfaces.OnePort;

  parameter Real T[:,2]=[-1.0015,-1200;
                         -0.0015,-200;
                               0,0;
                          0.0015,200;
                          1.0015,1200] "piecewiselinear current versus flux relation";

  Modelica.SIunits.MagneticFlux flux( start=0);

protected 
  final parameter Real[:] i_vec = T[:, 1];
  final parameter Real[:] flux_vec = T[:, 2];

equation 
  v = der(flux);     // Faraday's Law
  flux = Modelica.Math.Vectors.interpolate(i_vec,flux_vec,i);
end NonlinearInductor2;
除了使模型更易于理解外,插值函数的使用还带来以下好处:

  • 该函数定义了
    smoothOrder
    注释,允许Modelica转换器以分析方式区分
    flux
    变量。
    (使用注释
    smooth
    smoothOrder
    可以定义导数的连续顺序)
  • 我们可以使用单个等式部分来代替算法部分。
    (你应该避免使用算法部分来描述物理行为,因为它限制了Modelica翻译器操纵你的方程来创建一个可解的系统。使用算法部分,你强制代码按照你编写的方式进行评估,这违反了因果物理建模的原则)
不幸的是,OpenModelica在使用模拟设置模拟新模型时仍然存在一些问题(梯形规则,公差=1e-6)。通过将公差减小到1e-4,模拟完成,但仍显示警告

重新启动Kinsol:将线性解算器更改为KINDense

很多次。也许OpenModelica专家可以在这方面提供帮助


顺便说一句,Dymola对新代码没有任何问题,无论选择的解算器是什么。

没有模型都非常困难……如果您发布一个您想做的最简单的工作示例,我们将能够更好地帮助您:我已经添加了模型和一个示例到我的问题中。请看一看
model NonlinearInductor2
  extends Modelica.Electrical.Analog.Interfaces.OnePort;

  parameter Real T[:,2]=[-1.0015,-1200;
                         -0.0015,-200;
                               0,0;
                          0.0015,200;
                          1.0015,1200] "piecewiselinear current versus flux relation";

  Modelica.SIunits.MagneticFlux flux( start=0);

protected 
  final parameter Real[:] i_vec = T[:, 1];
  final parameter Real[:] flux_vec = T[:, 2];

equation 
  v = der(flux);     // Faraday's Law
  flux = Modelica.Math.Vectors.interpolate(i_vec,flux_vec,i);
end NonlinearInductor2;