simulink(matlab 函数块)中可变大小矩阵导致的编译错误

Compiling error due to variable size Matrix in simulink (matlab function block)

看起来很多人都遇到了这个问题,不过 none 的解决方法对我有用。

我正在使用 Matlab 2014b 和 Simulink 8.4。 我正在解决描述涡轮增压发动机的 DAE 系统。该系统由 4 个方程组成,其中 2 个是 DAE,2 个是 ODE。对于 DAE,我尝试使用 Algebraic Constraint Block,但无法正确模拟。这两个 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 保持为零..

非常感谢您对此的投入!

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

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