[控制理论]—差分变换法与双线性变换法的基本原理和代码实现

差分变换法与双线性变换法的基本原理和代码实现

1.差分变换法

差分变换法就是把微分方程中的导数用有限差分来近似等效,得到一个与原微分方程逼近的差分方程。

差分变换法包括后向差分与前向差分。

1.1 后向差分法

差分变换如下:
d e ( t ) d t = e ( k T ) − e ( k T − T ) T \frac{de(t)}{dt}=\frac{e(kT)-e(kT-T)}{T} dtde(t)=Te(kT)e(kTT)
对两边进行z变换,可得:
s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} s=T1z1
后向差分变换法又称后向矩阵积分法,即用后向矩形面积来代替。因此当采样周期较大时,这种变换方法精度变差。

由变换过程可知:

  • 若D(s)稳定,则D(z)一定稳定;对于不稳定的D(s),D(z)也有可能稳定。
  • 由于后向差分变换不再满足z变换定义z=e^(sT),因此s平面与z平面的映射关系发生了改变,数字控制器D(z)的频率响应产生了较大的畸变。

严重的频率映射畸变导致变换精度下降,使后向差分变换的应用受到了一定限制,但当系统性能要求不是很高时,后向差分也起到一定作用。


D ( s ) = 20 s + 80 s + 10 , T = 0.015 D(s) = \frac{20s+80}{s+10},T=0.015 D(s)=s+1020s+80,T=0.015
采用后向差分,代入下式:
s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} s=T1z1
可得:
D ( z ) = U ( z ) E ( z ) = 21.2 − 20 z − 1 1.15 − z − 1 D(z) = \frac{U(z)}{E(z)}=\frac{21.2-20z^{-1}}{1.15-z^{-1}} D(z)=E(z)U(z)=1.15z121.220z1
进行z反变换,可得:
u ( k ) = 0.87 u ( k − 1 ) + 18.43 e ( k ) − 17.39 e ( k − 1 ) u(k)=0.87u(k-1)+18.43e(k)-17.39e(k-1) u(k)=0.87u(k1)+18.43e(k)17.39e(k1)
进一步探究采样频率对系统映射的影响,matlab代码如下:

numerator = [20, 80];     
denominator = [1, 10]; 
G = tf(numerator, denominator);G_discrete1 = c2d(G, 0.01, 'foh'); 
G_discrete2 = c2d(G, 0.001, 'foh');
G_discrete3 = c2d(G, 0.0001, 'foh');figure;
hold on; bode(G, G_discrete1, G_discrete2, G_discrete3);

所得bode图为:

在这里插入图片描述

由bode图可知,当采样频率为0.01时,离散系统有较大影响;当采样频率为0.001甚至更高时,离散系统基本能反应连续系统的特性。

通过后向差分设计一个PID控制器,C语言伪代码实现如下:

// PID参数
#define KP 1.0f    // 比例增益
#define KI 0.1f    // 积分增益
#define KD 0.05f   // 微分增益// 控制变量
float setpoint = 100.0f;     // 目标速度
float currentSpeed = 0.0f;   // 实际速度
float previousSpeed = 0.0f;  // 上一速度
float integral = 0.0f;       // 积分值
float lastTime = 0.0f;       // 上次计算时间
float deltaTime = 0.1f;      // 计算周期,假设为0.1秒void PID_Controller() {float error = setpoint - currentSpeed;integral += error * deltaTime;float derivative = (currentSpeed - previousSpeed) / deltaTime;float output = (KP * error) + (KI * integral) - (KD * derivative);// 更新电机控制信号(假设控制信号范围为0-255)if (output > 255) {output = 255;} else if (output < 0) {output = 0;}setMotorSpeed((uint8_t)output);previousSpeed = currentSpeed;
}void readCurrentSpeed() {currentSpeed = getMotorSpeedFromEncoder(); 
}int main(void) {while (1) {readCurrentSpeed(); PID_Controller();   Delay(100);     }
}

verilog实现如下,输出限幅等功能未实现:

