提问人:kunal 提问时间:9/26/2023 更新时间:9/27/2023 访问量:48
在打开的modelica中,当输出达到特定值时,是否有任何关键字会终止或停止仿真?
Is there any keyword that will terminate or stop the simulation when the output reaches a specific value in open modelica?
问:
我想在我的输出达到某个限制或值时停止模拟,而不管模拟时间如何。举个例子,我的输出是“prod”一个变量,其中存储了两个数字的乘积。如果两个数字的乘积大于 12,则无论数组中剩余的其他值如何,模拟都必须停止。
在Open Modelica中是否有任何关键字可以做到这一点?我尝试使用 break and terminate 命令,但 3 秒后 prod 的输出达到 12,然后绘图继续 5 秒(这是模拟时间),并且存储在 prod 中的值为零。我希望我的模拟停止,乘积为 12,它不应该在那之后计算乘积,也不应该在图中显示这些值。
model ForLoopExample;
Real A[5] = {1,2,3,4,5};
Real B[5] = {2,3,4,5,6};
Real prod[5];
Boolean test_case(start = false);
algorithm
for i in 1:size(A,1) loop
prod[i]:=A[i]*B[i];
if prod[i]>=12 then
test_case = true;
break;
end if;
end for;
when test_case then
terminate("product above 12");
end when;
end ForLoopExample;
答:
0赞
janpeter
9/27/2023
#1
这是一个有点棘手的例子,因为它涉及对 Modelica 和时间的理解以及算法和方程之间的区别。代码按预期工作(如果您只是调整代码text_case := true)。该算法在模拟的一开始就完成所有计算,并且不会“花费时间”。您需要使系统时间离散,并且对于每个采样间隔(例如 1 秒),您进行一轮计算。
我已经将您的代码粗略地翻译为时间离散系统。我让 A 和 B 的索引表示时间 1、2,..5 秒,因此我们得到每个 samplePeriod 的 A 和 B 值。
当 prod = 12 时,此算法有效并在 time=3 处停止,即大于或等于 12。一般来说,我不希望有测试两个实数相等的代码,但我让它保持原样。
这是否捕获了您想要的内容?
model ForLoopExample
parameter Real samplePeriod = 1;
parameter Real A[5] = {1,2,3,4,5};
parameter Real B[5] = {2,3,4,5,6};
Real prod (start=0, fixed=true);
Boolean test_case(start = false, fixed=true);
equation
when sample(0, samplePeriod) then
prod = A[integer(time)]*B[integer(time)];
test_case = prod >= 12;
end when;
when test_case then
terminate("product above 12");
end when;
end ForLoopExample;
评论
0赞
kunal
9/27/2023
谢谢你,它奏效了。我还有另一个疑问,假设我的代码中没有包含时间。我的两个数字的乘积不必是 1 秒、2 秒等。仿真间隔保留为仿真设置中的标准开始和停止时间。那么,当我的产品高于 12 时,我如何让我的模拟停止呢?我不想看到参数 prod 的图形显示 12 之后的值。我必须坚持按照你建议的同样方式去做吗?
0赞
janpeter
9/27/2023
好。我想我需要了解“潜在问题”才有意义。关键是仿真时间对问题意味着什么,对你来说?A 和 B 是像您的示例中那样在开始时整体给出的,或者它们是一个时间序列,因此以规则的间隔出现一对(A,B),或者可能不是那么规则但仍然成对?
0赞
kunal
9/27/2023
好吧,它们不是时间序列。它们只是两个数组,每个数组包含 5 个数字,我想找到两个数组的乘积,例如 A[1]*B[1]、A[2]*B[2] 等,这就是你所说的对的意思吗?为了进一步学习modelica,我决定看看在我的两者的乘积达到一定值后是否可以停止模拟。
0赞
janpeter
9/28/2023
是的,你明白我对成对的意思,对吧。而且你想使用Modelica来做算法部分,而不是真正模拟任何时间,对吧?
1赞
kunal
9/28/2023
谢谢,我会研究这些建议。
下一个:根据用户请求取消输入命令
评论