默认表达式可以引用函数声明中的其他输入吗?
Can default expressions reference other inputs in a function declaration?
在 Modelica 中 我想实现一个名为 clip
的 function
,其工作方式类似于 Wolfram 语言中的 Clip
。也就是说,该函数将采用值列表 x
和 return 一个相同长度的向量 y
,其中对于每个分量,我们有一个 分段函数 :
y_i := x_i for min ≤ x_i ≤ max, v_min for x_i < min, and v_max for x_i > max
所以我们应该看到以下结果:
clip( {-3,-2,-1,0,1,2,3} , {-2,2} ) // { -2, -2, -1, 0, 1, 2, 2 }
clip( {-3,-2,-1,0,1,2,3} , {-2,2}, {-10,10} ) // { -10, -2, -1, 0, 1, 2, 10 }
clip( {-3,-2,-1,0,1,2,3} ) // { -1, -1, -1, 0, 1, 1, 1 }
我的方法如下:
function clip "Clip values so they do not extend beyond a given interval"
input Real x[:] "List of values to be clipped";
input Real[2] x_range := {-1, 1} "Original range [min,max] given as a list (default = {-1,1})";
input Real[2] extremes := x_range "Extreme values [v_min, v_max] given as a list (default {min,max})";
output Real y[size(x, 1)] "Clipped values";
protected
Integer n := size(x, 1) "Length of the input vector x";
algorithm
for i in 1:n loop
y[i] := if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[i];
end for;
end clip;
注意,此处 extremes
的默认表达式引用输入 x_range
,它本身具有默认表达式 {-1, 1}
.
不幸的是,我在 Wolfram SystemModeler 12.0 和 OpenModelica(OMEdit v.1.13.2)中得到了错误结果它甚至不会编译。
我的问题是:
- 根据规范,上述函数是合法的 Modelica 代码吗?
- 不管 (1.) 有没有其他方法可以做到这一点?
- 是的,这是合法的。输入的默认值取决于其他输入等,这是 Modelica 规范明确允许的。
https://specification.modelica.org/master/Ch12.html#positional-or-named-input-arguments-of-functions
The default values may depend on other inputs (these dependencies must
be acyclical in the function) – the values for those other inputs will
then be substituted into the default values (this process may be
repeated if the default value for that input depend on another input).
The default values for inputs may not depend on non-input variables in
the function.
- 我还没有检查替代品。
可以使用数组构造来代替 for 循环:
y := {if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[我] 我在 1:n};
在 Modelica 中 我想实现一个名为 clip
的 function
,其工作方式类似于 Wolfram 语言中的 Clip
。也就是说,该函数将采用值列表 x
和 return 一个相同长度的向量 y
,其中对于每个分量,我们有一个 分段函数 :
y_i := x_i for min ≤ x_i ≤ max, v_min for x_i < min, and v_max for x_i > max
所以我们应该看到以下结果:
clip( {-3,-2,-1,0,1,2,3} , {-2,2} ) // { -2, -2, -1, 0, 1, 2, 2 }
clip( {-3,-2,-1,0,1,2,3} , {-2,2}, {-10,10} ) // { -10, -2, -1, 0, 1, 2, 10 }
clip( {-3,-2,-1,0,1,2,3} ) // { -1, -1, -1, 0, 1, 1, 1 }
我的方法如下:
function clip "Clip values so they do not extend beyond a given interval"
input Real x[:] "List of values to be clipped";
input Real[2] x_range := {-1, 1} "Original range [min,max] given as a list (default = {-1,1})";
input Real[2] extremes := x_range "Extreme values [v_min, v_max] given as a list (default {min,max})";
output Real y[size(x, 1)] "Clipped values";
protected
Integer n := size(x, 1) "Length of the input vector x";
algorithm
for i in 1:n loop
y[i] := if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[i];
end for;
end clip;
注意,此处 extremes
的默认表达式引用输入 x_range
,它本身具有默认表达式 {-1, 1}
.
不幸的是,我在 Wolfram SystemModeler 12.0 和 OpenModelica(OMEdit v.1.13.2)中得到了错误结果它甚至不会编译。
我的问题是:
- 根据规范,上述函数是合法的 Modelica 代码吗?
- 不管 (1.) 有没有其他方法可以做到这一点?
- 是的,这是合法的。输入的默认值取决于其他输入等,这是 Modelica 规范明确允许的。
https://specification.modelica.org/master/Ch12.html#positional-or-named-input-arguments-of-functions
The default values may depend on other inputs (these dependencies must be acyclical in the function) – the values for those other inputs will then be substituted into the default values (this process may be repeated if the default value for that input depend on another input). The default values for inputs may not depend on non-input variables in the function.
- 我还没有检查替代品。
可以使用数组构造来代替 for 循环:
y := {if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[我] 我在 1:n};