新的“A”變成着了這樣:Ac = A - KB
基於對象:狀態空間形式的系統
能量函數J:也稱之為目標函數
Q:半正定矩陣,對角陣(允許對角元素出現0)
R:正定矩陣,QR其實就是權重
下面這段話可能會加深對LQR的理解:
當x是一維的,J就變成
我們的目的是使能量函數J最小,那么Qx^2和Ru^2都要最小,則t趨近無窮時,x要趨近0,要保證Qx^2為一個最小定值那么Q要很大,Q越大x衰減速度也就越快;同理增大R,u就會變小,對系統的控制變弱,x衰減速度將會變慢
如何選取QR?
無一般規律可尋,一般取決設計者的經驗,在這提供幾個選擇的原則:
1 Q、R都是對稱矩陣,Q為正半定矩陣,R為正定矩陣
2 通常選取Q、R為對角矩陣,實際應用,通常將R值固定,通過改變Q的值來調制最優,當控制量只有一個,R就變成一個標量,一般取值1
為了更好的選取Q/R,我進行了一些嘗試,發現如下:
假設我們的狀態量是x1,x2,現在改變系數,觀察對x1的影響
關於Q與R的
1 同時Q=>kQ,R=>kr,對x1無影響;
2 單取Q=>kQ或R=>R/k,產生的影響相同;
3 增大Q,對x1的控制力加強;
關於Q內部的
1 增大x1的系數,對x1的控制力加強;
2 增大x2的系數,x1基本不變;
3 減小x2的系數,對x1控制力減弱,以至到達目標狀態的時間變長;(試驗中對x1的第一步控制較強,但之后控制力明顯減弱,可能是由於我給的初始量不太符合客觀現實)
計算反饋矩陣K的步驟:
1 選擇QR矩陣
2 求解Riccati方程的P(P是公式推導過程中設的矩陣,目的就是方便求K,在這求出P就能求出K)
3 計算(在matlab中給定A,B,Q,R用lqr函數可直接計算出K)
(實際控制中我們無法調用lqr函數,求解K本質上屬於求解Riccati方程,詳見我的隨筆:Riccati方程迭代法求解)
u(k)=-K*x(k),u(k)控制完將會得到一個新的x(k+1),周而復始可不斷求出u
調節目標:將狀態調節到零,而不是系統誤差為零
下面有一個倒立擺控制器的例子
其狀態變量是[p p' Θ Θ‘],p是小車位移。Θ是倒立擺角度
A = [0 1 0 0
0 0 -1 0
0 0 0 1
0 0 9 0];
B = [0;0.1;0;-0.1];
C = [0 0 1 0]; %觀測角度
D = 0;
Q = [1 0 0 0
0 1 0 0
0 0 10 0
0 0 0 10 ];
R = 0.1;
%由上面這個系統,可以計算出K
K = lqr(A,B,Q,R);
Ac = A - B*K;
%對系統進行模擬
x0 = [0.1;0;0.1;0]; %初始狀態
t = 0:0.05:20;
u = zeros(size(t));
[y,x]=lsim(Ac,B,C,D,u,t,x0);
plot(t,y);
系統的控制效果與系統狀態空間的准確度、QR的選取有極大關系!!!
也可采用u(k+1) = -K_lqr * x(k)和x(k+1) = A * x(k) + B * u的方式嘗試跑自己的例子