未定义的函数或变量

时间:2014-11-10 16:24:01

标签: matlab

我有一个简单的功能如下:

function  dz = statespace(t,z)
dz = A*z + B*k*z
end

我的主要脚本是:

clear all;close all;format short;clc;
% step 1 -- input system parameters 
% structure data
M1 = 1; M2= 1; M3= 1;                         %Lumped Mass(Tons)
M= diag([M1,M2,M3]);
k(1)= 980; k(2)= 980; k(3)= 980;              %Stiffness Coefficient(KN/M)
K = zeros(3,3);
for i=1:2
K(i,i)=k(i)+k(i+1);
end
K(3,3)=k(3);
for i=1:2
K(i,i+1)=-k(i+1);
end
for i=2:3
K(i,i-1)=-k(i);
end                                           %Stiffness Matrix(KN/M)
c(1)= 1.407; c(2)= 1.407; c(3)= 1.407;        %Damping Coefficient(KN.sec/M)
C = zeros(3,3);
for i=1:2
C(i,i)=c(i)+c(i+1);
end
C(3,3)=c(3);
for i=1:2
C(i,i+1)=-c(i+1);
end
for i=2:3
C(i,i-1)=-c(i);
end                                           %Damping Matrix(KN.sec/M)
 A = [zeros(3) eye(3);-inv(M)*K -inv(M)*C]
 H = [1;0;0]
 B = [0;0;0;inv(M)*H]
 k = [-1 -1 -1 -1 -1 -1]
 t = 0:0.004:10; 
 [t,z] = ode45(statespace,t);

当我运行我的主脚本时,会出现以下错误:

Undefined function or variable 'A'.

Error in statespace (line 2) dz = A*z + B*k*z

如您所见,我在主脚本中定义了A。为什么会出现这个问题?

2 个答案:

答案 0 :(得分:0)

您的代码存在多处问题。首先,您需要为您的函数提供A和B的值,但是当您在工具箱ode45中调用它时(错误地没有@和附加参数y0,如下所述),您必须保留两个参数,这样您就不能提供A和B作为附加参数。如果您在函数中定义A和B或通过全局变量共享它们,您将获得更多。但是,如下所述,定义似乎不正确,因为A * z和B * k * z不具有相同的尺寸。 z是标量,因此B * k需要与A相同的大小和形状,而目前它不是。

编辑自: 正如Jubobs建议改变你的功能参数,包括A,B和k。你也不需要因为它从未在函数中使用过。所以:

function  dz = statespace(A, B, k, z)
   dz = A*z + B*k*z
end 

答案 1 :(得分:0)

正如其他人所指出的,ABk未在函数工作空间中定义,因此您需要再次定义它们(丑陋,不推荐),声明它们作为全局变量(稍好一些,但仍然不是很好的做法),或者将它们作为参数传递给你的函数(更好的解决方案)。但是,因为您希望将该函数与ode45一起使用,所以您需要对如何执行此操作时要小心:

function  dz = statespace(t,z,A,B,k)
   dz = A*z + B*k*z
end 

然后调用ode45就是这样:

[t,z] = ode45(@(t,z)statespace(t,z,A,B,k),[0 Tf],z0); % where Tf is your final time and z0 your initial conditions

有关类似问题,请参阅Error using ode45 and deval

相关问题