我已经在一个类的算法部分中实现了一个延迟运算符,如下面的测试用例所示,但是在Open modelica中执行代码期间,我遇到了以下错误。我该如何解决该问题?
model test3
Real x=sin(377*time);
Real z;
parameter Real tau[:]={0.01,0.02};
equation
algorithm
for k in 1: 2 loop
z:=delay(x,tau[k]);
end for;
end test3;
答案 0 :(得分:2)
看起来像一个工具问题。另一方面,为什么您要为k = 1计算z却从不使用呢?
答案 1 :(得分:2)
仔细研究一下,我意识到以下组合会阻止您的模型进行翻译:
因此,您必须摆脱其中任何一个。
如果您事先知道tau[:]
的大小,请使用分隔行来计算z
,而不是for循环:
model sep_lines
Real x = sin(8 * time);
Real z[2];
parameter Real tau[2] = {0.02, 0.01};
equation
algorithm
z[1] := delay(x, tau[1]);
z[2] := delay(x, tau[2]);
end sep_lines;
也许您可以使用等式部分而不是算法节部分。然后,您根本不需要for循环,因为如果需要,函数调用(在这种情况下为delay
)会自动向量化。您的代码将减少为:
model eqs
Real x = sin(8 * time);
Real z[3];
parameter Real tau[3] = {0.03, 0.02, 0.01};
equation
z = delay(x, tau);
end eqs;
如果将for循环替换为 while循环,则模型会进行翻译和模拟。但是延迟信号z[1]
不正确,并且误差随x
的频率而增加。在1 Hz之类的低频下,它几乎看不见,但是频率例如20 Hz幅度是错误的。因此,不要被这个解决方案所欺骗。
model while_ "Compiles, but the amplitude of z[1] is wrong"
Real x = sin(2*Modelica.Constants.pi * 20 * time);
Real z[size(tau, 1)];
parameter Real tau[:] = {0.02, 0.01};
protected
Integer i;
algorithm
i := 0;
while i < size(tau, 1) loop
i := i + 1;
z[i] := delay(x, tau[i]);
end while;
end while_;
答案 2 :(得分:1)
这是OpenModelica中的错误。已为其创建票证:https://trac.openmodelica.org/OpenModelica/ticket/5572