声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1157|回复: 4

[编程技巧] 用了1个月的MATLAB才发现最基本的都没理解

[复制链接]
发表于 2009-4-20 10:54 | 显示全部楼层 |阅读模式

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

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

x
M-file:
function [B1,B2,B3,B4]=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,[a,1],'inputdelay',b);  %被控系统模型
dsys=c2d(sys,ts,'zoh'); [num,den]=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;   
[B1,B2,B3,B4]=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 编辑 ]
回复
分享到:

使用道具 举报

发表于 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,[a,1],'inputdelay',b);  %被控系统模型
dsys=c2d(sys,ts,'zoh');
[num,den]=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;   
[B1,B2,B3,B4]=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');

评分

1

查看全部评分

 楼主| 发表于 2009-4-28 10:29 | 显示全部楼层
function [B1,B2,B3,B4]=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 编辑 ]
 楼主| 发表于 2009-4-28 19:09 | 显示全部楼层

回复 沙发 ChaChing 的帖子

谢谢ChaChing,
  程序改了可以用了,还需要一些调整才能达到需要的效果,
这个程序是 上海交通大学  张卫东 的发明专利《工业过程单参数比列积分微分控制方法》,这一段只是控制方法的程序,还需要做一个工程方法的系统辨识(阶跃响应曲线辨识系统对象)。可以考虑留下以后用。
发表于 2009-4-28 21:01 | 显示全部楼层
控制对我而言如隔座山!
仅好奇看看并学习LZ的东东, 顺便设法修改!
LZ自己再修正之!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-6-28 02:43 , Processed in 0.056830 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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