自动控制: 时间最优的PID控制算法

news2024/9/21 5:39:26

自动控制: 时间最优的PID控制算法

在计算机控制系统中,时间最优控制旨在使系统从一个初始状态转到另一个目标状态所经历的过渡时间最短。利用最大值原理,可以设计出控制量只在 u ( t ) ≤ 1 u(t) \leq 1 u(t)1范围内取值的时间最优控制系统。而在工程应用中,通常将 u ( t ) u(t) u(t)设定为 ±1 两个值,并依照一定法则进行切换,从而形成一种开关控制(Bang-Bang 控制)系统。本文将介绍时间最优的PID控制算法的理论、公式、实现代码以及结论。

理论基础

时间最优控制

时间最优控制的目标是最小化系统从初始状态到达目标状态所需的时间。对于一个简单的线性系统,状态方程为:

x ˙ ( t ) = A x ( t ) + B u ( t ) \dot{x}(t) = Ax(t) + Bu(t) x˙(t)=Ax(t)+Bu(t)

其中:

  • x ( t ) x(t) x(t)是系统状态向量
    - u ( t ) u(t) u(t)是控制输入
    - A A A B B B是系统矩阵

时间最优控制问题的目标函数为:

J = ∫ 0 T 1   d t = T J = \int_{0}^{T} 1 \, dt = T J=0T1dt=T

通过最大值原理,可以确定最优控制输入 u ( t ) u(t) u(t)应该在 ±1 之间取值,并依照一定的法则进行切换,使得过渡时间最短。

Bang-Bang 控制

Bang-Bang 控制是一种特殊的时间最优控制方法,其特点是控制输入 u ( t ) u(t) u(t)只取两个极限值(±1),并根据系统状态进行切换。具体来说,当状态偏离目标时,控制输入取最大值或最小值,以使系统尽快趋向目标状态。

时间最优的PID控制

在时间最优的PID控制中,我们引入Bang-Bang 控制策略,使得控制输入只取 ±1 两个值,并根据误差进行切换。传统PID控制律为:

u ( t ) = K p e ( t ) + K i ∫ e ( t )   d t + K d d e ( t ) d t u(t) = K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} u(t)=Kpe(t)+Kie(t)dt+Kddtde(t)

在时间最优控制中,我们将控制输入进行限幅:

u ( t ) = { 1 if  K p e ( t ) + K i ∫ e ( t )   d t + K d d e ( t ) d t > 1 − 1 if  K p e ( t ) + K i ∫ e ( t )   d t + K d d e ( t ) d t < − 1 K p e ( t ) + K i ∫ e ( t )   d t + K d d e ( t ) d t otherwise u(t) = \begin{cases} 1 & \text{if } K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} > 1 \\ -1 & \text{if } K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} < -1 \\ K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} & \text{otherwise} \end{cases} u(t)= 11Kpe(t)+Kie(t)dt+Kddtde(t)if Kpe(t)+Kie(t)dt+Kddtde(t)>1if Kpe(t)+Kie(t)dt+Kddtde(t)<1otherwise

Python代码示例

下面是一个实现时间最优的PID控制算法的Python代码示例。假设我们有一个简单的速度控制系统,通过时间最优的PID控制器使系统速度快速达到期望值。

import numpy as np
import matplotlib.pyplot as plt

# 定义系统参数
dt = 0.01  # 时间步长
t = np.arange(0, 10, dt)  # 时间数组
n = len(t)

# 初始化状态变量
velocity = np.zeros(n)  # 系统速度
desired_velocity = np.ones(n) * 10  # 期望速度

# 控制器参数
Kp = 2.0  # 比例增益
Ki = 1.0  # 积分增益
Kd = 0.5  # 微分增益

# 初始化误差变量
e_prev = 0  # 上一时刻的误差
integral = 0  # 误差积分

# 模拟系统
for i in range(1, n):
    # 计算误差
    e = desired_velocity[i] - velocity[i-1]
    
    # 误差积分
    integral += e * dt
    
    # 误差微分
    derivative = (e - e_prev) / dt
    
    # PID控制器输出
    u = Kp * e + Ki * integral + Kd * derivative
    
    # Bang-Bang 控制限幅
    if u > 1:
        u = 1
    elif u < -1:
        u = -1
    
    # 更新系统速度
    velocity[i] = velocity[i-1] + u * dt
    
    # 更新上一时刻的误差
    e_prev = e

