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

news2024/10/9 8:00:40

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

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) begin
    if (rst) begin
        control_output <= 16'd0;
        previous_value <= 16'd0; 
        integral <= 32'd0;        
    end else begin
        error <= 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) begin
    if (reset) begin
        integral <= 0;
        prev_error <= 0;
        control_signal <= 0;
    end else begin
        error <= 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.coloradmin.cn/o/2198494.html

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

相关文章

Stable Diffusion绘画 | 签名、字体、Logo设计

第1步&#xff0c;使用 PS&#xff08;小白推荐使用 可画&#xff09;准备一个 512*768 的签名、字体、Logo图片&#xff1a; 第2步&#xff0c;来到模型网站&#xff0c;搜索&#x1f50d;关键词“电商”&#xff0c;找到一款喜欢的 LoRA&#xff1a; 第3步&#xff0c;选择一…

什么是fastText

1. 什么是fastText 英语单词通常有其内部结构和形成⽅式。例如&#xff0c;我们可以从“dog”“dogs”和“dogcatcher”的字⾯上推测它们的关系。这些词都有同⼀个词根“dog”&#xff0c;但使⽤不同的后缀来改变词的含义。而且&#xff0c;这个关联可以推⼴⾄其他词汇。 在wor…

初学者如何快速入门人工智能

一、引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;&#xff0c;作为当今科技领域极具前景与影响力的方向之一&#xff0c;吸引着众多人士投身其中。无论是对科技充满好奇的学生&#xff0c;还是意图拓展职业发展路径的职场人士&#xff0c…

Linux的图形系统概述 (TODO)

&#xff08;TODO&#xff09; Linux graphics stack 现代 Linux 图形栈由多个子系统和层次组成&#xff0c;从应用程序到硬件之间的各个层面协同工作来处理图形显示和硬件加速。随着时间的推移&#xff0c;Linux 从传统的 **X Window System** 逐步过渡到 **Wayland**&#x…

filebrowser:轻松管理服务器文件,跨平台云端存储新选择

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 filebrowser是一款功能强大的文件管理器&#xff0c;用户可以通过浏览器对服务器上的文件进行修改、添加、删除甚至分享。其界面简洁&#xff0c;操作…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习07(基于docker容器的防火墙及NAT企业实战)

7.1 网络准备 7.2 网络规划 1&#xff09;虚拟网络编辑器 点击右下方“更改设置”&#xff0c;点击“添加网络”假如vmnet3和vmnet4&#xff0c;然后分别选择vmnet3和vmnet4&#xff0c;设置为“仅主机模式”&#xff0c;按③处处理&#xff0c;去掉“使用DHCP”&#xff0c;…

Unite Shanghai 2024 团结引擎专场 | 团结引擎 OpenHarmony 工程剖析

在 2024 年 7 月 24 日的 Unite Shanghai 2024 团结引擎专场演讲中&#xff0c;Unity中国 OpenHarmony 技术负责人刘伟贤对团结引擎导出的 OpenHarmony 工程进行了细节剖析&#xff0c;详细讲解 XComponent 如何与引擎结合&#xff0c;UI 线程和引擎线程的关联以及 ts/ets 的代…

瓷片区该如何设计?这里有几十个样式呀

瓷片区在设计中扮演着重要的角色&#xff0c;它可以快速吸引用户的注意力&#xff0c;引导用户进行进一步的探索。那么&#xff0c;瓷片区该如何设计呢&#xff1f;这里有几十个样式可供参考。

大数据新视界 --大数据大厂之 Hudi 数据湖框架性能提升:高效处理大数据变更

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

CSS 图标和文本对齐

比如下面一段HTML代码&#xff0c;我们想在图标旁边显示文本或者数字 <body> <div><img src"smile.svg" alt"smile"><span>12</span></div> <div><img src"heartShape.svg" alt"…

卫星测绘AI技术-立哥尖端科研

分布式微波干涉测绘卫星是以多颗满足一定编队构形的卫星为平台&#xff0c;以合成孔径雷达 和高精度星间相对状态测量设备等为有效载荷&#xff0c;具备全天时、全天候获取雷达干涉影像数 据&#xff0c;快速测制全球数字表面模型、数字雷达正射影像等测绘产品能力的卫星系统…

如何选择适合的自闭症学校寄宿方式

自闭症&#xff0c;这一日益受到社会关注的特殊需求领域&#xff0c;正逐步吸引着越来越多的教育资源与专业力量。对于许多自闭症儿童的家庭而言&#xff0c;选择一个合适的学校寄宿方式&#xff0c;不仅是对孩子未来成长的投资&#xff0c;更是对家庭幸福的期盼。在广州这座繁…

Android Studio实现安卓心理健康咨询

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目代号161 1.开发环境 android stuido3.6 jdk1.8 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.心理测评 3.测评结果 4.心理咨询预约 5.心理综合辅导 6.个人中心 7.历史咨…

自动生成实体类,mapper类,mapper.xml文件

使用mybatis generator&#xff08;无需安装&#xff0c;对于外网有限制的真的很友好&#xff09; 1. 在pom文件中配置mysql相关依赖&#xff0c;并添加plugin <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId…

VMWare安装和基本使用NixOS Linux 24.05版本

文章目录 简介Nix 语言基础知识NixOS 虚拟机创建 VMWare 的 NixOS 虚拟机安装说明Nix 包管理器安装Windows(WSL)上安装Linux 上安装Docker 上安装MacOS 上安装NixOS 的安装下载 ISO 镜像安装 NixOS修改语言网络配置设置位置设置键盘设置账号和密码桌面环境分区完成安装登录系…

免费送源码:Apache+B/S+Springboot+MySQL 商城综合项目自动化系统 计算机毕业设计原创定制

摘 要 目前电商系统商城项目管理极其频繁,迫切地需要自动化测试来代替人工繁琐而又重复的劳动。自动化测试相关的研究已经很多,但多数只是针对某一方面,比如单一接口或者单一页面或者性能等,而缺乏将接口、页面、持续集成系统和缺陷管理系统整合的自动化测试平台。本研究采用混…

鸟类数据集,鸟数据集,目标检测class:bird,共一类13000+张图片yolo格式(txt)

鸟类数据集&#xff0c;鸟数据集&#xff0c;目标检测class:bird&#xff0c;共一类13000张图片yolo格式&#xff08;txt&#xff09; 鸟类数据集&#xff0c;鸟数据集&#xff0c;目标检测 class:bird&#xff0c;共一类 13000张图片 yolo格式&#xff08;txt&#xff09; 鸟…

sql堆叠注入

准备知识&#xff1a; php中multi_query()&#xff1a;一次可以执行多个sql语句比如&#xff1a;查询注入id1&#xff1b;update xxx; 定义&#xff1a;如果后端代码中&#xff0c;数据库执行的方法是multi_query()&#xff0c;那么就可以一次执行多个sql&#xff0c;也就可以…

在虚拟机里试用了几个linux操作系统

在虚拟机里试用了几个操作系统。遇到一些问题。虚拟机有时候出错。有时候出现死机现象&#xff0c;有的不能播放视频。有的显示效果不太好。 试了debian12&#xff0c;ubuntu20.4&#xff0c;ubuntu22.4&#xff0c;ubuntu24.4&#xff0c;deepin。其中ubuntu20.4使用时没有出…

neo4j知识图谱管理系统,结合es全文检索,知识管理系统

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…