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

Syntax for while loop in equation in Modelica?

我正在尝试在模型的 equation 部分内实施一个简单的迭代猜测方案,但是,我收到以下错误:OpenModelica 中的 No viable alternative near token: while。对于为什么这个 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;

说,

我要的是v_guess越来越小,直到hf约等于dh。然后我将在我的模型的下一步中使用 v_guess,因为它接近 dh 处出现的真实 v。我也用 for-loops 和 break 做了同样的尝试,但没有用。

我正在查看 while 循环的语法,它看起来非常相似。我的方案是否有任何我看不到的基本问题?

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;

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

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