现在让我们回到工程环境中。对于更熟悉电气系统的读者,请考虑以下电路:
低通 RLC 滤波器
假设我们要求解以下变量:、、 和 。要分别求解电流的、 和,我们可以使用与电感、电阻和电容相关的方程式:
其中 表示电池电压。
由于我们只有 3 个方程,但有 4 个变量,所以我们还需要一个额外的方程。这个额外的方程将会是基尔霍夫电流定律:
现在我们已经确定了解决此问题所需的方程和变量,接下来我们将通过直接将这些方程转换为 Modelica 语言来创建一个基本模型(包括物理类型)。但在后续关于电气元件的部分中,我们将再次回到这个相同的电路,并演示如何通过拖放和连接模型的方式来创建模型,这些模型看起来就像是我们“低通 RLC 滤波器”中的电路元件。
但目前,我们将构建一个仅由变量和方程式构成的模型。这样的模型可以这样表示:
model RLC1 "A resistor-inductor-capacitor circuit model" 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 Voltage Vb=24 "Battery voltage"; parameter Inductance L = 1; parameter Resistance R = 100; parameter Capacitance C = 1e-3; Voltage V; Current i_L; Current i_R; Current i_C; equation V = i_R*R; C*der(V) = i_C; L*der(i_L) = (Vb-V); i_L=i_R+i_C; end RLC1;
让我们逐段分析这个例子,并进一步理解各个语句的含义。让我们从最开始的部分开始:
model RLC1 "A resistor-inductor-capacitor circuit model"
在这里,我们看到该模型的名称为 RLC1。此外,还附有对该模型的描述,即“一个电阻-电感-电容电路模型”。接下来,我们将介绍一些我们将会用到的物理类型:
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");
这些每一行都引入了一种特定的物理类型,该类型通过将内置的“Real”类型与特定的物理单位相关联而对其进行扩展。然后,我们声明了我们问题中的所有参数变量:
parameter Voltage Vb=24 "Battery voltage"; parameter Inductance L = 1; parameter Resistance R = 100; parameter Capacitance C = 1e-3;
这些参数变量代表了各种物理特性(在本例中分别为电压、电感、电阻和电容)。我们需要定义的最后几个变量就是我们想要求解的变量,即
Voltage V; Current i_L; Current i_R; Current i_C;
现在所有变量都已声明完毕,我们就为模型添加一个方程部分,该部分会指定在为该模型生成解时所使用的方程:
equation V = i_R*R; C*der(V) = i_C; L*der(i_L) = (Vb-V); i_L=i_R+i_C;
最后,我们通过创建一个结束语句来完成模型的构建,该结束语句中包含了模型的名称(例如,在此例中为“RLC1”):
end RLC1;
这个例子与之前的例子的不同之处在于它包含更多的方程式。与牛顿冷却的例子一样,我们有一些方程式,其左右两边都有表达式。此外,我们还混合使用了微分方程(包含变量导数的方程)和其他简单的代数方程。
这进一步强调了这样一个观点:在 Modelica 中,无需将方程组转换为某些建模环境所要求的“显式状态空间形式”。当然,我们也可以将这些方程重新排列成更显式的形式,例如这样:
der(V) = i_C/C; der(i_L) = (Vb-V)/L; i_R = i_L-i_C; V = i_R*R;
但关键在于,使用 Modelica 时,我们无需进行此类操作。相反,我们可以自由地以任何我们选择的形式来编写方程式。
最终,这些方程可能需要被转换为类似于显式状态空间形式的表达式。但如果需要进行这样的转换,那么执行这些转换的工作将由 Modelica 编译器来完成,而不是由模型开发者来负责。这样一来,模型开发者就无需再承担这项繁琐、耗时且容易出错的任务了。
能够将方程式保持在“标准形式”中是非常重要的,因为正如我们在后续章节中将会展示的那样,我们最终希望能够实现这些方程式被“纳入”单个组件模型中的这一目标。在这些情况下,在创建组件模型时,我们不会确切知道每个方程式将用于求解哪个变量。将此类操作交由 Modelica 编译器负责不仅能使模型开发过程更快、更简便,而且还能极大地提高模型的可复用性。
以下图表展示了 RLC1 模型的动态响应情况: