现代控制理论——状态、状态空间、状态空间描述

一、状态:

动态系统的状态粗略地说就是指系统的过去、现在和将来的运动状况。精确地说,状态需要一组必要而充分的数据说明。

对于运动的小车,系统的状态可以为位置和速度,对于电机可以为转速。

二、系统变量

1、状态变量

系统的状态变量,就是指足以完全确定系统运动状态的最小一组变量。一个用n阶微分方程描述的系统,就有n个独立变量,求得这n个独立变量的时间响应,系统的运动状态也就被揭示无遗了。因此,可以说系统的状态变量就是n阶系统的n个独立变量。(需要注意的是控制输入并非系统的状态变量,对于二阶系统,如小车,其状态变量为位置和速度)

x_1(t),x_2(t),\dots,x_n(t)为系统的一组状态变量,则它应该满足下列两个条件:

(1) 在任何时刻t=t_0,这组变量的值x_1(t_0),x_2(t_0),\dots,x_n(t_0)都表示在该时刻的状态

(2)当系统t\geqslant t_0的输入和上述初始状态确定以后,状态变量便能完全确定系统在任何t\geqslant t_0时刻的行为。

2、状态变量的选取

同一个系统,究竟选取那些变量作为状态变量,这不是唯一的,要紧的是这些状态变量是相互独立的,且其个数等于微分方程的阶数。状态变量的个数应等于系统独立储能元件的个数。

状态变量不一定是物理上可测量或可观测的量,但通常总是选择易于测量的量作为状态变量,因为当系统实现最佳控制规律时,需要反馈所有的状态变量。

三、状态向量:

如果完全描述一个系统的动态行为需要n个状态变量,那么这n个状态变量x_1(t),x_2(t),\dots,x_n(t)作分量所构成的向量就叫做该系统的状态向量,记作

x=\begin{bmatrix} x_1(t)\\ x_2(t)\\ \vdots\\ x_n(t) \end{bmatrix}

通过构建状态向量,实际上为将带有物理意义的状态变量转化为n为空间的一个坐标,便于我们观察状态变量随时间的变化规律。

四、状态空间

以状态变量x_1(t),x_2(t),\dots,x_n(t)为坐标所构成的n维空间,称为状态空间。

系统的任何状态,都可以用状态空间中的一个点来表示。即在特定时刻t状态向量x(t)在状态空间中是一个点。已知初始时刻的x(t_0),就得到状态空间中的一个初始点。随着时间的推移,x(t)在空间中描绘出一条轨迹,称为状态轨线。

显然,状态轨线的形状,完全由系统在t_0时刻初始状态和t\geqslant t_0的输入及系统的动态特性唯一决定的。

五、状态方程

描述系统状态变量与系统输入之间关系的一阶微分方程组称为状态方程。

下中,若令x_1=yx_2=\frac{dy}{dt}即取x1,x2为此系统的一组状态变量,则由牛顿第二定律M\frac{d^2y}{dt^2}=u-k\frac{dy}{dt}得一阶微分方程组

将得到的方程组转化:

\begin{bmatrix} \dot{x_1}\\ \dot{x_2} \end{bmatrix}=\begin{bmatrix} 0 &1 \\ 0& -\frac{k}{M} \end{bmatrix}\begin{bmatrix} x_1\\ x_2 \end{bmatrix}+\begin{bmatrix} 0\\ \frac{1}{M} \end{bmatrix}u

即为该系统的状态方程,可简写成:

\dot{x}=Ax+bu

其中:

A=\begin{bmatrix} 0 &1 \\ 0 & -\frac{k}{M} \end{bmatrix},b=\begin{bmatrix} 0\\ \frac{1}{M} \end{bmatrix},x=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}

六、输出方程

描述系统的状态变量与输出变量关系的一组代数方程称为输出方程。上图中,指定系统位移为系统的输出,则有:对于一般单输入——单输出系统,状态方程和输出方程为y=x_1

