📄 衰减曲线.m
字号:
%---------------------------4:1衰减法仿真程序------------------------
clc
%%比例系数调节部分
am = [82^2 2*82 1];bm = 2.449;
Gc = tf(bm,am); %被控对象传递函数Gc=1/(82s+1)^2
P = [2:3:8]; %比例系数
for i = 1:length(P)
sys = feedback(P(i)*Gc,1); %系统加反馈
[y,t] = step(sys);
whitebg('w')
if P(i)==2
plot(t,y,'m:')
hold on
elseif P(i)==5
plot(t,y,'k-.')
hold on
else
plot(t,y,'LineWidth',1.5)
hold on
end
end
%图形的文本标注
text(66,1.387,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=8')
text(96,1.16,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=5')
text(192,0.83,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=2')
xlabel('时间t','FontSize',12)
ylabel('响应y','FontSize',12)
%图形计算部分
h = plot(t,y);
x = get(h,'XData');
y = get(h,'YData');
%找第一个最大值
t=length(y);
tempy1 = y(5:t);
tempx1 = x(5:t);
imax1 = find(max(tempy1) == tempy1); %曲线上的最高点
xmax1 = tempx1(imax1); %xmax1 最大值的横坐标
ymax1 = tempy1(imax1); %ymax1 最大值的纵坐标
plot(xmax1,ymax1,'r.','MarkerSize',20) %标出最大点
%经过第一个最大值向X轴做垂线
x1 = [xmax1 xmax1];
y1 = [ymax1 0];
line(x1,y1,'Color','r','LineWidth',1,'LineStyle','--')
%找第二个最大值
t=length(tempy1);
tempy2 = y(imax1+30:t);
tempx2 = x(imax1+30:t);
imax2 = find(max(tempy2) == tempy2); %曲线上的第二个最高点
xmax2 = tempx2(imax2);ymax2 = tempy2(imax2);
plot(xmax2,ymax2,'r.','MarkerSize',20);
%经过第二个最大值向X轴做垂线
x2 = [xmax2 xmax2];
y2 = [ymax2 0];
line(x2,y2,'Color','r','LineWidth',1,'LineStyle','--')
t1 = xmax1;
t2 = xmax2;
tk = t2-t1; %临界周期Tk
%在图上标出Tk
text(xmax1+5,0.08,'\fontsize{9}\fontname{宋体}Tk=','Color','r')
text(xmax1+30,0.08,'','String',tk,'Color','r')
Kc = P(i);
delta = 1/Kc;
%PID参数
Kp1 = 1/(0.8*delta) %比例增益
Ti = 0.3*tk %积分时间
Td = 0.1*tk %微分时间
%--PID控制部分--
ts = 2; %采样周期
dsys=c2d(Gc,ts,'zoh'); %将被控对象的s传递函数转变为z传递函数
[num,den]=tfdata(dsys,'v'); %取分子、分母的系数
uk_1 = 0;uk_2 = 0; %初始化
yk_1 = 0;yk_2 = 0;
ek_1 = 0;ei = 0; %ei是偏差积分
Kp = Kp1 %PID控制器
Ki = Kp/Ti
Kd = Kp*Td
for k = 1:1:200
time(k) = k*ts;
rin(k) = 1.0; %设定值
yout(k) = -den(2)*yk_1 - den(3)*yk_2 + num(2)*uk_1 + num(3)*uk_2 ;
error(k) = rin(k) - yout(k); %偏差
ei = ei + error(k)*ts; %偏差积分
u(k) = Kc*error(k) + Ki*ei + Kd*(error(k) - ek_1);
uk_2 = uk_1;uk_1 = u(k);
yk_2 = yk_1;yk_1 = yout(k);
ek_1 = error(k);
end
hold off
figure(1);
plot(time,rin,'k-.');
hold on
plot(time,yout)
xlabel('time(s)');ylabel('rin,rout');
hold on
%图像标注
h = plot(time,yout);
x = get(h,'XData');
y = get(h,'YData');
%标出超调量
imax = find(max(y) == y); %曲线上的最高点
xmax = x(imax);
ymax = y(imax);
plot(xmax,ymax,'r.','MarkerSize',10) %标出最大点
x11 = [xmax 0];
y11 = [ymax ymax];
line(x11,y11,'Color','r','LineStyle','--')
t = length(y);
tempx = x(50:t);
tempy = y(50:t);
imin = find(min(tempy) == tempy);
xmin = tempx(imin);ymin = tempy(imin);
plot(xmin,ymin,'r.','MarkerSize',10)
x22 = [xmin 0];y22 = [ymin ymin];
line(x22,y22,'Color','r','LineStyle','--')
yout1 = ymax; yout2 = ymin;
Mr = yout1 - yout2;
text(-40,1.15,'\fontsize{11}\fontname{楷体}Mr=','Color','r')
text(-40,1.05,'','String',Mr,'Color','r')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -