lqr函数,care函数
**注:**MATLAB中LQR函数有 连续和 离散两种,本篇文章只分析 连续时间系统lqr()函数, 离散时间系统LQR()函数将单独写文章进行分析!敬请关注,谢谢~
用 lqr算出来的 反馈矩阵K,和用 公式k=R-1BTP算出来的反馈矩阵k是一样的,本文有详细分析过程。
一、 连续时间系统二次型优化:lqr()函数
1.1 MATLAB函数形式
对于连续时间系统:
反馈矩阵控制率u=-kx最小化二次型代价函数:
MATLAB中lqr()函数形式:
其中输入包含:
在所有情况中,如果忽略N,则N设定为0。
求出的解包含:
lqr()返回k,P,r,其实还可以通过care()函数逐步求解k,P,r:
① 通过care()函数求解Riccati方程的解P;
判断稳定性:
求解P:
② 再根据求解的P去求解反馈增益矩阵k:
这里的k和care()函数求出的k是一样的
③ 最后根据k求解特征值r:
1.2 举例:
Example1:
>> A=[0 1;10 0];B=[0;-1];Q=[100 0;0 1];R=0.01;
>> [k,P,r]=lqr(A,B,Q,R)
k =
-110.4988 -17.9164
P =
18.0058 1.1050
1.1050 0.1792
r =
-8.9582 + 4.4999i
-8.9582 - 4.4999i
>> eig(A)
ans =
3.1623
-3.1623
① 可见由于A的特征值有大于0,所以该系统本身就不稳定,lyap()函数无解;
② 这时需要通过闭环控制配置状态反馈矩阵K来实现系统稳定,即让闭环状态矩阵Acl=(A-B**k)特征值都小于0,这就是LQR控制起到的作用。
接下来就可以验证闭环反馈:
>> k
k =
-110.4988 -17.9164
>> A=[0 1;10 0];B=[0;-1];Q=[100 0;0 1];R=0.01;A2=A-B*k
A2 =
0 1.0000
-100.4988 -17.9164
>> eig(A2)
ans =
-8.9582 + 4.4999i
-8.9582 - 4.4999i
③ 采用状态反馈矩阵得出的闭环系统矩阵特征值和lqr()求出的特征值结果一致。
Example2:
>> A=[0 1;-1 -1];B=[0;-1];Q=[100 0;0 1];R=0.01;
>>> [k,P,r]=lqr(A,B,Q,R)
k =
-99.0050 -16.2919
P =
17.2828 0.9900
0.9900 0.1629
r =
-8.6460 + 5.0252i
-8.6460 - 5.0252i
>> eig(A)
ans =
-0.5000 + 0.8660i
-0.5000 - 0.8660i
① 该开环系统本身就是稳定的;
>> A2=A-B*k
A2 =
0 1.0000
-100.0050 -17.2919
>> eig(A2)
ans =
-8.6460 + 5.0252i
-8.6460 - 5.0252i
② 采用状态反馈矩阵k得出的闭环系统矩阵特征值和lqr()求出的特征值结果一致,相比开环系统特征值从-0.5变成闭环的-8.6460,可见LQR控制器使得系统收敛更快。
>> k=R^(-1)*B'*P
k =
-99.0050 -16.2919
③ 根据公式k=R-1BTP,将LQR求解出的里卡提方程的解P代入公式中,这里计算出来的k与LQR求解的结果k是一样的。
Example3:
>> A
A =
1 2
-3 -4
>> B
B =
0
-1
>> Q
Q =
3 1
1 1
>> R
R =
0.0100
>> [k,P,r]=lqr(A,B,Q,R)
k =
-18.9585 -9.8504
P =
0.8659 0.1896
0.1896 0.0985
r =
-9.7743
-3.0761
>> eig(A)
ans =
-1.0000
-2.0000
① 该开环系统本身就是稳定的;
>> A2=A-B*k
A2 =
1.0000 2.0000
-21.9585 -13.8504
>> eig(A2)
ans =
-3.0761
-9.7743
② 采用状态反馈矩阵k得出的闭环系统矩阵特征值和lqr()求出的特征值结果一致,相比开环系统特征值实部从-2变成闭环的-9.77,可见LQR控制器使得系统收敛更快。
>> k=R^(-1)*B'*P
k =
-18.9585 -9.8504
③ 根据公式k=R-1BTP,将LQR求解出的里卡提方程的解P代入公式中,这里计算出来的反馈矩阵k与LQR求解的反馈矩阵k是一样的。
二、连续时间系统李卡提方程MATLAB函数:care()函数
care()函数:Continuous-time algebraic Riccati equation solution
求解连续时间代数里李提方程(P)
2.1 MATLAB函数形式
与lqr()函数相同,对于线性连续系统,形式:
其中:
2.2 举例
Example1:
A =
-3 2
1 1
B =
0
1
Q =
1 -1
-1 1
R =
3
>> [P,r,k]=care(A,B,Q,R)
P =
0.5895 1.8216
1.8216 8.8188
r =
-3.5026
-1.4370
k =
0.6072 2.9396
同样的用LQR求解:
[k2,P2,r2]=lqr(A,B,Q,R)
k2 =
0.6072 2.9396
P2 =
0.5895 1.8216
1.8216 8.8188
r2 =
-3.5026
-1.4370
这里函数care()和lqr()求出的k和k=R-1BTP算出来的k是一样的。
k2=R^(-1)*B’*P
k2 =
0.6072 2.9396
Example2:
同1.2节中的Example1,
>> A=[0 1;10 0];B=[0;-1];Q=[100 0;0 1];R=0.01;
>> [P,r,k]=care(A,B,Q,R)
P =
18.0058 1.1050
1.1050 0.1792
r =
-8.9582 + 4.4999i
-8.9582 - 4.4999i
k =
-110.4988 -17.9164
发现函数care()和lqr()计算的结果相等,k,P,r完全相同
同理同1.2节中的Example2、3用函数care()和lqr()计算的结果都相等。