如何在记录向量中为某个字段赋予不同的值

编程语言 2026-07-12

我有一个具有默认参数值的系统记录。为了构建系统向量,我需要一个记录向量。我希望能够通过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;

但在界面上我得到这个结果,无法使用:

图片显示,在参数界面中,单元格具有循环索引的值

有没有可行的变通方法来实现这一点?

我期望在界面中看到如下效果:

图片显示,在参数界面中,区分性单元格的值来自向量 differenciatingValues 的正确数值

解决方案

你的第一种解决方案几乎可行。

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 的情况下工作,但我不确定在一般情况下这是否正确。

编辑

关于 parameterdifferenciating:看起来没有它也能工作很奇怪。甚至当 r 不是参数时也能工作。一般而言,连续时间变量的初始方程或初始算法并不足够。见下面的代码,对于 x 会报错,y 作为参数时没有问题。

model UnnamedC
  Real x(fixed=false);
  parameter Real y(fixed=false);
initial algorithm 
  x :=1;
  y :=1;
end UnnamedC;

也许记录的处理方式不同,但对于参数来说一切都定义清晰,因此如果可能的话,我会把 differenciating 改成参数。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章