matlab中LQR的使用
clear all
A=[0 0 0 1 0 0; 0 0 0 0 1 0; 0 0 0 0 0 1; 0 0 0 0 0 0; 0 86.69 -21.62 0 0 0; 0 -40.31 39.45 0 0 0];
B=[0;0;0;1;6.64;-0.088];
C=[1 0 0 0 0 0; 0 1 0 0 0 0; 0 0 1 0 0 0];
D=[0;0;0];
Q=[10 0 0 0 0 0; 0 100 0 0 0 0; 0 0 1000 0 0 0; 0 0 0 0 0 0; 0 0 0 0 0 0; 0 0 0 0 0 0];
R=1;
K = lqr(A,B,Q,R)
Ac = [(A-B*K)];
Bc = [B];
Cc = [C];
Dc = [D];
T = 0:0.01:15;
U = ones(size(T));
sys_c=ss(Ac,Bc,Cc,Dc);
[Y,T,X]=lsim(sys_c,U,T);
figure(1) %建立图形
plot(T,Y) %制图,以T为横坐标,Y为纵坐标
xlabel('time(s)');%横坐标
ylabel('move(m)');
legend('xiaoche','dlb1','dlb2')
以上是我的编程,
sys_c=ss(Ac,Bc,Cc,Dc);
[Y,T,X]=lsim(sys_c,U,T);
这两句话什么意思?
我要是想要用save保存我这个编程的输入、输出和控制过程中的数据该怎么保存?
用SIMULINK的话我要怎么设置SIMULINK? 展开
2014-03-21
【问】
sys_c=ss(Ac,Bc,Cc,Dc);
[Y,T,X]=lsim(sys_c,U,T);
这两句话什么意思?
【答】
两句分别解释:
sys_c=ss(Ac,Bc,Cc,Dc); 以Ac,Bc,Cc,Dc作为参数,创建一个状态空间模型。状态空间(ss)是MATLAB控制系统工具箱中非常重要的一种模型形式,和传递函数(tf)、零极点(zpk)可以互相转换。
[Y,T,X]=lsim(sys_c,U,T); 使用lsim函数对系统进行仿真。lsim可以接受任意形式的输入信号,不过,就现在的输入信号而言,使用的是单位阶跃信号,其实也可以改用step函数:[Y,T,X]=step(sys_c);结果完全相同。
【问】
我要是想要用save保存我这个编程的输入、输出和控制过程中的数据该怎么保存?
【答】
输入信号由U、T给出,输出信号是Y,状态量是X,原系统模型是A、B、C、D,状态反馈矩阵是K,二次型最优指标是Q、R,把这些数据保存下来就可以了。
【问】
用SIMULINK的话我要怎么设置SIMULINK?
【答】
如果用Simulink,被控对象可使用State-space模块实现,输入使用Step模块,输出用Scope观察即可。其他似乎没什么需要特别设置的了,如果还有问题请追问吧。
大神,我想问一下,我的程序运行出来的反馈矩阵K到底有什么用?是用到SIMULINK里面吗?是不是我这个程序和用SIMULINK仿真出来的结果一样?因为我现在这个里面,ABCD都是定下来的,尤其是A矩阵里面,相当于我二阶倒立摆的参数,可是我现在要是改变参数,如何能继续保持新的曲线可以和现在的曲线近似呢????
【问】
程序运行出来的反馈矩阵K到底有什么用?
【答】
反馈矩阵当然是用于状态反馈了,也就是计算闭环系统的Ac = [(A-B*K)];
【问】
是不是我这个程序和用SIMULINK仿真出来的结果一样?
【答】
这个系统没什么特殊的地方,如果搭建的Simulink模型没错,得到结果应该是相同的。
【问】
要是改变参数,如何能继续保持新的曲线可以和现在的曲线近似呢????
【答】
我好像回答过另外一个关于二级倒立摆的问题,也问到这个,不知是不是你问的。
有两个需要明确的:
1、这个系统有三个输出,你所谓的曲线是指哪一个?要想三个输出都与原系统保持一致或近似,我觉得除非参数的改变比较特殊,否则应该是很难做到的。
2、你所谓的改变参数是怎样改变?我在上次的问题里面说到这一点,但没有进一步回应。应该拿出具体数据来,就事论事,泛泛地说改变参数,恐怕很难有一般性的方法。其实概念不难理解:系统矩阵A体现了受控对象本身的特征,你不可能让一个毫秒级反应的快变系统与一个分钟级的慢变系统输出近似或一致。