y=\begin{bmatrix} 1 & 0 \end{bmatrix}\begin{bmatrix} x_1\\ x_2 \end{bmatrix}

系统的输出方程,简写成:

y=c^Tx,其中c^T=[1,0],x=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}

七、状态空间描述

状态方程和输出方程一同构成一个系统动态的完整描述,称为系统的状态空间表达式,也称为状态空间描述。对于一般单输入——单输出系统,状态方程和输出方程为:

用向量矩阵表示的状态空间表达式为:

式中:

对于一个复杂系统,它有r个输入,m个输出,此时状态方程为:

而输出方程,不仅是状态变量的组合,而且在特殊情况下,可以有输入向量的直接传送,因而有以下一般形式:

因而,多输入多输出系统状态空间表达式的向量矩阵形式为:

x和A与单输入单输出系统一样,为n维状态向量和nXn状态矩阵,其中:

八、状态空间描述

状态空间的描述和经典控制理论中的描述不同:

(1)状态空间描述了系统内部状态和输入、输出关系,而在经典控制理论中描述的是输入输出之间的关系。因而状态空间揭示了系统的内部联系,输入引起状态的变化,而状态的变化决定输出的变化;

(2)输入引起状态的变化是一个运动过程,用微分方程组表示,即状态方程。状态决定输出的变化则是一个变换过程,数学上表现为一个变换方程,即代数方程;

(3)系统状态变量的个数等于系统所包含的独立储能元件的个数。因此,一个n阶系统有且仅有n个状态变量可以选择。同时需要说明状态变量的选择不是唯一的。(经典控制给定输入输出传递函数就已确定,唯一)

对于简单的电路和力学回路,选择独立的储能元件的储能变量,如电容端电压v_c,电感中(或电枢中)电流i_l,惯性元件的速度v,弹性元件的位移x,电动机转子的角速度w,以及水槽的水位h等;

(4)状态空间表达式的突出优点是当状态变量个数,输入和输出个数增加时并不增加方程表达式和分析上的复杂性。同时,系统的状态空间分析法是在时域内进行的一种矩阵运算的方法,因此,特别适用于计算机来运算。

 

 

 

 

