自动控制——状态观测器

news2024/11/23 8:36:09

自动控制——状态观测器

引言

在自动控制系统中,准确地了解系统的状态对实现高性能控制至关重要。然而,在许多实际应用中,我们无法直接测量系统的所有状态变量。这时,状态观测器(State Observer)就发挥了重要作用。状态观测器能够利用系统的输入输出数据估计未测量的状态变量,从而使得控制器能够基于这些估计的状态实现有效的控制。

状态观测器的本质

状态观测器本质上是一种替代控制系统中传感器的工具。观测器通过结合感知信号和控制系统的其他信息(如系统模型或已知参数),产生观测信号。与直接使用传感器测得的信号相比,这些观测到的信号通常更为精确、更为廉价,且更为可靠。

观测器通过综合测得的反馈信号与控制系统元部件(特别是被控对象)的信息,使得对被控对象的特性能够有更精确的认知。观测器不仅增强了传感器的输出,还为控制律提供了更为精确的反馈信号,这在控制系统的设计与应用中至关重要。

状态观测器的定义

状态观测器是一种动态系统,它通过系统的输入输出数据来估计系统的状态向量。假设我们有一个线性时不变系统,描述如下:

x ˙ ( t ) = A x ( t ) + B u ( t ) , y ( t ) = C x ( t ) , \begin{aligned} \dot{x}(t) &= A x(t) + B u(t), \\ y(t) &= C x(t), \end{aligned} x˙(t)y(t)=Ax(t)+Bu(t),=Cx(t),

其中, x ( t ) x(t) x(t) 是系统状态向量, u ( t ) u(t) u(t) 是输入向量, y ( t ) y(t) y(t) 是输出向量, A A A B B B C C C 分别是系统的状态矩阵、输入矩阵和输出矩阵。

状态观测器的目标是利用已知的 u ( t ) u(t) u(t) y ( t ) y(t) y(t) 来估计 x ( t ) x(t) x(t)。通常构造如下形式的观测器:

x ^ ˙ ( t ) = A x ^ ( t ) + B u ( t ) + L ( y ( t ) − y ^ ( t ) ) , y ^ ( t ) = C x ^ ( t ) , \begin{aligned} \dot{\hat{x}}(t) &= A \hat{x}(t) + B u(t) + L (y(t) - \hat{y}(t)), \\ \hat{y}(t) &= C \hat{x}(t), \end{aligned} x^˙(t)y^(t)=Ax^(t)+Bu(t)+L(y(t)y^(t)),=Cx^(t),

其中, x ^ ( t ) \hat{x}(t) x^(t) 是估计的状态向量, L L L 是观测器增益矩阵, y ^ ( t ) \hat{y}(t) y^(t) 是估计的输出。

状态观测器的设计

为了确保状态观测器能够正确估计系统的状态,观测器的设计至关重要。观测器增益矩阵 L L L 的选择直接影响估计误差 e ( t ) = x ( t ) − x ^ ( t ) e(t) = x(t) - \hat{x}(t) e(t)=x(t)x^(t) 的收敛性。

假设系统是可观测的,状态估计误差的动态方程为:

e ˙ ( t ) = ( A − L C ) e ( t ) \dot{e}(t) = (A - LC)e(t) e˙(t)=(ALC)e(t)

为了使误差 e ( t ) e(t) e(t) 收敛至零,我们希望矩阵 A − L C A - LC ALC 是一个稳定矩阵。这意味着我们需要选择合适的 L L L 使得矩阵 A − L C A - LC ALC 的特征值具有负实部。

Python代码实现

下面是使用Python实现状态观测器的一个简单例子。我们将利用Python中的控制系统库(control)来进行仿真。

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
from matplotlib.font_manager import FontProperties  
# 设置中文显示
font = FontProperties(fname=r"./CN/simsun.ttc", size=12)  # 替换为你系统中的中文字体路径
plt.rcParams['font.sans-serif'] = ['SimSun']  # 使用指定的中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题


