Персистентная переменная в ангеловой петле Симулинка - PullRequest
0 голосов
/ 15 января 2019

У меня есть замкнутый цикл в Simulink, который выглядит следующим образом:

enter image description here

Блок 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 каким-либо другим способом, который разрешит постоянную переменную.

Оба они я пытался пару раз безуспешно.

Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 16 января 2019

Из кода, который вы показали, не понятно, зачем вам вообще нужен Tgo2. Похоже, должно работать следующее.

function Tgo = fcn(g,r,v,vw,rho_u,rho,a,cd,m)

Tgo = 0;
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

Tgo = max(real((Real_tgo));
...