module PID_Controller (input wire clk,               		// 时钟信号input wire rst,             	    // 复位信号input wire [15:0] setpoint,  	    // 目标值input wire [15:0] current_value,    // 当前值output reg [15:0] control_output    // 控制输出
);parameter [15:0] KP = 16'd2; // 比例增益
parameter [15:0] KI = 16'd1; // 积分增益
parameter [15:0] KD = 16'd1; // 微分增益reg [15:0] error;            // 误差
reg [15:0] previous_value;   // 上一时刻的当前值
reg [31:0] integral;         // 积分值
reg [15:0] derivative;       // 微分值always @(posedge clk or posedge rst) beginif (rst) begincontrol_output <= 16'd0;previous_value <= 16'd0; integral <= 32'd0;        end else beginerror <= setpoint - current_value;integral <= integral + error;derivative <= current_value - previous_value;control_output <= (KP * error) + (KI * integral[15:0]) - (KD * derivative);previous_value <= current_value;end
end
endmodule

1.2 前向差分法

前向差分变换原理:
d e ( t ) d t = e ( k T + T ) − e ( k T ) T \frac{de(t)}{dt}=\frac{e(kT+T)-e(kT)}{T} dtde(t)=Te(kT+T)e(kT)
进行z变换可得:
s = z − 1 T s = \frac{z-1}{T} s=Tz1
前向差分性质如下:

  • 若D(s)稳定,则D(z)不一定稳定。
  • 数字控制器D(z)的频率响应会产生较大畸变。

因此,前向差分很少被使用。

2.双线性变换法

双线性变化法又被称为Tustin变换法,推导过程如下:
z = e T s = e T s / 2 − T s / 2 z = e^{Ts}=e^{\frac{Ts/2}{-Ts/2}} z=eTs=eTs/2Ts/2
对e^(Ts/2)部分进行泰勒级数展开,并取前两项近似:
z = 2 / T + s 2 / T − s z = \frac{2/T+s}{2/T-s} z=2/Ts2/T+s
得到双线性变换法的计算公式为:
s = 2 T z − 1 z + 1 s = \frac{2}{T}\frac{z-1}{z+1} s=T2z+1z1
双线性变换的特点为:

  • 若D(s)稳定,则D(z)也稳定。
  • 变换前后的频率响应发生畸变。
  • 不存在频率混叠现象。

对matlab函数c2d进行简要说明;

c2d:将模型从连续时间转换为离散时间

sysd = c2d(sysc,Ts,method) 指定离散化方法

离散化方法,指定为以下值之一:

  • 'zoh' - 零阶保持(默认值)。假定控制输入在采样时间周期 Ts 内是分段常量。
  • 'foh' - 三角形逼近(修正一阶保持)。假定控制输入在采样时间周期 Ts 内是分段线性值。
  • 'impulse' - 冲激不变离散化
  • 'tustin' - 双线性(突斯汀)方法。要使用频率预修正指定此方法(以前称为 'prewarp' 方法),请使用 c2dOptionsPrewarpFrequency 选项。
  • 'matched' - 零极点匹配法
  • 'least-squares' - 最小二乘法
  • 'damped' - 仅基于稀疏模型的 TRBDF2 公式的阻尼突斯汀逼近。

首先对比相同采样频率下使用后向差分与双线性变换的性能影响:

numerator = [20, 80];     
denominator = [1, 10]; 
G = tf(numerator, denominator);G_discrete1 = c2d(G, 0.015, 'foh'); 
G_discrete2 = c2d(G, 0.015, 'tustin');figure;
hold on; bode(G, G_discrete1, G_discrete2);

由bode图可知,在该采样频率下,双线性变换与差分变化作用效果近似。

在这里插入图片描述

将采样频率降低到0.15:

numerator = [20, 80];     
denominator = [1, 10]; 
G = tf(numerator, denominator);G_discrete1 = c2d(G, 0.15, 'foh'); 
G_discrete2 = c2d(G, 0.15, 'tustin');figure;
hold on; bode(G, G_discrete1, G_discrete2);

观察bode图,此时使用双线性变化效果优于后向差分:

在这里插入图片描述

使用chatGPT对比这两种方法:

