我有一个小的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,但仍然无法正常工作。 任何帮助将不胜感激。
答案 0 :(得分:3)
通过以下更改,您可能会发现您的代码可以正常工作
您没有大小可变的数据,可以将所有这些选项设置回其默认值。
(如其他答案之一所示),您需要更改输入x
输入方程式的方式,因为此刻它还不用于计算xdot
将x1
,x2
和x3
移动为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);
我假设您现在拥有的值是微分方程的初始条件,您必须在积分器块中进行设置。