首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angebric循环Simulink中的持久变量

angebric循环Simulink中的持久变量
EN

Stack Overflow用户
提问于 2019-01-16 03:35:31
回答 1查看 261关注 0票数 0

我在simulink中有一个闭环,如下所示:

Tgo (用红色标记)是matlab函数,它基本上计算多项式根并返回最大实根,如下所示:

代码语言:javascript
复制
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的闭环时,我得到了以下错误:

代码语言:javascript
复制
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条件,以允许持久变量。

这两个我都试过几次,但都没有成功。

任何帮助都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-01-16 12:15:53

从您所展示的代码中,根本不清楚为什么需要Tgo2。看起来下面的方法应该是可行的。

代码语言:javascript
复制
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));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54205715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档