控制流程

某些情况下,函数只是按照固定的流程一步一步地进行计算。但是在其他一些情况下,函数也需要某种循环或迭代。在本节里,我们将讨论函数定义内所支持的不同控制结构。

分支结构

在前面章节,我们已经看到了涉及if语句和if表达式的例子。函数内部自然也可以包含这些元素。实际上,equation区域对if语句有一定的限制。那就是,if语句的每个分支(即所有可能条件)均必须生成相同数量的方程。但是,上述限制对algorithm区域并不适用(例如在函数定义时)。

循环

equation区域要确保在任意系统状态下生成的方程数量相等。所以,循环(就像分支一样)在使用时受到了严格限制。出于这个原因,equation区域(目前为止,我们唯一讨论过的区域)唯一允许使用的循环结构是for循环。

在函数定义中,for循环的语法与其在其他情况下完全一样。使用for循环首先要确定循环变量。然后循环将数组中的数值分配给循环变量,即:

algorithm
  for i in 1:10 loop
    // Statements
  end for;

equation区域与algorithm区域有两个主要的区别。这分别是:algorithm区域使用显式赋值语句而不使用等式;因此在使用if语句或for语句时就不需要考虑生成方程的数量。

此外,algorithm区域允许while循环的使用。这让我们能更灵活地进行建模。equation区域不允许使用while循环的原因在于,其在本质上生成的方程数量(即equation区域生成的方程数量)是不可预测的。但是,这种不可预见性对于algorithm区域并没有什么影响。

在前面章节插值中,我们已经讨论了InterpolateVector函数。其包含的while循环的语法如下所示:

  while x>=ybar[i+1,1] loop
    i := i + 1;
  end while;

while循环的主要元素是一系列条件表达式。其作用在于决定是否继续执行while循环内的语句。

break以及return

在进行循环时,某些时候需要提前结束循环过程。例如,在for循环中,循环重复的次数通常是由循环数组的大小来决定的。但在某些情况下,后续的循环过程是没有必要的。同样的,在while循环中,它可以方便的检查while循环何时终止。在这类情况下,可以使用break语句终止最内层循环。

控制流程的另一个问题是何时终止并从algorithm区域本身退出。在很多情况下,所有的output变量都被分配了它们的最终值。纵然,我们总可以使用ifelse语句禁止变量的进一步计算和赋值。但若能直接表明无须进行进一步计算,那就简明和清晰了。这时,我们可以在函数的algorithm区域使用return语句终止所有方程的进一步运算。在执行return语句时,output变量将返回当前时刻与之相关联的变量值。