# 定义系统矩阵
A = np.array([[1, 2], 
              [0, -1]])
B = np.array([[0], 
              [1]])
C = np.array([[1, 0]])

# 设计观测器增益矩阵L
L = np.array([[2], 
              [3]])

# 构建系统
sys = ctrl.ss(A, B, C, 0)

# 初始条件
x0 = np.array([[1], [1]])  # 将初始条件定义为列向量
x0_hat = np.array([[0], [0]])  # 初始状态估计

# 定义时间
T = np.linspace(0, 10, 100)

# 定义输入信号
U = np.zeros_like(T)  # 输入为零

# 仿真真实系统的响应
T, y = ctrl.forced_response(sys, T, U, X0=x0)

# 仿真观测器
A_hat = A - L @ C
sys_hat = ctrl.ss(A_hat, np.hstack([B, L]), np.eye(2), 0)

# 构造输入信号(真实输出加上输入信号)
U_hat = np.vstack([U, y])
T, x_hat = ctrl.forced_response(sys_hat, T, U_hat, X0=x0_hat)

# 绘图
plt.figure(figsize=(10, 6))
plt.plot(T, y, 'b', label="真实输出 $y$")
plt.plot(T, x_hat[0, :], 'r--', label="估计状态 $\hat{x}_1$")
plt.xlabel('时间')
plt.ylabel('状态/输出')
plt.legend()
plt.grid(True)
plt.title('状态观测器仿真')
plt.show()

在这里插入图片描述

在这个例子中,我们定义了一个简单的二阶系统,并设计了一个观测器来估计系统的状态。通过仿真可以看到,随着时间的推移,状态估计误差逐渐减小,观测器能够较好地估计系统的状态。

结论

状态观测器在控制系统中具有重要作用,尤其是在无法直接测量所有状态变量的情况下。通过合理设计观测器增益矩阵 L L L,可以确保状态观测器能够准确地估计系统的状态,从而辅助控制器实现高效的控制效果。

状态观测器不仅能够增强传感器的输出,还能通过综合反馈信号与系统内部信息来提供更为精确的反馈信号。这使得状态观测器不仅是传感器的替代品,更是控制系统中提高性能和可靠性的关键组件。

在实际工程应用中,状态观测器的设计通常需要考虑系统的可观测性、噪声影响以及实时性要求。在一些复杂系统中,可能需要使用扩展卡尔曼滤波器(EKF)等高级观测器来处理非线性和噪声问题。通过本文的介绍和代码示例,相信你对状态观测器的原理和实现有了初步了解,能够在实际项目中应用这一重要的控制工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode面试150】——209长度最小的子数组

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…

轻松上手MYSQL:精通正则表达式,数据匹配不再难!

🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL正则表达式函数之旅✨ 👋 大家好!文本学习…

【Cesium】Cesium图层请求完成的回调

有一个业务需要用到cesium图层请求完成的回调&#xff0c;翻了好久的文档终于给我找到&#x1f336;️。 是Cesium.ImageryProvider类的一个属性readyPromise 效果如下&#xff1a; Cesium图层请求完成的回调 完整代码如下&#xff1a; <html lang"en"><h…

PCDN业务推荐

神鸟云&蘑菇云最新业务推荐 &#x1f525;短Z业务-- 支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘 单价&#xff1a;移动1900 电联2500 http://oss.download.…

Mysql(四)---增删查改(进阶)

文章目录 前言1.查询操作1.1.全列查询1.2.指定列查询1.3.列名为表达式查询1.4.查询中使用别名1.5.去重查询1.6.排序1.6.2.NULL 1.7.条件查询1.8.分页查询 2.修改3.删除 前言 上一篇博客&#xff0c;我们学习了一些主键的概念&#xff0c;并且分别创造了一些示例表&#xff0c;…

通过相机来获取图片

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

