dn62038607 发表于 2009-3-25 19:51

出错了,请高手找一下。

我是MATLAB的菜鸟,但是设计要用MATLAB编程。
这是程序:
clear all; close all;
ts=0.001; j=5.15;x1=2.8;x3=1.8;   %3个系统参数
t=input('单参数t=');
num=; den=; sys=tf(num,den,'inputdelay',x1);%被控系统模型
dsys=c2d(sys,ts,'z'); =tfdata(dsys,'v');      %离散化
u_1=0; u_2=0; u_3=0; y_1=0; y_2=0; y_3=0; du_1=0; du_2=0; %初始化
x='; error_1=0; error_2=0; error_3=0;
for k=1:1:1000
time(k)=k*ts;   rin(k)=1.0;
Tf=t^2/(2*t+x1/2); Ti=x1/2+x3; Td=x1*x3/2*Ti; Kc=Ti/j*(2*t+x1/2);
B1=Tf/(Tf+x3);B2=Kc*x3*(1+x3/Ti+Td/x3)/(Tf+x3);
B3=Kc*x3*(1+2*Td/x3)/(Tf+x3); B4=Kc*Td/(Tf+x3);
du=B1*x(1)+B2*x(2)+B3*x(3)+B4*x(4);
u=du+u_1;
if u(k)>=10, u(k)=10; end
if u(k)<=-10, u(k)=-10; end
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
error=rin(k)-yout(k);
u_3=u_2; u_2=u_1; u_1=u(k); y_3=y_2; y_2=y_1; y_1=yout(k);
du_2=du_1; du_1=du;
x(1)=du_1; x(2)=error; x(3)=error_1; x(4)=error_2;
error_3=error_2; error_2=error_1; error_1=error;
end
plot(time,rin,'b',time,yout,'r'); xlabel('time(s)'); ylabel('rin,yout');

报错:
Index exceeds matrix dimensions.
索引超出矩阵范围

找不到是什么地方。请高手帮我看一下哪点有错了

[ 本帖最后由 ChaChing 于 2009-3-25 23:52 编辑 ]

ChaChing 发表于 2009-3-25 23:53

看下
http://forum.vibunion.com/forum/viewthread.php?tid=46001&highlight=%2Beight

yufeng 发表于 2009-3-26 08:18

yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的

dn62038607 发表于 2009-3-26 08:33

原帖由 ChaChing 于 2009-3-25 23:53 发表 http://www.chinavib.com/forum/images/common/back.gif
看下
http://www.chinavib.com/forum/viewthread.php?tid=46001&highlight=%2Beight



这个帖子12楼的东西之前就看过了,我再去找一下。。

dn62038607 发表于 2009-3-26 08:34

原帖由 yufeng 于 2009-3-26 08:18 发表 http://www.chinavib.com/forum/images/common/back.gif
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的
谢谢了,我才学MATLAB,什么都不懂

dn62038607 发表于 2009-3-26 08:51

忘记说了,这是个 单参数PID控制方法的例子,控制方法是先系统辨识,系统模型是一阶纯滞后。判断误差极性。单调单参数T(这个T只是个字母代号),用T和辨识出的一阶纯滞后模型的3个参数来确定PID控制器。
Tf=t^2/(2*t+x1/2);
Ti=x1/2+x3;
Td=x1*x3/2*Ti;
Kc=Ti/j*(2*t+x1/2);
Cs=Kc*(1+1/Ti*s+Td*s)/(Tf*s+1);
B1=Tf/(Tf+x3);
B2=Kc*x3*(1+x3/Ti+Td/x3)/(Tf+x3);
B3=Kc*x3*(1+2*Td/x3)/(Tf+x3);
B4=Kc*Td/(Tf+x3);
du=B1*du_1+B2*error+B3*error_1+B4*error_2;

ChaChing 发表于 2009-3-26 09:16

num=; den=; ...yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
哪里来的num(3), num(2) ...

dn62038607 发表于 2009-3-26 09:22

原帖由 yufeng 于 2009-3-26 08:18 发表 http://www.chinavib.com/forum/images/common/back.gif
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的
这个句子是什么意思啊?我完全不知道

dn62038607 发表于 2009-3-26 09:38

谢谢 ChaChing。我确实是个MATLAB的菜鸟,你可以看到的还出这样的错。

dn62038607 发表于 2009-3-26 11:08

经过查资料
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
这样的式子是被控对象Z变换后离散化得到的,

不知道上面的说法是否正确。
还又就是一阶滞后系统的Z变换后离散化得到的式子是
yout(k)=-den(2)*y_1+num(2)*u_5

ChaChing 发表于 2009-3-26 11:12

回复 9楼 dn62038607 的帖子

谁不是菜鸟过来的!:@)
页: [1]
查看完整版本: 出错了,请高手找一下。