引入物理

虽然前面的章节让我们对模型的数学特性有了一定的了解,但是并没有包含与模型物理属性相关的内容。在本章节,我们将探索如何建立能体现其物理属性的模型。在此过程中,我们将重点介绍建模语言的一些特性,利用这些特性不仅可以将模型的物理特性和相应的工程领域结合起来,甚至还可以帮助我们避免一些错误。

让我们先从下面的例子开始:

model NewtonCooling "An example of Newton's law of cooling"
  parameter Real T_inf "Ambient temperature";
  parameter Real T0 "Initial temperature";
  parameter Real h "Convective cooling coefficient";
  parameter Real A "Surface area";
  parameter Real m "Mass of thermal capacitance";
  parameter Real c_p "Specific heat";
  Real T "Temperature";
initial equation
  T = T0 "Specify initial value for T";
equation
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCooling;

正如我们在前面章节简单的一阶系统中的实例讨论的那样,model的定义包括变量和公式。

但是,上述代码让我们第一次看到了关键字parameter。一般来说,关键字parameter用于表明变量的值是先验已知的(即仿真开始之前)。更确切的说,关键字parameter是用于指定变量的可变性。在可变性一节中,我们将会对这部分内容进行详细的讨论。至于现在,我们可以将关键字parameter看作是一个必须提供赋值的变量。

NewtonCooling实例中,我们可以看到五个参数:T_infT0hAm以及c_p。我们不需要费心的去解释这些变量的含义,因为模型本身已经为每个变量添加了描述性的字符串。目前,这些参数都没有赋值。但是我们很快会回到这个话题。迄今为止,我们所看到的变量类型都是Real

让我们来研究一下这个模型的其余部分。下一个变量名是T(数据类型也是Real)。因为这个变量没有关键字parameter的限定,因此,它的值是通过模型中的方程确定的

接下来,我们看到的是两个equation部分。第一个是initial equation区域。该部分指定变量T如何进行初始化。从上面initial equation区域可以清楚的看到,变量T的初始值是由参数T0决定的,因此我们可以为它赋任何初值。

另一条方程是关于参数T的微分方程。数学上,我们可以用以下方程进行描述:

\[m c_p \dot{T} = h A (T_{\infty}-T)\]

但是,在Modelica语言中,我们将它写成如下形式:

m*c_p*der(T) = h*A*(T_inf-T)

我们可以注意到,本实例和简单的一阶系统FirstOrder模型实例相比,在公式的写法上并没有什么不同。

有一点值得注意的是,在NewtonCooling实例中的方程,等式左侧也包含相应的表达式。在Modelica中,没有必要去明确某个方程是哪个单一变量的确定方程。一个公式可以在等号的两边包含任意表达式。通过确定如何使用这些方程,然后求解包含在等式中的变量是编译器的工作。

另一个区分NewtonCoolingFirstOrder模型实例的特点是我们可以独立的调整不同参数的值。此外,这些参数的值和模型的物理特性,材料或环境条件的可测量特性相关联。换句话说,相比于FirstOrder实例中的简单数学关系,这个版本稍微能体现实际系统的物理特性,因为模型参数本身就是和物理属性相关联的。

现在,我们还不能运行NewtonCooling模型,因为缺少六个参数。为了创建可以用于仿真的模型,我们需要提供上述参数值,即:

model NewtonCoolingWithDefaults "Cooling example with default parameter values"
  parameter Real T_inf=25 "Ambient temperature";
  parameter Real T0=90 "Initial temperature";
  parameter Real h=0.7 "Convective cooling coefficient";
  parameter Real A=1.0 "Surface area";
  parameter Real m=0.1 "Mass of thermal capacitance";
  parameter Real c_p=1.2 "Specific heat";
  Real T "Temperature";
initial equation
  T = T0 "Specify initial value for T";
equation
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCoolingWithDefaults;

这里唯一的区别是,关键字parameter后面的变量都有了确定值。一种分析NewtonCooling模型不能仿真原因的方法在于,模型总共包含7个变量却只有一个方程(参考初始化以了解initial equation区域不能算作方程的原因)。但是,从概念上讲,NewtonCoolingWithDefaults模型包含7个方程(6个方程是对parameter中变量的初始化,另一个在方程区域)和7个未知量。

如果我们将NewtonCoolingWithDefaults模型进行仿真,可以得到变量T解的轨迹,如下所示:

../../../_images/NCWD.png

物理单位

正如本节已经提到的那样,这些例子体现更多的物理属性。因为,模型包含各自对应于现实世界体系中各个属性的物理参数。然而,我们仍然缺少一些物理属性。尽管这些变量代表了物理量如温度,质量等方面,我们并没有明确为其规定任何物理类型。

正如你猜测的那样,变量T表示温度,在与变量相关的描述性文本中已经明确进行了表述。此外,即使不对此前的模型进行很深入的分析,大家也可以确定变量T0T_inf均须是温度。