后向差分(Backward Difference)和双线性差分(Bilinear Difference)是数值分析中常用的差分方法,它们在不同的场景下各有优势。下面分别分析这两种方法的适用场景及优劣。

  • 后向差分的优势场景
  1. 稳定性要求高的系统
    • 后向差分法是稳定的,尤其适合处理刚性系统。刚性系统的特点是某些动态特性变化非常快,这使得普通的显式方法难以稳定计算。后向差分能有效避免不稳定现象。
  2. 计算时间延迟的情况
    • 在一些实时系统中,后向差分法可以使用最新的已知数据点来估计当前状态,这在需要延迟计算的系统中非常有用,如控制系统中的实时反馈。
  3. 简单实现
    • 对于线性时间不变系统,后向差分的实现较为简单,特别是在不需要复杂的求解算法时。
  4. 误差控制
    • 后向差分通常能更好地控制截断误差,尤其在时间步长较大的情况下,避免了由大时间步带来的数值误差累积。
  • 双线性差分的优势场景
  1. 高频动态响应
    • 双线性差分法能够更好地处理高频动态系统,尤其在需要高精度模拟频率响应特性的情况下,能够较好地保留系统的动态特性。
  2. 非线性系统的处理
    • 在处理非线性系统时,双线性差分法的表现往往优于后向差分。因为它能更有效地捕捉系统的变化,提供更准确的结果。
  3. 数值稳定性与精度的折中
    • 双线性差分法在保持数值稳定性的同时,能够提供更高的精度。特别是在需要优化精度的应用场景下,如电子电路模拟、信号处理等,双线性差分具有明显优势。
  4. 适应多种时间步长
    • 双线性差分能够更好地适应不同的时间步长,能够灵活应对多种动态情况,因此在自适应算法中较为常用。
  • 总结
  • 后向差分适合于需要稳定性和较简单实现的场合,尤其是在刚性系统和实时反馈控制中。
  • 双线性差分适合于高频动态响应、非线性系统以及需要高精度的应用场合。

简而言之,后向差分已经适用于大部分场景,针对特殊情况,再考虑使用双线性差分。

C语言代码实现例子:

#include <stdio.h>double Kp = 1.0; // 比例增益
double Ki = 0.5; // 积分增益
double Kd = 0.1; // 微分增益// 采样周期
double Ts = 0.01;// PID控制器状态
double integral = 0.0; // 积分项
double prev_error = 0.0; // 上一时刻的误差double PID_Controller(double setpoint, double measured_value) {double error = setpoint - measured_value;integral += error * Ts;double derivative = (2 * (error - prev_error)) / Ts; // 双线性差分法计算微分double output = Kp * error + Ki * integral + Kd * derivative;prev_error = error;return output;
}

verilog代码:

module PID_Controller (input wire clk,input wire reset,input wire [15:0] setpoint,        // 目标值input wire [15:0] measured_value,  // 测量值output reg [15:0] control_signal   // 控制信号输出
);parameter Kp = 16'd100; // 比例增益
parameter Ki = 16'd50;  // 积分增益
parameter Kd = 16'd10;  // 微分增益reg [15:0] integral; 
reg [15:0] prev_error; 
reg [15:0] error; 
reg [15:0] derivative; always @(posedge clk or posedge reset) beginif (reset) beginintegral <= 0;prev_error <= 0;control_signal <= 0;end else beginerror <= setpoint - measured_value;integral <= integral + error;derivative <= (error - prev_error) * 2; control_signal <= (Kp * error + Ki * integral + Kd * derivative) >> 8; prev_error <= error;end
end
endmodule

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

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

相关文章

下一个赛场见!从中网看海尔智家的全球化布局

下一个赛场见&#xff01; 我想这是每个看完中国网球公开赛女子决赛后&#xff0c;清晰又坚定的约定。正如国庆假期后&#xff0c;下一个假期见成为很多人的期待。 10月6日&#xff0c;备受瞩目的中国网球公开赛女子决赛迎来了最高光时刻并落下帷幕。 美国选手高芙获得冠军&…

如何高效开展关联方风险监控?

关联方风险监控是指对企业与其关联方之间的交易、资金往来、担保等行为进行监控&#xff0c;以识别和防范潜在的风险。以下是一些高效开展关联方风险监控的方法&#xff1a; 1.建立关联方识别机制&#xff1a; 明确关联方的定义&#xff0c;包括直接或间接控制企业的个人或实体…

一个月学会Java 第5天 控制结构

Day5 控制结构 这么叫可能有些就算有基础的人也看不懂&#xff0c;其实就是if-else、switch-case、for、while、do-while这几个&#xff0c;没基础的听到了这个也不要慌张&#xff0c;这几个是程序的基础&#xff0c;多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

算法:前缀和算法模版

一维前缀和 题目 链接&#xff1a;一维前缀和模版题 思路分析 一&#xff1a;暴力O(q * N) 对于每一次询问&#xff0c;我们都可以用一个循环计算[l,r]区间内的元素和&#xff0c; 时间复杂度&#xff0c;O(q * N) 每一次计算一个区间都需要去循环一次&#xff0c;这是不是…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

如何避免PuTTY的连接超时

