Simulink无法确定模块“ MATLAB功能”的输出大小和/或类型

时间:2018-11-18 20:02:58

标签: matlab simulink

我有一个小的Simulink模型,如下所示:

enter image description here

和代码:

function [xdot,y] = fcn(x,u)

    % define your constants
    g = 9.81;
    m = 0.05;
    R = 1;
    L = 0.01;
    C = 0.0001; 
    x1 = 0.012;
    x2 = 0;
    x3 = 0.84;

    % nonlinear set of equations
    xdot = [x2; g-((C/m)*(x3/x1)^2); -((R/L) +(((2*C)/L)*(((x2*x3)/((x1)^2)))))] + [0;0;1/L]*u;

    y = x';   

但是,当我尝试运行时,Simulink会产生以下错误:

  

数据“ y”的推断大小(“ [1 3]”)与指定大小不匹配   (“标量”)。组件:MATLAB函数|类别:编码器错误Simulink   无法确定块'MATLAB的输出大小和/或类型   功能'是由于块体中的错误或限制   基础分析。错误可能不准确。修正指示   错误,或为所有块明确指定尺寸和/或类型   输出。

我在一些文档中搜索了variable size inputs and outputs,选中了变量大小复选框,并在上限处输入了[1 3]。

当我再次尝试运行时,我得到:

  

对于数据“ y”的最大值,表达式“ [1 3]”必须计算为标量。

我不确定如何解决此错误。我也查看了here,但仍然无法正常工作。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

通过以下更改,您可能会发现您的代码可以正常工作

  • 您没有大小可变的数据,可以将所有这些选项设置回其默认值。

  • (如其他答案之一所示),您需要更改输入x输入方程式的方式,因为此刻它还不用于计算xdot

  • x1x2x3移动为Integrator块的初始条件的3比1向量。 (假设这就是它们的真实含义。)

在进行了这些更改之后,该块应检测到x信号是3比1(因为Integrator块具有3个初始值),因此您的xdot输出为3-by-1,而您的y输出是1-by-3。

为了安全起见,您还可以考虑将以下两行放在函数顶部。

xdot = zeros(3,1);
y = zeros(1,3);

在块初始化期间将使用这些行来告诉编译器输出信号的大小。

注意:为什么将y设为1×3向量?这是非常不寻常的,我怀疑您真的希望它是3比1向量(如果要输出状态),应该对x的值求和得到y,在这种情况下,它只是一个标量。

与上述内容无关,但您也可以考虑在块中设置常量参数,以便无需编辑功能即可更改它们。

答案 1 :(得分:2)

我认为您必须像尝试过的那样,在端口和数据管理器中为功能块的所有输入和输出设置大小设置。

y的大小设置为[1 3],将x的大小设置为[3 1],将xdot的大小设置为[3 1]

此外,我认为您的非线性状态空间有一个错误,因为您的“ A”矩阵现在是常数。因此,要使它们依赖于当前状态,请将x1等的声明替换为:

x1 = x(1);
x2 = x(2);
x3 = x(3); 

我假设您现在拥有的值是微分方程的初始条件,您必须在积分器块中进行设置。