ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

matlab练习程序(连续系统辨识与响应)

2022-04-17 12:02:17  阅读:192  来源: 互联网

标签:subplot plot imp 练习 sys 响应 matlab 辨识


在不知道系统模型的情况下,如果想要使用模型的方法控制系统,可以先用系统辨识求得系统的状态空间参数,然后设计控制器。

下面根据已知状态参数设计了一个系统,再利用控制量得到系统响应。

然后结合控制量和系统响应,利用matlab自带的子空间迭代方法辨识得到系统的状态方程。

再比较一下原始响应和辨识结果响应。

又比较了不同方法下的系统的冲击与阶跃响应。

matlab代码如下:

clear all;close all;clc;

load dryer2
warning off;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%连续系统的系统辨识%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A = [-1.5,-2;1,0];
B = [0.5;0];
C = [0,1];
D = 0;
sys = ss(A,B,C,D);              %状态方程
sys_tf = tf(sys);               %传递函数

u = u2(1:100);                  %控制量
y = lsim(sys,u,(1:100)');       %响应

idata = iddata(y,u);            %构造辨识结构体
idsys = n4sid(idata,2,'Ts',0,'Form','canonical'); %系统辨识得到状态方程(连续)
idsys_tf = idtf(idsys);         %构造新的传递函数

y2 = lsim(idsys,u,(1:100)');    %用原始控制量控制已辨识的系统生成响应

plot(y,'r-*');
hold on;
plot(y2,'go');
legend('原始响应','利用辨识结果得到的响应');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%状态空间转传递函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%
syms s;
Gc = sys.C*inv(s*eye(2) - sys.A)*sys.B+sys.D
sys_tf

%%%%%%%%%%%%对传递函数计算反拉普拉斯变换并和原系统比较冲击和阶跃响应%%%%%%%%%%
y = ilaplace(Gc);
evaly = @(t) vpa(eval(y),10);
figure;
u=0:0.1:10;
imp = double(evaly(u));
subplot(4,2,1);
plot(u,imp,'r');
subplot(4,2,2);
ste = cumsum(imp)/10.0;
plot(u,ste,'b');
subplot(4,2,3);
[r,t] = impulse(sys);
plot(t,r,'r')
subplot(4,2,4);
[r,t] = step(sys);
plot(t,r,'b');

%%%%%%%%%%%%%%利用符号方法解上述系统的微分方程并求阶跃和冲击响应%%%%%%%%%%%%%%
y = dsolve('D2y+1.5*Dy+2*y=0.5','Dy(0)=0','y(0)=0','x');
evaly = @(x) vpa(eval(y),10);
x=0:0.1:10;
imp = double(evaly(x));
subplot(4,2,5);
plot(x(1:end-1),diff(imp)./diff(x),'r');
subplot(4,2,6);
plot(x,imp,'b');

%%%%%%%%%%%%%%%%%%利用数值方法解上述微分方程并求阶跃和冲击响应%%%%%%%%%%%%%%%%
[x,y] = ode45(@func,[0 10],[0; 0]);
subplot(4,2,7);
plot(x(1:end-1),diff(y(:,2))./diff(x),'r')
subplot(4,2,8);
plot(x,y(:,2),'b')

function dy = func(x,y)
dy = [y(2);
    0.5*x-1.5*y(2)-2*y(1)];
end

结果如下:

用原控制量与辨识结果生成响应:

不同方法下得到的冲击与阶跃响应:

标签:subplot,plot,imp,练习,sys,响应,matlab,辨识
来源: https://www.cnblogs.com/tiandsp/p/16155273.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有