声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2097|回复: 10

[编程技巧] 出错了,请高手找一下。

[复制链接]
发表于 2009-3-25 19:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我是MATLAB的菜鸟,但是设计要用MATLAB编程。
这是程序:
clear all; close all;
ts=0.001; j=5.15;x1=2.8;x3=1.8;   %3个系统参数
t=input('单参数t=');
num=[j]; den=[x3 1]; sys=tf(num,den,'inputdelay',x1);  %被控系统模型
dsys=c2d(sys,ts,'z'); [num,den]=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=[0,0,0,0,0]'; 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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-3-25 23:53 | 显示全部楼层
发表于 2009-3-26 08:18 | 显示全部楼层
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的
 楼主| 发表于 2009-3-26 08:33 | 显示全部楼层
 楼主| 发表于 2009-3-26 08:34 | 显示全部楼层
原帖由 yufeng 于 2009-3-26 08:18 发表
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的

谢谢了,我才学MATLAB,什么都不懂
 楼主| 发表于 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;
发表于 2009-3-26 09:16 | 显示全部楼层
num=[j]; den=[x3 1]; ...yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
哪里来的num(3), num(2) ...
 楼主| 发表于 2009-3-26 09:22 | 显示全部楼层
原帖由 yufeng 于 2009-3-26 08:18 发表
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
别人的程序要做修改的

这个句子是什么意思啊?我完全不知道
 楼主| 发表于 2009-3-26 09:38 | 显示全部楼层
谢谢 ChaChing  。我确实是个MATLAB的菜鸟,你可以看到的还出这样的错。
 楼主| 发表于 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
发表于 2009-3-26 11:12 | 显示全部楼层

回复 9楼 dn62038607 的帖子

谁不是菜鸟过来的!:@)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 17:30 , Processed in 0.073991 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表