# 绘制结果
plt.figure(figsize=(10, 4))
plt.plot(t, desired_velocity, label='Desired Velocity')
plt.plot(t, velocity, label='Actual Velocity')
plt.xlabel('Time [s]')
plt.ylabel('Velocity')
plt.legend()
plt.title('Time-Optimal PID Control for Velocity System')
plt.grid(True)
plt.show()

在这里插入图片描述

代码解释

  1. 系统参数和时间数组:定义了时间步长 dt 和时间数组 t,用来模拟系统在一段时间内的行为。
  2. 状态变量初始化:初始化了系统速度 velocity 和期望速度 desired_velocity
  3. 控制器参数:定义了时间最优PID控制器的比例增益 Kp、积分增益 Ki 和微分增益 Kd
  4. 误差变量初始化:初始化了上一时刻的误差 e_prev 和误差积分 integral
  5. 系统模拟:通过迭代计算,在每个时间步长内根据PID控制律计算控制输入,并根据Bang-Bang 控制策略进行限幅,更新系统速度。
  6. 结果绘制:使用 matplotlib 绘制系统速度和期望速度的变化曲线。

结论

时间最优的PID控制算法通过引入Bang-Bang 控制策略,使得控制输入只取 ±1 两个值,从而实现系统从初始状态快速到达目标状态。通过限制控制输入的取值范围,时间最优控制可以避免系统频繁振荡,提高系统的动态响应性能。在实际应用中,时间最优的PID控制算法适用于需要快速响应的控制系统,能够显著改善系统的动态特性。结合Python代码示例,可以更直观地理解时间最优的PID控制算法的基本原理和实现方法。

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

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

相关文章

(39)智能电池

文章目录 前言 1 通过任务规划器进行设置 2 补充信息 3 限制条件 4 参数说明 前言 虽然还不是很普遍&#xff0c;但智能电池更容易从飞行器上安装和拆卸&#xff0c;并且能够提供更多关于电池状态的信息&#xff0c;包括容量、单个电池电压、温度等。 ArduPilot 支持几种…

【分布式系统】 单机架构 | 分布式架构 | 集群 | 主从架构 | 分库分表 | 冷热分离 | 微服务

文章目录 [toc] 分布式系统一、单机架构二、分布式系统三、应用服务器集群四、读写分离 / 主从分离架构五、引入缓存/冷热分离架构六、垂直分库七、微服务架构——业务拆分代价优势 八、名词解释1.应用&#xff08;Application&#xff09;/系统(System)2.模块&#xff08;Mode…

解决“QtCreator无法呼出搜狗输入法“问题

由于在Ubuntu系统上&#xff0c;QtCreator软件默认使用IBus类型的输入法&#xff0c;而搜狗输入法是fcitx类型的&#xff0c;所以需要在Linux的系统设置 -->区域与语言 里 -->勾选 fcitx类型&#xff0c;如图(1)所示。     这里以QtCreator 4.5.2Ubuntu 18为例&#xf…

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1&#xff0c;导入信号、报文、节点 2&#xff0c;导入数据库 3&#xff0c;导入can代码 4&#xff0c;导入环境变量 5&#x…

RTP协议基础

概述 1. 基本概念 RTP协议&#xff0c;全称为Real-time Transport Protocol&#xff08;实时传输协议&#xff09;是一种用于在IP网络上传输音频、视频等实时数据的网络协议。 在流媒体&#xff08;流媒体就是指可在线/实时观看音视频的互联网产品&#xff09;数据传输过程中&…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

Vue响应式的原理

一. Vue响应式原理的核心概念 1. Vue响应式原理基于以下核心概念&#xff1a; ① 响应式对象&#xff1a;Vue使用Object.defineProperty()来 reactive&#xff08;反应&#xff09;对象中的属性&#xff0c;使其变化可以被检测。 注意&#xff1a; ★ Object.definePropert…

