由simulink中的可变大小矩阵编译错误(matlab功能块)

时间:2015-01-26 10:59:49

标签: matlab compiler-errors simulink

看起来很多人都遇到了这个问题,但是没有一个解决方法对我有用。

我正在使用Matlab 2014b和Simulink 8.4。 我正在解决一个描述涡轮增压发动机的DAE系统。该系统由4个方程组成,其中2个是DAE,2个是ODE。对于我尝试使用代数约束块的DAE,虽然无法使其正确模拟。两个DAE的形式如下: x = 0时的6次多项式,并且在模拟的每个步骤中计算系数。我知道系数在一个范围内,这个范围只导致多项式的一个实正根。那就是我要找的那个。

尝试以下代码:

function x_4 = fcn(A, B)
c = [1, -1, 2*B, -2*B, B^2, -B^2, -A^2];
r = roots(c);

realR = r(imag(r)==0);
posR = realR(realR>0);
x_4 = posR^0.25;

此错误消息是

Data 'x_4' is inferred as a variable size matrix, while its specified type is something else.

An error occurred while propagating data type 'double' through 'gleichungssystem_poly/Gleichung 4/x_4_calc/A'.

我也试过这段代码:

function x_4 = fcn(A, B)
c = [1, -1, 2*B, -2*B, B^2, -B^2, -A^2];
r = roots(c);

x_4 = zeros(1);
if isreal(r(1)) && real(r(1))>0
   x_4 = r(1)^0.25;
elseif isreal(r(5)) && real(r(5))>0
    x_4 = r(5)^0.25;
elseif isreal(r(2)) && real(r(2))>0
    x_4 = r(2)^0.25;
elseif isreal(r(3)) && real(r(3))>0
    x_4 = r(3)^0.25;
elseif isreal(r(4)) && real(r(4))>0
    x_4 = r(4)^0.25;
elseif isreal(r(6)) && real(r(6))>0
    x_4 = r(6)^0.25;
end

也在for循环中尝试了整个事情。有趣的是它让我编译和模拟模型,但x_4永远不会是任何东西,但初始化为0 ...我在调试模式中查看精确计算,其中一个根满足条件,但x_4保持为零..

我真的很感激这一点的输入!

1 个答案:

答案 0 :(得分:2)

http://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation--categorical-list.html#bq1h2z8-25的文档中,对于MATLAB编码器中的根函数,根的输出总是可变大小和复杂的。这解释了错误和示例的输出。您可能希望将条件从isreal更改为复杂零件的0比较,同时注意一些公差。例如,

abs(imag(r(1))) < eps(r(1))