但是对于其他变量,比如变量hA,它们表示什么?更重要的是,这些方程是否具有物理一致性?物理一致性表述的是方程等式两边是否具有相同的物理单位(即温度、质量、功率等)。

我们可以通过在变量声明的时候包含相应的物理单位,以更严格地表述不同变量的单位。如下所示:

model NewtonCoolingWithUnits "Cooling example with physical units"
  parameter Real T_inf(unit="K")=298.15 "Ambient temperature";
  parameter Real T0(unit="K")=363.15 "Initial temperature";
  parameter Real h(unit="W/(m2.K)")=0.7 "Convective cooling coefficient";
  parameter Real A(unit="m2")=1.0 "Surface area";
  parameter Real m(unit="kg")=0.1 "Mass of thermal capacitance";
  parameter Real c_p(unit="J/(K.kg)")=1.2 "Specific heat";

  Real T(unit="K") "Temperature";
initial equation
  T = T0 "Specify initial value for T";
equation
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCoolingWithUnits;

你可以注意到,每个变量的声明部分都包含与变量相关联的物理单元文本(unit="...")。这些附加文本的作用是为了指定与变量相关联的unit(物理单位)属性值。属性是每个变量所具有的特质。变量的属性集取决于变量的类型(在接下来的章节将对变量部分进行更详细的讨论,参考变量)。

初看起来,似乎不是很明白,指定变量的物理单位属性(比如(unit="K"))还不如简单在变量声明的后面添加描述性字符串"Temperature"。事实上,人们甚至可以说指定变量的物理属性更糟糕。因为”Temperature”比单一的字母”K”更具有描述性。

然而,设置unit(单位)属性实际上有两个原因。第一个原因是,Modelica语言规范定义了所有标准国际单位属性之间的关系(例如Kkgm)。这包括由其他基本单位构成的复杂单位类型 (例如N) 。

另一个原因是,Modelica语言还规定了如何进行复杂数学表达式单位计算的规则。在这种方式下,Modelica语言标准定义了所有与单位属性检查相关的规则,以便检测Modelica模型中单位属性的错误或不一致。这对模型开发者来说是一个巨大的优势,因为添加物理单位属性不仅使得模型结构更清晰,而且还提供了出现错误情况下更好的诊断方法。

物理类型

但是,实际上在NewtonCoolingWithUnits实例中有一个缺陷,即我们必须对每个变量的unit属性重复定义。另外,如前所述,“Temperature”比单一字母K更具有描述性。

幸运的是,对上述问题我们有一个简单的解决方法,即Modelica语言允许我们定义derived types(派生类型)。到目前为止,我们所声明的变量类型只有Real(实型)。Real类型的问题是它可以是任何东西(例如:电压、电流、温度)。我们想做的是如何稍微限制一下变量类型。这也就是派生类型产生的原因。要了解如何定义和声明派生类型,考虑下面的例子:

model NewtonCoolingWithTypes "Cooling example with physical types"
  // Types
  type Temperature=Real(unit="K", min=0);
  type ConvectionCoefficient=Real(unit="W/(m2.K)", min=0);
  type Area=Real(unit="m2", min=0);
  type Mass=Real(unit="kg", min=0);
  type SpecificHeat=Real(unit="J/(K.kg)", min=0);

  // Parameters
  parameter Temperature T_inf=298.15 "Ambient temperature";
  parameter Temperature T0=363.15 "Initial temperature";
  parameter ConvectionCoefficient h=0.7 "Convective cooling coefficient";
  parameter Area A=1.0 "Surface area";
  parameter Mass m=0.1 "Mass of thermal capacitance";
  parameter SpecificHeat c_p=1.2 "Specific heat";

  // Variables
  Temperature T "Temperature";
initial equation
  T = T0 "Specify initial value for T";
equation
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCoolingWithTypes;

你可以看到关于类型的定义type Temperature=Real(unit="K", min=0);。其意思是“让我们定义一个新类型Temperature。这是内置Real类型的一个特例。其物理单位为开尔文 (K)。最小可能值则为0”。

从这个例子中,我们可以看到,一旦我们定义了一个物理类型比如Temperature,我们可以使用它为多个变量(例如TT_infT0)进行声明,而无需为每一个变量指定unit(单位属性)或min(最小值属性)。另外,我们可以使用所熟悉的名字Temperature来代替国际单位K。你可能想知道为什么创建了派生类型后,其他变量也可以获取其属性。如果需要进一步的了解,可以参考章节内建类型

在这一点上,你会发现若要在每一个模型中都要定义变量TemperatureConvectionCoefficientSpecificHeatMass,这会是一件极其乏味的事情。但是如果模型有这方面需要的华,还必须这样做。不过不用担心。我们会在后面关于导入物理类型的章节中讨论一个简单的解决方案。