Python字符串处理技巧:一个小技巧竟然能省下你一半时间!

获取Pyhon及副业知识&#xff0c;关注公众号【软件测试圈】 效率翻倍的秘密&#xff1a;Python字符串操作的5个惊人技巧 在Python编程中&#xff0c;字符串处理在数据分析、Web开发、自动化脚本等多个领域都有广泛应用。Python提供了一系列强大的字符串处理函数&#xff0c;能够…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代&#xff0c;城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生&#xff0c;以其强大的功能和创新的理念&#xff0c;成为构建城市智能商业枢纽中心的关键力量&#xff0c;推动着平台互通、业务贯通、管理协同的全新发展格局。…

MySQL数据库-索引和视图

一、视图 1.什么是视图 MySQL中的视图&#xff08;view&#xff09;是一种虚拟表&#xff0c;其内容由查询定义&#xff0c;视图本身并不包含数据。视图看起来和真实的表完全相同&#xff0c;但其中的数据来自定义视图时用到的基本表&#xff0c;并且在打开视图时动态生成&am…

【JavaWeb项目】——外卖订餐系统之登入、登入后显示餐品信息、用户注册、注销部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

什么是内网ip地址?如何查询电脑内网ip地址

在数字化时代&#xff0c;互联网已经成为我们日常生活和工作中不可或缺的一部分。无论是家庭网络还是企业办公环境&#xff0c;每台接入网络的设备都需要一个独特的标识来区分彼此&#xff0c;这个标识就是IP地址。IP地址全称为“互联网协议地址”&#xff0c;是设备在网络中的…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

react中路由懒加载

// 1.引入方法&#xff0c;用于创建路由实例 // createBrowserRouter是用于创建history模式 // createHashRouter是用于创建hash模式 // 路由模式的切换只需要更改创建路由实例的方法就行了&#xff0c;其他地方不需要更改 import { createBrowserRouter,createHashRouter } fr…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&#xff0c;重新拉取新的pod来实…

【Vue3复习】Vite创建项目报错解决

报错&#xff1a; Cannot find package ‘vite’ 出错原因分析 使用命令npm create vuelatest创建项目时&#xff0c;没有按顺序执行以下提示命令 解决 依序执行这三条指令 注意 如果没有执行 npm install 这条指令&#xff0c;直接用VS Code打开项目时&#xff0c;env.d.…

职场英语培训柯桥成人学外语|邮件里别乱用“Dear”,老外才不会这么写!

写邮件是职场上的必修课&#xff0c;而一封好的英语邮件应当从适合的称呼开始。 说到称呼&#xff0c;你的脑子里是不是冒出了一个单词“Dear” 从小我们就被教育写英语作文时&#xff0c;开头先来个Dear&#xff0c;结尾写个Sincerely&#xff0c;简直不要太顺手~ 然&#xff…

HDU1071——The area,HDU1072——Nightmare,HDU1073——Online Judge

目录 HDU1071——The area 题目描述 运行代码 代码思路 HDU1072——Nightmare 题目描述 运行代码 代码思路 HDU1073——Online Judge 题目描述 运行代码 代码思路 HDU1071——The area 题目描述 Problem - 1071 运行代码 #include <iostream> #include &…

CloudWeGo新手教程视频:手把手教你从0到1打造电商商城微服务demo

概要 Gomall 电商项目视频教程&#xff0c;由 CloudWeGo 技术社区出品&#xff0c;旨在帮助开发者掌握 Go 语言项目开发和微服务架构。教程通过演示 CloudWeGo 项目中的 Kitex 和 Hertz 框架&#xff0c;引导 Go 初学者学习常见的技术和开源中间件。 观看教程请访问&#xff…

高效灵活 | 前端利器 Vue.js 是一个构建用户界面的渐进式框架。

Vue.js 是一个构建用户界面的渐进式框架。 官网&#xff1a;https://cn.vuejs.org/ 基本特性 数据驱动&#xff1a;通过响应式机制&#xff0c;实现数据的变化自动触发视图的更新。 组件化架构&#xff1a;高度可复用的组件结构&#xff0c;提升代码组织性和可维护性。 虚拟…