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

问题描述 投票:0回答:2

似乎有多个人对此有麻烦,但是没有一种变通办法对我有用。

我正在使用Simulink 8.4的Matlab 2014b。我正在解决描述涡轮增压发动机的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仍然为零..

我非常感谢您对此提供的意见!

matlab compiler-errors simulink
2个回答
2
投票

http://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation--categorical-list.html#bq1h2z8-25中有关MATLAB编码器中root函数的文档,root的输出始终是可变大小且复杂的。这说明了错误以及示例的输出。您可能希望将条件从isreal更改为与复杂零件的0比较,同时注意一些公差。例如,>

abs(imag(r(1))) < eps(r(1))
© www.soinside.com 2019 - 2024. All rights reserved.