A. Primary Task 签到 void solve() {string s;cin>>s;bool bltrue;if(s.size()<2)blfalse;else{if(s.substr(0,2)"10"){if(s[2]0)blfalse;else if(s[2]1&&s.size()<3)blfalse; }else blfalse;}if(bl)cout<<"YES\n";else cout…

数据结构第二天

分文件编程实现&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include "seqlist.h"int main(int argc, char const *argv[]) {seqlist_p p CreateEpSeqlist();InsertIntoSeqlist(p, 0, 10);InsertIntoSeqlist(p, 1, 20);InsertIntoSeql…

打卡第四十五天:不同的子序列、两个字符串的删除操作、编辑距离

一、不同的子序列&#xff08;困难&#xff09; 题目 文章 视频 这道题目如果不是子序列&#xff0c;而是要求连续序列的&#xff0c;那就可以考虑用KMP。相对于72. 编辑距离简单了不少&#xff0c;因为本题相当于只有删除操作&#xff0c;不用考虑替换增加之类的。但相对于…

Mapreduce_Distinct数据去重

MapReduce中数据去重 输入如下的数据&#xff0c;统计其中的地址信息&#xff0c;并对输出的地址信息进行去重 实现方法&#xff1a;Map阶段输出的信息K2为想要去重的内容&#xff0c;利用Reduce阶段的聚合特点&#xff0c;对K2进行聚合&#xff0c;去重。在两阶段中&#xff…

【数据结构篇】~顺序表

顺序表前言 想要学好数据结构的三大基本功&#xff1a;1.结构体2.指针3.动态内存开辟,这三样将是贯彻整个数据结构的工具。&#xff08;可以去这里了解这三大基本功&#xff09; 顺序表也是线性表的一种&#xff0c;那线性表又是什么呢&#xff1f; 线性表&#xff08;linear …

系列:水果甜度个人手持设备检测-无损检测常用技术和方式汇总

系列:水果甜度个人手持设备检测 -- 无损检测常用技术和方式汇总 概述 无损检测以不损坏被检测对象的使用性能为前提&#xff0c;以物理或化学方法为手段&#xff0c;借助相应的设备器材&#xff0c;按照规定的技术要求&#xff0c;对材料、零部件、结构件进行有效的检验和测…

软件测试第1章 软件测试是什么

目录​​​​​​​ 内容说明 一、软件测试与质量概览需要熟悉什么 二、如何理解质量保证 三、软件测试的误区-程序员和测试的关系 四、软件测试是什么&#xff1f; 五、软件测试的目的 六、软件测试与软件质量保证 七、软件测试的必要性 八、软件测试的基本概念分析 …

HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

js 深入学习各种继承方法使用场景

前言 问题&#xff1a; JS 如何实现继承呢&#xff1f;主要有几种继承方式及分别适用于哪些场景呢&#xff1f; 我们学习高级语言&#xff0c;就必须学习面向对象&#xff0c;想要成为高手&#xff0c;就必须学习别人不会的&#xff0c;就比如JS中的继承&#xff0c;好多前端人…

ASP.NET在线交流论坛管理系统

ASP.NET在线交流论坛管理系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 用户功能有个人信息管理 帖了信息管理 意见反馈信息管理 点赞管理 收藏管理 后台管理员可以进行用户管理 …

部署及使用seata

目录 1.下载seata1.7.0.zip 2.上传至云服务器&#xff0c;使用unar工具解压 3.配置application.yml&#xff0c;主要配置如下参数 4.为seata执行mysql脚本 5.配置nacos配置中心 *6.启动seata服务器 问题&#xff1a;“cause:can not register RM,err:can not connect to…

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…

微软披露Office最新零日漏洞,可能导致数据泄露

近日&#xff0c;微软披露了 Office 中一个未修补的零日漏洞&#xff0c;如果被成功利用&#xff0c;可能导致敏感信息在未经授权的情况下泄露给恶意行为者。 该漏洞被追踪为 CVE-2024-38200&#xff08;CVSS 得分&#xff1a;7.5&#xff09;&#xff0c;被描述为一个欺骗漏洞…