问题&#xff1a;使用PuTTY默认创建的SSH连接&#xff0c;过一会就会提示“Remote side unexpectedly closed network connection" 解决方法&#xff1a; 要防止PuTTY会话由于空闲而断开连接&#xff0c;可以通过启用keep-alives功能&#xff0c;使PuTTY定期向远程主机发…

2-116 基于matlab的主成分分析(PCA)及累积总和(CUSUM)算法故障监测

基于matlab的主成分分析&#xff08;PCA&#xff09;及累积总和&#xff08;CUSUM&#xff09;算法故障监测&#xff0c;针对传统的多元统计分析方法对生产过程中微小故障检测不灵敏的问题&#xff0c;使用基于主元分析的累积和的微小故障检测方法进行故障监测&#xff0c;通过…

【多重循环在Java中的应用】

多重循环在Java中的应用 介绍 多重循环是将一个循环嵌套在另一个循环体内的编程结构。Java中的 for、while 和 do...while 循环均可作为外层循环和内层循环。建议使用两层嵌套&#xff0c;最多不超过三层&#xff0c;以保持代码的可读性。 在多重循环中&#xff0c;外层循环执…

开源项目都是怎么推广的?

大家好&#xff0c;我是爱折腾的刘大逵。跟我接触过的技术们都知道&#xff0c;一年一年的都在折腾着做一些项目&#xff0c;年年有进步&#xff0c;年年有想法&#xff0c;年年在折腾。今天给大家分享GITEE如何上推荐&#xff01; GITEE推荐有什么用&#xff1f; 众所周知&a…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

回到原点再出发

原文What Goes Around Comes Around作者Michael Stonebraker & Joseph M. Hellerstein其他译文https://zhuanlan.zhihu.com/p/111322429 1. 摘要 本文总结了近35年来的数据模型方案&#xff0c;分成9个不同的时代&#xff0c;讨论了每个时代的方案。我们指出&#xff0c;…

Linux安装配置Jupyter Lab并开机自启

文章目录 1、安装配置jupyter lab首先需要使用pip3安装&#xff1a;生成配置文件和密码&#xff1a; 2、设置开机自启首先通过which jupyter查询到可执行文件路径&#xff1a;设置自启服务&#xff1a; 1、安装配置jupyter lab 首先需要使用pip3安装&#xff1a; pip3 instal…

(22)以RS码为例说明信道编码AWGN信道的Eb/N0设置

文章目录 前言一、编码Eb/N0与未编码Eb/N0及编码码率二、仿真代码三、仿真结果 前言 本文说明了如何为采用信道编码的通信链路设置Eb/N0&#xff08;比特能量与噪声功率谱密度比&#xff09;。 一、编码Eb/N0与未编码Eb/N0及编码码率 在通信系统仿真中&#xff0c;如果采用了…

10.8摩尔学习知识点

今天学习获取数据 在摩尔云平台找到要修改的主视图&#xff0c;然后点击操作功能&#xff0c;点击新增&#xff0c;直接输入名字获取数据&#xff0c;然后&#xff0c;显示顺序15&#xff0c;显示是&#xff0c;点击确定&#xff0c;然后就是自定义类上面输入创建的类名&#…

怎么在抖音直播间录屏?主播会知道吗?录屏软件推荐

在抖音直播间录屏&#xff0c;主播通常不会收到直接通知提示某个观众正在录屏。在抖音直播间录屏&#xff0c;主播通常是不知道的。抖音平台没有为主播提供查看观众录屏行为的相关功能或提示&#xff0c;所以从平台功能角度来说&#xff0c;主播无法直接察觉观众的录屏操作。 然…

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束

职场中的人情世故,你懂了多少?

职场如战场&#xff0c;稍有不慎&#xff0c;满盘皆输。 职场如江湖&#xff0c;不是打打杀杀&#xff0c;而是人情世故。 成年人的世界里没有“容易”二字&#xff0c;我们也需要懂得哪些人情世故和。 职场上的各种光怪陆离现象&#xff0c;有很多职场人吐槽&#xff1a;“…

以后再也不要说程序员不能拿诺贝尔了

当地时间10月8日&#xff0c;瑞典皇家科学院宣布&#xff0c;将2024年诺贝尔物理学奖授予美国普林斯顿大学的约翰霍普菲尔德&#xff08;John J. Hopfield&#xff09;和加拿大多伦多大学的杰弗里辛顿&#xff08;Geoffrey E. Hinton&#xff09;&#xff0c;以表彰他们“为推动…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…