У меня есть замкнутый цикл в Simulink, который выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/IVkh4.png)
Блок Tgo
(отмечен красным) является функцией matlab, которая в основном вычисляет полиномиальные корни и возвращает наибольший действительный корень и выглядит следующим образом:
function Tgo = fcn(g,r,v,vw,rho_u,rho,a,cd,m)
persistent Tgo2
Real_tgo = [0 + 0i,0 + 0i,0 + 0i,0 + 0i];
more lines for polynomial...
rr = roots(poly);
for k = 1:4
if abs(imag(rr(k))) < 0.001
Real_tgo(k) = rr(k);
else
Real_tgo(k) = 0;
end
end
Tgo2 = real(max(Real_tgo));
Tgo = Tgo2;
В этом блоке мне пришлось использовать persistent variable
, поскольку он не позволил бы мне получить реальный ответ. (Постоянно говорилось, что мне нужно определить тип и размер выходных данных, и только постоянная переменная решила это для меня).
Однако, когда я хотел бы использовать замкнутый цикл, используя if block/ if action subsystem
, я получаю следующую ошибку:
updates persistent or state variables while computing outputs, therefore it cannot be used in an algebraic loop. However, it is in a loop with the following blocks.
Так что, в принципе, из того, что я понимаю, могут быть два решения:
1) Так или иначе, чтобы избежать использования постоянной переменной и все же получить значение из блока Tgo, которое не будет тем, которое я должен был предварительно определить.
2) Выполнить условие if каким-либо другим способом, который разрешит постоянную переменную.
Оба они я пытался пару раз безуспешно.
Буду признателен за любую помощь.
Спасибо.