【问题标题】:Compiling error due to variable size Matrix in simulink (matlab function block)由于 simulink(matlab 功能块)中的可变大小矩阵导致编译错误
【发布时间】:2020-03-11 00:49:45
【问题描述】:

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

我正在使用带有 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... ..

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

【问题讨论】:

  • 你得到的错误:Data 'x_4' ...是因为在simulink的Matlab嵌入式代码块中,所有的变量都应该被初始化,并且它们的大小在块内不能改变。另外,我很确定您的第一个代码和第二个代码不会输出相同的内容。
  • 嘿安德,我跳过了第二个代码的前三行,因为它们是相同的。现在改变了。你还觉得输出应该不一样吗?关于错误消息,我也可以在第一个代码中初始化 x_4。问题是 Matlab 在编译时不知道 posR 的大小,但我知道它始终是单个标量。

标签: matlab compiler-errors simulink


【解决方案1】:

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

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

【讨论】:

  • 解决了这个问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多