【问题标题】:Simulink cannot determine sizes and/or types of the outputs for block 'MATLAB Function'Simulink 无法确定模块“MATLAB Function”的输出大小和/或类型
【发布时间】:2019-04-21 05:44:04
【问题描述】:

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

以及相应的代码:

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,但仍然无法让它工作。 任何帮助将不胜感激。

【问题讨论】:

    标签: matlab simulink


    【解决方案1】:

    您可能会发现您的代码可以通过进行以下更改来工作,

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

    • (如其他答案之一所示,)您需要更改输入 x 进入方程的方式,因为目前它不习惯于计算 xdot

    • x1x2x3 移动为Integrator 块的初始条件的3×1 向量。 (假设这就是他们的真实情况。)

    通过这些更改,块应该检测到 x 信号是 3×1(因为 Integrator 块有 3 个初始值),因此您的 xdot 输出是 3×1 并且您的 y 输出为 1×3。

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

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

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

    注意:你为什么要制作 y 一个 1×3 向量?这很不寻常,我怀疑你真的希望它是一个 3×1 向量(如果你想输出状态)或者你应该总结 x 的值来得到y 在这种情况下它只是一个标量。

    与上述无关,但您也可以考虑制作块的 constants 参数,以便您可以在不编辑函数的情况下更改它们。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-04-22
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多