Modelica 整数变量的非离散赋值

Modelica 整数变量的非离散赋值,modelica,Modelica,表达式对整数的非离散赋值是否只能在函数的算法中实现 如果算法中需要许多模型参数,那么直接在模型的算法部分计算输出值会简单得多 如果使用函数,则必须将环境中所有需要的参数值作为输入传递给函数 在我看来,Modelica规范迫使人们在函数中用非离散赋值来封装整数 这种整数赋值的一个可能的用例是,希望将传递特性表示为具有紧凑支持的平滑基函数之和 对于计算,特定输入值x的输出值one必须确定其支持包含x的基函数的索引 我包括一个更简单的表格数据线性插值的例子,作为必须找到插值间隔的工作示例(即使这种插值

表达式对整数的非离散赋值是否只能在
函数的
算法中实现

如果算法中需要许多模型参数,那么直接在模型的算法部分计算输出值会简单得多

如果使用函数,则必须将环境中所有需要的参数值作为输入传递给函数

在我看来,Modelica规范迫使人们在函数中用非离散赋值来封装整数

这种整数赋值的一个可能的用例是,希望将传递特性表示为具有紧凑支持的平滑基函数之和

对于计算,特定输入值x的输出值one必须确定其支持包含x的基函数的索引

我包括一个更简单的表格数据线性插值的例子,作为必须找到插值间隔的工作示例(即使这种插值是不可微的)

代码中的
noEvent(…)
实际上并不需要,因为如果未给出注释
GenerateEvents=true
,则函数的算法部分中的关系不会生成事件

尽管如此,我还是将其包括在内,以显示整数
I
的非离散赋值结果的来源

model testInterpol
function interpol
        input Real x;
        input Real tab[:,2];
        output Real y;
protected
        Integer i;
algorithm
  i:=size(tab,1);
  for ii in 2:size(tab,1) loop
   if noEvent(x < tab[ii,1]) then
    i := ii;
    break;
   end if;
  end for;
   y := tab[i-1,2] + (tab[i,2]-tab[i-1,2])/(tab[i,1]-tab[i-1,1])*(x-tab[i-1,1]);
end interpol;

Real x = 10*sin(8*atan(1.0)*time);
parameter Real tab[:,2]={{1,1},{2,4},{3,9},{5,25},{6,36}};
Real y;
equation
        y = interpol(x,tab);
end testInterpol;
  • OpenModelica 1.9.3+dev(r25613)接受
    testInterpolModel

  • Dymola拒绝模型,并显示以下错误消息:

    Trying to assign a discrete variable inside a loop controlled by higher variability:
    interpol.i = ii;
    
在Modelica规范第3.3版第12.2节“作为专用类的功能”中。1可以找到以下语句:

函数中的组件将在函数中表现为具有离散时间可变性

我不太清楚这意味着什么。如果一个人只有规范中的这句话,并且没有使用Modelica工具的经验,那么他可能会认为函数的算法部分中的语句只在事件实例中进行评估,因为它们的行为好像具有离散时间的可变性。 但是,这种印象是错误的。如果注释
GenerateEvents
未显式设置为
true
,则始终执行函数的语句,函数内的关系不会生成事件

本规范第8.5节“事件和同步”对此进行了说明:

when子句中的所有方程和赋值语句以及函数类中的所有赋值语句都被隐式地视为
noEvent
函数,即,这些运算符范围内的关系从不引发状态或时间事件

Modelica错误跟踪器中已存在相关的记录单:

我对函数和模型中处理整型变量的差异的实际原因有一个模糊的认识

模型中的算法在概念上可以解释为输入和输出方面的匿名函数(见规范第11.1.2节“模型中算法的执行”)。算法中分配的所有变量都将成为匿名函数的输出,并可用于算法之外的方程式中

但是,这些变量可能会在模型的其他部分引入不连续性

命名函数中的情况不同。不能从外部访问未声明为输入或输出的变量。因此,可以安全地设计函数,使整变量不会在整个模型中引入不连续性

我的印象是,如果能够声明算法局部变量,问题就会得到解决。例如,可以允许在
算法
-关键字之后声明
算法
-局部变量,例如
i

另一种解决方案是重新引入Modelica规范1的关键字
nondiscrete
。已经存在这样一种情况,即在评论中提出了这样一种重新介绍。这项建议只得到批准,但什么也没发生

关键字
nondiscrete
可用于
整数i前面在上面的第二个示例代码中。由于变量
i
和赋值
i:=ii
将是
nodiscrete
在这种情况下
noEvent
在算法中也是合法的

Trying to assign a discrete variable inside a loop controlled by higher variability:
interpol.i = ii;