在 OpenModelica 中对 RLC 建模。错误 - 复数和实数之间的类型不匹配
Modeling RLC in OpenModelica. Error - Type mismatch,between Complex and Real
已编辑 28-04-2021
我试图在 OpenModelica 中构建 RLC 链。
当我输入"equation"
中的几个函数时,出现错误(见评论)
我在上面声明了一些变量,但是错误并没有消失
有RLC链
有公式
model Lab5
extends Modelica.Icons.Example;
type Voltage=Real(unit="V");
type Current=Real(unit="A");
type Resistance=Real(unit="Ohm");
type Capacitance=Real(unit="F");
type Inductance =Real(unit="H");
parameter Modelica.SIunits.Resistance R=100 "Resistance";
parameter Modelica.SIunits.Inductance L=1 "Inductance";
parameter Modelica.SIunits.Voltage Vb=24 "Total DC Voltage";
parameter Modelica.SIunits.Capacitance C=1e-3 "Capacitance";
Voltage V;
Current i_L;
Current i_R;
Current i_C;
Current icomp;
equation
Z1_f=Modelica.ComplexMath.'sqrt'(Complex(re=-1)*(2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C)));
** //Error:
Type mismatch in equation Z1_f=Modelica.ComplexMath.'sqrt'(Complex.'*'.multiply(Complex(-1.0, 0.0),
Complex.'constructor'.fromReal(L / C, 0.0))) of type Real=record Complex
Real re;
Real im;
end Complex;.**
Z2_f=R;
KPF=Z2_f/(Z1_f+Z2_f);
APF=ModelicaReference.Operators.'abs(KPF)';
FPF=Modelica.ComplexMath.arg(KPF);
V = i_R * R;
C * der(V) = i_C;
L * der(i_L) = Vb - V;
i_L = i_R + i_C;
annotation(
uses(Modelica(version = "3.2.3")));
end Lab5;
我尝试更改语法并编写了以下代码:
Z1_f=Modelica.ComplexMath.'sqrt'(Complex*Complex(re=2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C))));
但是现在这个错误:
Operator overloading requires exactly one matching expression, but found 0 expressions:
但是如果我将一个复合体分配给括号中的一个复合体到另一个复合体,从而分配 1 个参数(而不是 0,如前一个错误所示),那么该错误再次指的是构造函数的错误组合以及从复杂到真实。
Z1_f=Modelica.ComplexMath.'sqrt'(Complex(Complex(re=(2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C))))));
The are 2 big errors:
Type mismatch for positional argument 1 in Complex(re=Complex.'constructor'.fromReal(L / C, 0.0)). The argument has type:
record Complex
Real re;
Real im;
end Complex;
expected type:
Real
Complex.'constructor'.fromReal(re=Complex.'constructor'.fromReal(L / C, 0.0)). The argument has type:
record Complex
Real re;
Real im;
end Complex;
expected type:
Real
如何解决复数和实数之间的这个问题?
因为在 Modelica 中有很多复杂数据和真实数据之间的方程式。
这似乎是作业,所以我会给你一些提示。
- 不定义 pi,而是使用 Modelica.Constants.pi。
- ModelicaReference 只是一个文档库,您不能从那里使用任何(引用的)运算符,删除 ModelicaReference.Operators。和引号
- 您需要声明所有出现在方程部分的变量,并具有正确的类型(实数或复数),您现在遗漏了很多
- ModelicaReference.Operators.'abs(KPF)' -> abs(KPF)
- 据我所知,您使用的是复数,因此您需要使用类型 Complex
- 对于您使用的 Complex 运算符:Complex operators and Modelica.ComplexMath,即 Modelica.ComplexMath.'sqrt'(Complex(re=-1, im=0))
已编辑 28-04-2021
我试图在 OpenModelica 中构建 RLC 链。
当我输入"equation"
中的几个函数时,出现错误(见评论)
我在上面声明了一些变量,但是错误并没有消失
有RLC链
有公式
model Lab5
extends Modelica.Icons.Example;
type Voltage=Real(unit="V");
type Current=Real(unit="A");
type Resistance=Real(unit="Ohm");
type Capacitance=Real(unit="F");
type Inductance =Real(unit="H");
parameter Modelica.SIunits.Resistance R=100 "Resistance";
parameter Modelica.SIunits.Inductance L=1 "Inductance";
parameter Modelica.SIunits.Voltage Vb=24 "Total DC Voltage";
parameter Modelica.SIunits.Capacitance C=1e-3 "Capacitance";
Voltage V;
Current i_L;
Current i_R;
Current i_C;
Current icomp;
equation
Z1_f=Modelica.ComplexMath.'sqrt'(Complex(re=-1)*(2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C)));
** //Error:
Type mismatch in equation Z1_f=Modelica.ComplexMath.'sqrt'(Complex.'*'.multiply(Complex(-1.0, 0.0),
Complex.'constructor'.fromReal(L / C, 0.0))) of type Real=record Complex
Real re;
Real im;
end Complex;.**
Z2_f=R;
KPF=Z2_f/(Z1_f+Z2_f);
APF=ModelicaReference.Operators.'abs(KPF)';
FPF=Modelica.ComplexMath.arg(KPF);
V = i_R * R;
C * der(V) = i_C;
L * der(i_L) = Vb - V;
i_L = i_R + i_C;
annotation(
uses(Modelica(version = "3.2.3")));
end Lab5;
我尝试更改语法并编写了以下代码:
Z1_f=Modelica.ComplexMath.'sqrt'(Complex*Complex(re=2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C))));
但是现在这个错误:
Operator overloading requires exactly one matching expression, but found 0 expressions:
但是如果我将一个复合体分配给括号中的一个复合体到另一个复合体,从而分配 1 个参数(而不是 0,如前一个错误所示),那么该错误再次指的是构造函数的错误组合以及从复杂到真实。
Z1_f=Modelica.ComplexMath.'sqrt'(Complex(Complex(re=(2*Modelica.Constants.pi*f*L*(1/(2*Modelica.Constants.pi*f*C))))));
The are 2 big errors:
Type mismatch for positional argument 1 in Complex(re=Complex.'constructor'.fromReal(L / C, 0.0)). The argument has type:
record Complex
Real re;
Real im;
end Complex;
expected type:
Real
Complex.'constructor'.fromReal(re=Complex.'constructor'.fromReal(L / C, 0.0)). The argument has type:
record Complex
Real re;
Real im;
end Complex;
expected type:
Real
如何解决复数和实数之间的这个问题? 因为在 Modelica 中有很多复杂数据和真实数据之间的方程式。
这似乎是作业,所以我会给你一些提示。
- 不定义 pi,而是使用 Modelica.Constants.pi。
- ModelicaReference 只是一个文档库,您不能从那里使用任何(引用的)运算符,删除 ModelicaReference.Operators。和引号
- 您需要声明所有出现在方程部分的变量,并具有正确的类型(实数或复数),您现在遗漏了很多
- ModelicaReference.Operators.'abs(KPF)' -> abs(KPF)
- 据我所知,您使用的是复数,因此您需要使用类型 Complex
- 对于您使用的 Complex 运算符:Complex operators and Modelica.ComplexMath,即 Modelica.ComplexMath.'sqrt'(Complex(re=-1, im=0))