前言
状态估计是根据可以获取的测量数据估算动态系统内部状态的方法,对系统的输入和输出进行测量而得到的数据只能反映系统的外部特性,而系统的动态规律需要通过内部状态变量来描述,因此状态估计对于系统控制很重要。
状态估计器介绍
状态估计器是控制系统和信号处理中的一个重要组件,用于根据系统的测量数据和数学模型来估计系统的内部状态
主要功能
- 从带有噪声的观测数据中推断系统的内部状态
- 当某些状态变量无法直接测量时进行估计
- 提高系统状态信息的准确性
常见类型
- 最小二乘估计
- 卡尔曼滤波器
- 扩展卡尔曼滤波器
- 无迹卡尔曼滤波器
- 粒子滤波器
- Luenberger 观测器
最小二乘估计
基本最小二乘估计
对于线性观测模型
y=Cx+v
其中 C 是观测矩阵, v 是观测噪声, x 是待估计状态。最小二乘法状态估计就是找到 x 的最优估计 x^ 以最小化残差平方和
J(x)=∥y−Cx∥2=(y−Cx)T(y−Cx)
对上述代价函数求导并令其梯度为 0,即最小化残差平方和,得到
∂x∂J=−2CT(y−Cx)=0⇓CTy=CTCx^
若 C 可逆,则
x^=(CTC)−1CTy
若噪声 v 的均值为 0,则 E[x^]=x ,在高斯噪声下,最小二乘估计是最大似然估计
加权最小二乘估计
假设观测噪声的协方差矩阵 R=E[vvT] 已知,通过加权优化提升估计精度
J(x)=(y−Cx)TR−1(y−Cx)=yTR−1y−yTR−1Cx−xTCTR−1y+xTCTR−1Cx
对上述代价函数求导并令其梯度为 0,最小化残差平方和
∂x∂J=−2yTR−1C+2xTCTR−1C=0⇓yTR−1C=xTCTR−1C
若 CTR−1C 可逆,则可以得到
x^=(CTR−1C)−1CTR−1y
如果要使用一段时间内的所有测量值,就需要将 C 矩阵变得很大,这会占用比较大的空间,也降低了运算的速率
递归最小二乘估计
可以用于在线实时估计,逐次更新状态估计,对于离散线性观测模型
yk=Cx+vk
在更新 xk 时,添加一个低通滤波器,用于过滤观测噪声,即
x^k=(1−ak)x^k−1+akC−1yk=x^k−1+akC−1(yk−Cx^k−1)⇓x^k=x^k−1+Kk(yk−Cx^k−1)
在递归的过程中通过最小化误差值来不断更新 a 的值,即可使观测值接近真实值,定义 k 时刻的误差值为
εk=x−x^k=x−x^k−1−Kk(Cx+vk−Cx^k−1)=(I−KkC)εk−1−Kkvk
定义在 k 时刻的协方差矩阵 Pk=E(εkεkT) ,为对称矩阵,且对角项是各个误差的方差,在 k 时刻的误差的平方和就是矩阵 Pk 的迹
Jk=E(εkTεk)=tr(Pk)
将矩阵 Pk 展开
Pk=E(εkεkT)=E([(I−KkC)εk−1−Kkvk][(I−KkC)εk−1−Kkvk]T)=(I−KkC)E(εk−1εk−1T)(I−KkC)T−(I−KkC)E(εk−1vkT)KkT−KkE(vkεk−1T)(I−KkC)T+KkE(vkvkT)KkT
由于 εk−1 与 vk 相互独立,且都是零均值噪声,则有
E(εk−1vkT)=E(εk−1)E(vkT)=0E(vkεk−1T)=E(vk)E(εk−1T)=0
所以上式可以化简为
Pk=(I−KkC)Pk−1(I−KkC)T+KkRKkT
将代价函数对 Kk 求导,得到最优的 Kk 使得 Jk 取得最小值,此时的 xk 为最优值
∂Kk∂Jk=∂Kk∂tr(Pk)=∂Kk∂[(I−KkC)Pk−1(I−KkC)T+KkRKkT)]=2(KkC−I)Pk−1CT+2KkR=0
可以求得 Kk 的最优值为
Kk=Pk−1CT(CPk−1CT+R)−1
总结公式为
x^k=x^k−1+Kk(yk−Cx^k−1)Kk=Pk−1CT(CPk−1CT+R)−1Pk=(I−KkC)Pk−1(I−KkC)T+KkRKkTP0x^0
可以看出,当 Pk−1 越大时,相应的 Kk 越大,而更新过程中也就越相信新得到的值。所以在初始化 P0 和 x^0 时,需要选择合适的 P0 来决定对最初的观测值的信任程度
非线性最小二乘估计
当观测模型为非线性的话,需要线性化或者迭代求解,也就是每次从系统中获取到观测值 y 时,都需要对其进行迭代求解出系统的状态值 x ,需要注意这里跟递归最小二乘不一样,容易混淆。对于非线性观测模型
y=f(x)+v
定义其代价函数,最小化加权残差平方和
J=21(y−f(x))TR−1(y−f(x))
由于 f(x) 非线性,所以无法直接求出解析解,所以采取迭代的方式求解。有三种求解方法:梯度下降法(收敛速度慢)、牛顿法(需要计算 Hessian 矩阵,计算成本高)和高斯牛顿法
这里使用高斯牛顿法,首先需要计算函数 f(x) 的雅可比矩阵
jk=x∂f∣x=x^k
在当前估计点处对 f(x) 进行一阶泰勒展开
f(x)=f(x^k)+jk(x−x^k)
并且将残差 r(x)=y−f(x) 近似为
r(x)≈r(x^k)−jkΔxk
将上述的代价函数可以近似为
J=21(r(x^k)−jkΔxk)TR−1(r(x^k)−jkΔxk)
对 Δxk 求导,最小化代价函数
∂Δxk∂J=−jkTR−1(r(x^k)−jkΔxk)=0⇓jkTR−1jkΔxk=jkTR−1r(x^k)Δxk=Hk−1gk
其中 Hk 为近似 Hessian 矩阵, gk 为梯度,然后进行参数更新,其中 α 为步长,直到当 Δxk 足够小时停止
x^k+1=x^k+αΔxkα∈(0,1]
但是如果 jkTjk 病态,则需要正则化,在上述中加入阻尼因子 μ
Δxk=(jkTR−1jk+μI)−1jkTR−1r(x^k)
- 当 μ 较大:接近梯度下降法,收敛速度慢
- 当 μ 较小:接近高斯牛顿法,收敛快但可能发散
Luenberger 观测器
Luenberger 观测器是一种基于模型的状态估计方法,广泛用于线性系统的状态重构和故障检测。通过系统模型和输出误差反馈来估计不可直接测量的状态变量
对于线性时不变系统,其中 w 是系统误差和模型误差, v 是观测误差
x˙=Ax+Bu+wy=Cx+v
设计一个动态系统,利用观测到的 y 和设定的系统输入 u 来估计当前状态,根据观测器的动态方程
x^˙=Ax^+Bu+L(y−Cx^)
其中 L 是观测器增益矩阵,也就是观测器设计目标。定义状态的估计误差 e=x−x^ ,其动态方程为
e˙=x˙−x^˙
将其带入系统方程和观测器方程,可以得到
e˙=x˙−x^˙=Ax+Bu−(Ax^+Bu+L(y−Cx^))=(A−LC)e
所以设计 L 使得 A−LC 的所有特征值都位于左半负平面内,则误差会指数收敛到 0,从而使观测值和实际值误差较小,减小了系统误差和观测误差对系统的影响,最终整个系统的框图如下图所示
