电气方面的实例

现在,让我们回到工程应用方面。那些对电气系统比较熟悉的读者,考虑下面的回路:

Low-Pass RLC Filter

低通RLC滤波器

假设我们要去求解以下变量:\(V\)\(i_L\)\(i_R\)以及\(i_C\)。我们可以使用下面与电感、电容以及电阻有关的方程来求解各个电流值\(i_L\)\(i_R\)\(i_C\)

\[V = i_R R\]
\[C \frac{\mathrm{d}V}{\mathrm{d}t} = i_C\]
\[L \frac{\mathrm{d}i_L}{\mathrm{d}t} = (V_b-V)\]

其中,\(V_b\)表示电池电压。

因为我们只有3个方程,却要求解4个变量,因此我们需要一个附加的方程。附加方程根据基尔霍夫电流定律来得到,如下所示:

\[i_L = i_R+i_C\]

我们已经确定了求解这个问题所需的方程和变量。现在,我们直接把这些方程转换为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。此外,它还包含关于这个模型的描述,即"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");

每一行都通过关联特定的物理单位定义了一种指定了嵌入的Real类型的物理类型。然后,我们声明所有的parameter变量:

  parameter Voltage Vb=24 "Battery voltage";
  parameter Inductance L = 1;
  parameter Resistance R = 100;
  parameter Capacitance C = 1e-3;

这些parameter变量分别代表了不同的物理特性(这里分别表示电压、电感、电阻和电容)。最后定义我们想要求解的变量,即:

  Voltage V;
  Current i_L;
  Current i_R;
  Current i_C;

现在,所有的变量都已经声明了。我们要在模型中添加equation区域,去定义在生成解时使用的方程组。

equation
  V = i_R*R;
  C*der(V) = i_C;
  L*der(i_L) = (Vb-V);
  i_L=i_R+i_C;

最后,我们通过创建包含model名字的end语句去结束模型(例如,本例中模型名为RLC1):

end RLC1;

本实例和前面实例的区别在于,本实例包含更多的方程。在NewtonCooling例子中,有些方程左右两边都有表达式。其中还有一个微分方程(包含一个变量的微分)和简单的代数方程的混合方程。

这也进一步强调了,Modelica不同于其他的建模环境。我们完全没有必要把方程变成所谓的“显式状态空间形式”。当然,我们可以把方程组重新整理成更加明确的形式,如下所示:

  der(V) = i_C/C;
  der(i_L) = (Vb-V)/L;
  i_R = i_L-i_C;
  V = i_R*R;

重要的是,在Modelica中我们没有必要进行这样的操作。相反的,我们可以自由的将方程组写成任何想要的形式。

最终,这些方程可能需要转换成类似显式状态空间的形式。但是,如果这样的转换是必须的,那么,这将是Modelcia语言编译器的工作,而不需要模型开发者去做。这让模型开发者不再有必要去处理这些繁琐、费时且容易出错的任务。

将方程保存成其自有“教科书形式”这一功能非常重要。在我们后续章节中将会介绍到,这些方程将会“包含在”各个组件模型内。在这些情况下,我们(在创建组件模型时)无法明确知道用于求解每个方程所使用的变量。Modelica语言编译器所执行的这些操作不仅使模型开发更快、更容易,而且也显著提高了模型的可重用性

下图显示了模型RLC1的动态响应:

../../../_images/RLC1.png

电气实例的扩展

序言所述,这本书的结构基于超媒体的浏览方法。这可以使读者更方便地处理与其目标、兴趣相一致的材料下一章将展示机械方面的模型,模型内的方程是基于机械系统原理获得的。但如果你希望看到包含更复杂的电气系统特性的实例,你可以直接跳到下面的RLC开关电路实例中。