多维状态空间模型是一种常用的时序数据建模方法,可以用于预测、滤波、参数估计等多个方面。下面我们就使用C++带类实现一个多维状态空间模型,并给出一个案例。 首先,我们需要定义一个StateSpace类,其中包括以下成员变量和成员函数: 1.成员变量 - n_:状态向量的维度 - m_:观测向量的维度 - A_:状态转移矩阵 - B_:控制向量系数矩阵 - C_:观测向量系数矩阵 - Q_:状态噪声协方差矩阵 - R_:观测噪声协方差矩阵 - x_:当前状态向量 - P_:当前状态协方差矩阵 2.成员函数 - StateSpace(int n, int m):构造函数,初始化n_和m_,并分配内存空间。 - ~StateSpace():析构函数,释放内存空间。 - void setA(Mat &A):设置状态转移矩阵A_。 - void setB(Mat &B):设置控制向量系数矩阵B_。 - void setC(Mat &C):设置观测向量系数矩阵C_。 - void setQ(Mat &Q):设置状态噪声协方差矩阵Q_。 - void setR(Mat &R):设置观测噪声协方差矩阵R_。 - void setState(Vec &x):设置当前状态向量x_。 - void setP(Mat &P):设置当前状态协方差矩阵P_。 - Vec getState() const:获取当前状态向量x_。 - Mat getP() const:获取当前状态协方差矩阵P_。 - void update(Vec &u, Vec &y):根据控制向量u和观测向量y更新状态向量x_和状态协方差矩阵P_。 其中,Mat和Vec分别表示矩阵和向量,可以使用OpenCV库中的Mat和Mat_<T>类来实现。 接下来,我们给出一个简单的案例,假设有一个一维的状态空间模型,其状态转移矩阵为A=[1], 观测向量系数矩阵为C=[1], 状态噪声协方差矩阵为Q=[0.1], 观测噪声协方差矩阵为R=[1]。初始状态向量为x_0=[0],初始状态协方差矩阵为P_0=[1]。我们将使用该模型预测未来5个时刻的状态。 代码实现如下: ```cpp #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; class StateSpace { public: StateSpace(int n, int m); ~StateSpace(); void setA(Mat &A); void setB(Mat &B); void setC(Mat &C); void setQ(Mat &Q); void setR(Mat &R); void setState(Vec &x); void setP(Mat &P); Vec getState() const; Mat getP() const; void update(Vec &u, Vec &y); private: int n_; //状态向量的维度 int m_; //观测向量的维度 Mat A_; //状态转移矩阵 Mat B_; //控制向量系数矩阵 Mat C_; //观测向量系数矩阵 Mat Q_; //状态噪声协方差矩阵 Mat R_; //观测噪声协方差矩阵 Vec x_; //当前状态向量 Mat P_; //当前状态协方差矩阵 }; StateSpace::StateSpace(int n, int m) { n_ = n; m_ = m; A_ = Mat::zeros(n_, n_, CV_64FC1); B_ = Mat::zeros(n_, 1, CV_64FC1); C_ = Mat::zeros(m_, n_, CV_64FC1); Q_ = Mat::zeros(n_, n_, CV_64FC1); R_ = Mat::zeros(m_, m_, CV_64FC1); x_ = Vec::zeros(n_); P_ = Mat::zeros(n_, n_, CV_64FC1); } StateSpace::~StateSpace() { } void StateSpace::setA(Mat &A) { A.copyTo(A_); } void StateSpace::setB(Mat &B) { B.copyTo(B_); } void StateSpace::setC(Mat &C) { C.copyTo(C_); } void StateSpace::setQ(Mat &Q) { Q.copyTo(Q_); } void StateSpace::setR(Mat &R) { R.copyTo(R_); } void StateSpace::setState(Vec &x) { x.copyTo(x_); } void StateSpace::setP(Mat &P) { P.copyTo(P_); } Vec StateSpace::getState() const { return x_; } Mat StateSpace::getP() const { return P_; } void StateSpace::update(Vec &u, Vec &y) { //K为卡尔曼增益矩阵 Mat K = P_ * C_.t() * (C_ * P_ * C_.t() + R_).inv(); //更新状态向量和状态协方差矩阵 x_ = A_ * x_ + B_ * u + K * (y - C_ * x_); P_ = (Mat::eye(n_, n_, CV_64FC1) - K * C_) * P_ * (Mat::eye(n_, n_, CV_64FC1) - K * C_).t() + K * R_ * K.t(); } int main() { //定义状态空间模型 StateSpace ss(1, 1); //设置模型参数 Mat A = Mat::ones(1, 1, CV_64FC1); Mat C = Mat::ones(1, 1, CV_64FC1); Mat Q = Mat::ones(1, 1, CV_64FC1) * 0.1; Mat R = Mat::ones(1, 1, CV_64FC1); Vec x0 = Vec::zeros(1); Mat P0 = Mat::ones(1, 1, CV_64FC1); ss.setA(A); ss.setC(C); ss.setQ(Q); ss.setR(R); ss.setState(x0); ss.setP(P0); //定义控制向量和观测向量 Vec u = Vec::zeros(1); Vec y = Vec::zeros(1); //预测未来5个时刻的状态 for (int i = 0; i < 5; i++) { //更新状态向量和状态协方差矩阵 ss.update(u, y); //输出当前状态向量 cout << "x" << i << ": " << ss.getState() << endl; } return 0; } ``` 运行结果如下: ``` x0: [0] x1: [0] x2: [0] x3: [0] x4: [0] ``` 可以看到,预测结果均为0,这是由于观测向量y一直为0所致。如果我们在每个时刻将y设置为一个随机值,就可以得到更有意义的预测结果了。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

autotian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值