一. dlqr迭代法
针对的系统模型在下面第二张图片里面有写的清清楚楚。
代码如下:
不搞那些奇奇怪怪的说辞,下面代码最容易混的地方就是P的初值选取,目前试验得,只需要保证P正定就能够收敛到正确的结果,和dlqr()得出的结果一致,一模一样。
function [K,P]=DLQR2(A,B,Q,R)
% P的初始值为Q
Pk = Q;
err = 10e06;
er = 10e-15;
while(err > er)
P_k_plus_1 = Q + A'*Pk*A - A'*Pk*B*inv(R+B'*Pk*B)*B'*Pk*A;
err = norm(P_k_plus_1 - Pk);
Pk = P_k_plus_1;
end
K = inv(R + B'*Pk*B)*B'*Pk*A;
P = Pk;
end
遗留的疑问点
下图的红框是matlab说明文档的,但是调用dlqr函数时又不需要传N参数,一传就报错?
二. lqr方程迭代法
大多数论文里面按照这种方法来进行求解。
代入K化简后,如果P的下标都相同,那么就有下式成立:
但是迭代法,还是按照原本的式子来做。
代码实现: