我有一个小的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‘的推断大小(’13‘)与指定大小(’标量‘)不匹配。组件:MATLAB函数类:编码器错误Simulink无法确定块“MATLAB函数”的输出大小和/或类型,原因是块体中的错误或底层分析的局限性。这些错误可能是不准确的。修正指定的错误,或显式指定所有块输出的大小和/或类型。
我搜索了一些可变大小输入和输出文档,选中了“可变大小”复选框,并将上限输入为1 3。
当我再次尝试跑步时,我得到:
表示数据'y‘最大值的表达式’1-3‘必须计算成标量。
我不知道如何解决这个错误。我也看上去像这里,但还是不能让它工作。任何帮助都将不胜感激。
发布于 2018-11-18 22:15:59
您可能会发现,您的代码将通过进行以下更改来工作,
x进入方程的方式,因为目前它还没有被用来计算xdot。x1、x2和x3移动为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,在这种情况下,它只是一个标量。
与上面的内容无关,但您也可以考虑为块设置常量参数,这样就可以在不编辑函数的情况下更改它们。
https://stackoverflow.com/questions/53364909
复制相似问题