Modelica 非线性电感的梯形积分
我用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
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;
除了使模型更易于理解外,插值函数的使用还带来以下好处:
- 该函数定义了
注释,允许Modelica转换器以分析方式区分smoothOrder
变量。flux
(使用注释
和smooth
可以定义导数的连续顺序)smoothOrder
- 我们可以使用单个等式部分来代替算法部分。
(你应该避免使用算法部分来描述物理行为,因为它限制了Modelica翻译器操纵你的方程来创建一个可解的系统。使用算法部分,你强制代码按照你编写的方式进行评估,这违反了因果物理建模的原则)
顺便说一句,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;