如何在记录向量中为某个字段赋予不同的值
我有一个具有默认参数值的系统记录。为了构建系统向量,我需要一个记录向量。我希望能够通过Dymola界面编辑这个记录向量,以便在仿真前对默认参数进行调整。这样做效果很好。
为了在参数界面编辑记录向量时区分系统的各个元素,我想为向量中的每个元素分配一个默认属性,该属性是所考虑系统的一个区分性属性。这意味着区分属性必须在仿真前分配。
这些区分属性的取值在其他地方计算,并作为向量中的参数存储。
如何在仿真前把区分属性分配给记录中的每个元素,以便在参数界面编辑它们?
我首先尝试使用以下方法初始化记录向量:
record R "record"
Real differenciating;
Real data=4 "default value";
end R;
model Test
parameter Integer n=2;
parameter Real differenciatingValues[n]={1.2,2.3};
parameter R r[n](each fixed=false) "vector of record"; //
initial algorithm
for i in 1:n loop
r[i].differenciating := differenciatingValues[i];
end for;
end Test;
但Dymola报错 Class or component 'fixed' not found in R r,因此它无法识别Modelica语言中的fixed关键字。很奇怪。无论如何,我知道这第一种尝试不会起作用,因为在编辑参数之前不会执行初始算法。
第二次尝试,使用内联循环:
record R "record"
Real differenciating;
Real data=4 "default value";
end R;
model Test
parameter Integer n=2;
parameter Real differenciatingValues[n]={1.2,2.3};
parameter R r[n] ={ R(differenciating=differenciatingValues[i]) for i in 1:n};
end Test;
但在界面上我得到这个结果,无法使用:

有没有可行的变通方法来实现这一点?
我期望在界面中看到如下效果:

解决方案
你的第一种解决方案几乎可行。
fixed 属性是内置类型 Real 的一部分,而不是记录。
所以我们不能在实例 r 上应用 fixed=false,而应在记录定义中的 differenciating 上应用,它是一个 Real。
工作示例如下所示:
package Demo
record R "record"
parameter Real differenciating(fixed=false);
Real data=4 "default value";
end R;
model Test
parameter Integer n=2;
parameter Real differenciatingValues[n]={1.2,2.3};
parameter R r[n] "vector of record"; //
initial algorithm
for i in 1:n loop
r[i].differenciating := differenciatingValues[i];
end for;
end Test;
end Demo;
我将 differenciating 设为参数,因为整个记录被实例化为参数。这在作为参数实例化的情况下不应该有问题。在这个小示例中也可以在没有 parameter 的情况下工作,但我不确定在一般情况下这是否正确。
编辑
关于 parameter 对 differenciating:看起来没有它也能工作很奇怪。甚至当 r 不是参数时也能工作。一般而言,连续时间变量的初始方程或初始算法并不足够。见下面的代码,对于 x 会报错,y 作为参数时没有问题。
model UnnamedC
Real x(fixed=false);
parameter Real y(fixed=false);
initial algorithm
x :=1;
y :=1;
end UnnamedC;
也许记录的处理方式不同,但对于参数来说一切都定义清晰,因此如果可能的话,我会把 differenciating 改成参数。