dn62038607 发表于 2009-4-20 10:54

用了1个月的MATLAB才发现最基本的都没理解

M-file:
function =xishu(a,b,c,t)
Tf=t^2/(2*t+b/2); Ti=b/2+a; Td=b*a/2*Ti; Kc=Ti/c*(2*t+b/2);
B1=Tf/(Tf+a);B2=Kc*a*(1+a/Ti+Td/a)/(Tf+a); B3=Kc*a*(1+2*Td/a)/(Tf+a);
B4=Kc*Td/(Tf+a);             %计算式子系数

主程序段:
clear all; close all; ts=0.01;
a=1.8;b=2.8;c=5.15;   %3个系统参数 a时间常数 b纯滞后时间 c稳态增益
t=input('单参数t=');   %输入单参数
sys=tf(c,,'inputdelay',b);%被控系统模型
dsys=c2d(sys,ts,'zoh'); =tfdata(dsys,'v');      %离散化
u_1=0.0; u_2=0.0; u_3=0.0; u_4=0.0; u_5=0.0; y_1=0.0; y_2=0.0; y_3=0.0;
du_1=0.0; du_2=0.0; %初始化
error_1=0; error_2=0; error_3=0;
for k=1:1:1000
time(k)=k*ts; rin(k)=0.02;   
=xishu(a,b,c,t)             %计算式子系数
du=B1*du_1+B2*error+B3*error_1+B4*error_2;
u=du+u_1;    %计算PID控制信号
if u(k)>=110, u(k)=110; end
if u(k)<=-110, u(k)=-110; end             %处理PID控制信号
yout(k)=-den(2)*y_1+num(2)*u_5;
error=rin(k)-yout(k);
u_5=u_4; u_4=u_3; 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;
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');

输入:
单参数t=1.0
Warning: Variable 'error' has been previously used as a function name.
(Type "warning off MATLAB:mir_warning_variable_used_as_function" to suppress this warning.)
结果:
B1 =
3.9667e-004

B2 =
1.6800e+007

B3 =
3.3591e+007

B4 =
1.6793e+007

??? Error using ==> error
Too many output arguments.

结果中的B1,B2,B3,B4是不是没理解最基本的矢量和向量,矩阵.
   请教以下MATLAB编程的高手,

[ 本帖最后由 ChaChing 于 2009-4-28 20:49 编辑 ]

ChaChing 发表于 2009-4-20 12:00

没空细看! 又没LZ的logic过程, 仅改至有结果!
clear all; close all; ts=0.01;
a=1.8;b=2.8;c=5.15;   %3个系统参数 a时间常数 b纯滞后时间 c稳态增益
t=input('单参数t=');   %输入单参数
sys=tf(c,,'inputdelay',b);%被控系统模型
dsys=c2d(sys,ts,'zoh');
=tfdata(dsys,'v');      %离散化
u_1=0.0; u_2=0.0; u_3=0.0; u_4=0.0; u_5=0.0; y_1=0.0; y_2=0.0; y_3=0.0;
du_1=0.0; du_2=0.0; %初始化
error_1=0; error_2=0; error_3=0;
for k=1:1:1000
time(k)=k*ts;   rin(k)=0.02;   
=xishu(a,b,c,t) ;            %计算式子系数
du=B1*du_1+B2*error_1+B3*error_2+B4*error_3;
u=du+u_1;    %计算PID控制信号
if u>=110, u=110; end
if u<=-110, u=-110; end             %处理PID控制信号
yout(k)=-den(2)*y_1+num(2)*u_5;
error=rin(k)-yout(k);
u_5=u_4; u_4=u_3; u_3=u_2; u_2=u_1; u_1=u;
y_3=y_2; y_2=y_1; y_1=yout(k);
du_2=du_1; du_1=du;
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');

dn62038607 发表于 2009-4-28 10:29

function =xishu(a,b,c,t)
Tf=t^2/(2*t+b/2); Ti=b/2+a; Td=b*a/2*Ti; Kc=Ti/c*(2*t+b/2); B1=Tf/(Tf+a);
B2=Kc*a*(1+a/Ti+Td/a)/(Tf+a); B3=Kc*a*(1+2*Td/a)/(Tf+a); B4=Kc*Td/(Tf+a); %计算式子系

这一段程序是:
Tf=t^2/(2*t+b/2); Ti=b/(2+a); Td=b*a/2*Ti; Kc=Ti/(c*(2*t+b/2)); B1=Tf/(Tf+a);
B2=Kc*a*(1+a/Ti+Td/a)/(Tf+a); B3=Kc*a*(1+2*Td/a)/(Tf+a); B4=Kc*Td/(Tf+a);

发现需要注意的就是分母的括号问题,,,
先试一下,,,谢谢了ChaChing

[ 本帖最后由 ChaChing 于 2009-4-28 20:54 编辑 ]

dn62038607 发表于 2009-4-28 19:09

回复 沙发 ChaChing 的帖子

谢谢ChaChing,
程序改了可以用了,还需要一些调整才能达到需要的效果,
这个程序是 上海交通大学张卫东 的发明专利《工业过程单参数比列积分微分控制方法》,这一段只是控制方法的程序,还需要做一个工程方法的系统辨识(阶跃响应曲线辨识系统对象)。可以考虑留下以后用。

ChaChing 发表于 2009-4-28 21:01

控制对我而言如隔座山!
仅好奇看看并学习LZ的东东, 顺便设法修改!
LZ自己再修正之!
页: [1]
查看完整版本: 用了1个月的MATLAB才发现最基本的都没理解