Modelica中方程中while循环的语法?

Jon*_*nas 2 modelica openmodelica dymola

我正在尝试equation在模型的部分内实现一个简单的迭代猜测方案,但是,我收到以下错误:No viable alternative near token: while在 OpenModelica 中。为什么这个while循环不起作用有一个简单的解释?

while hf>=dh loop
   v_guess = v_guess*0.95;  
   f_guess = Functions.f_Haaland(v=v_guess, D=d, rho=rho, mu=mu, eps=roughness);
   hf = Functions.H_f(f=_guess, L=length, D=d, v=v_guess, g=system.g);
end while;
Run Code Online (Sandbox Code Playgroud)

说,

  • 高频=11
  • dh=10
  • v_guess=1

我想要的是 v_guess 变得越来越小,直到 hf 大约等于 dh。然后我将在模型的下一步中使用 v_guess,因为它接近于 dh 处发生的真实 v。我也对 for-loops 和 break 进行了同样的尝试,但无济于事。

我正在查看 while 循环的语法,它看起来完全相似。我的计划有什么根本问题,我看不到吗?

Han*_*son 7

Modelica 有方程和算法。算法的工作方式与大多数语言类似,并允许使用 while 循环。

方程总是有效且无序的,所以如果你写v_guess = v_guess*0.95;它意味着v_guess应该总是有这个值 - 只有解v_guess=0- 这可能不是你想要的。

您可以在方程式中使用 for 循环,但这是为了处理数组,其中数组中的每个元素都有一个单独的方程式 - 编写得紧凑。

所以,如果你想写一个while循环,要么直接把它写在算法部分,要么把它隐藏在一个函数中。

algorithm
 while hf>=dh loop
   v_guess := v_guess*0.95;  
   f_guess := Functions.f_Haaland(v=v_guess, D=d, rho=rho, mu=mu, eps=roughness);
   hf := Functions.H_f(f=_guess, L=length, D=d, v=v_guess, g=system.g);
end while;
Run Code Online (Sandbox Code Playgroud)

(请注意,应该:=在算法和=方程中强调这种差异,大多数工具都会处理这两种情况。)

补充:请注意,一个模型中可以有多个算法部分,因此您可以有几个方程、一个算法部分、另一个算法部分,然后是更多的方程。拥有多个算法部分的好处是每个部分都按顺序执行,但它们可以自由重新排列。