修改语句

此前,我们看到了应用在变量上的修改语句的例子。在某些情况下,这些修改应用在内建类型的属性上, 如:

Real x(start=2, min=1);

在另一些情况下,修改语句则应用在model实例上,用以改变该特定实例参数的值,例如:

StepVoltage Vs(V0=0, Vf=24, stepTime=0.5);

但需要指出,这样的修改语句可以向下修改不止一个层级。例如,考虑前面涉及StepVoltage组件的例子。我们也可以修改StepVoltage模型的Vs实例内与Vf参数相关联的min属性,如下:

StepVoltage Vs(V0=0, Vf(min=0), stepTime=0.5);

但是,如果我们想同时改变Vf参数的属性并且赋值呢?这种修改的语法为:

StepVoltage Vs(V0=0, Vf(min=0)=24, stepTime=0.5);

一个值得讨论的重要情况是,怎么如何对组件数组的执行修改。想象一下,我们声明了StepVoltage组件的如下数组:

StepVoltage Vs[5];

正如我们在对组件数组 的讨论中看到的一样,这不是合法的Modelica代码。但这些语句可以用于表示子系统内组件的集合。如果想给参数Vf赋值,我们有两个选择。第一是指定值的数组,例如:

StepVoltage Vs[5](Vf={24,26,28,30,32});

这将向量{24,26,28,30,32}的值分别赋给了VS[1].VfVS[2].VfVS[3].VfVS[4].VfVS[5].Vf。另一个选择是给予该数组中的每个元素相同的值。我们可以使用和上面相同的数组初始化语法,如:

StepVoltage Vs[5](Vf={24,24,24,24,24});

但若的数组大小取决于parameter的话,问题就来了,如:

parameter Integer n;
StepVoltage Vs[n](Vf=/* ??? */);

如果我们试图用代码数组(如:{24,24,24}),那么这些代码就不会自动适应不同的n。为了解决这个问题,我们可以使用fill函数:

parameter Integer n;
StepVoltage Vs[n](Vf=fill(24, n));

这是个可以接受的方案。但想象一下,如果我们同时希望修改Vf的值以及Vf内的min属性呢?我们最终会得到这样的语句:

parameter Integer n;
StepVoltage Vs[n](Vf(min=fill(0,n))=fill(24, n));

一个个嵌套的修改会让这些定义会很快变得十分复杂。好在Modelica的包括一个处理这种情况的特性。通过在修改语句前添加each关键字,可以让修改语句影响每一个实例,例如:

parameter Integer n;
StepVoltage Vs[n](each Vf(min=0)=24);

修改语句是建模的重要部分。因为这些语句能让我们通过层级向下修改参数值。正如你在本节中的例子中所看到的一样,Modelica语言提供了许多相关特性。这些特性能让应用在层次结构里的修改语句变得简单而功能强大。