修改语句¶
此前,我们看到了应用在变量上的修改语句的例子。在某些情况下,这些修改应用在内建类型的属性上, 如:
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].Vf
、VS[2].Vf
、VS[3].Vf
、VS[4].Vf
和VS[5].Vf
。另一个选择是给予该数组中的每个元素相同的值。我们可以使用和上面相同的数组初始化语法,如:
StepVoltage Vs[5](Vf={24,24,24,24,24});
但若的数组大小取决于parameter
的话,问题就来了,如:
parameter Integer n;
StepVoltage Vs[n](Vf=/* ??? */);
If we tried to initialize Vf
with a literal array (e.g.,
{24,24,24}
), then it won’t adapt to changes in n
. To address
this situation, we could use the fill function:
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语言提供了许多相关特性。这些特性能让应用在层次结构里的修改语句变得简单而功能强大。