LADRC的离散化实现(Mark一下,重新开始)

2023-11-16

LADRC的离散化实现

一、感慨

  上一次写博客是两年前了,现在已经过了那么久,期间经历了许多事,有好有坏,不多大多时候是丧的。到了现在,终究让我相通了一件事情,深刻理解并追求自己想要做的事情是会幸福的。通过读了许多书,在b站上看了许多视频,通过自身经历,总结得到了一个学习新的方法,以后还会不断的更新迭代。用模型,抽象的方法来观察和看待这是世界,但是前提我需要理解深刻。因此,在处于还有一年就毕业的状态下,打算恶补计算机知识,先提升自己理解知识的深度和广度,再形成自己看待世界的方法。

  为了填补两年前的坑,我在一年半以前把离散化 LADRC 写出来了,但是我在课题中一直没有用上,放着也觉得浪费,因此打算分享出来。期间也看到过别人用 C 语言啊等等写过离散的 ADRC,但是为了保证自己写博客的完善性,我决定还是放出来,算是有一段结束,再进行新的开始。

二、LADRC离散实现

  直接进入正题,因为是一年半以前写的了,过程和期间考虑的也忘记了,这次仅仅做一个总结,不能太保证准确性,同时自己工作重心也不想放这上面了(Xin Lei),但是框架和方向肯定是没错的。选择一个简单的对象进行实验,对于一个传递函数,
G ( s ) = 1 s 2 + 2 s + 4 (1) G(s) = \frac{1}{s^2+2s+4} \tag{1} G(s)=s2+2s+41(1)
  采样时间选择0.001s,因此得到z变换的传递函数为,
G ( z ) = 4.997 ∗ 1 0 − 7 z + 4.993 ∗ 1 0 − 7 z 2 − 1.998 z + 0.998 (2) G(z) = \frac{4.997*10^{-7}z+4.993*10^{-7}}{z^2-1.998z+0.998} \tag{2} G(z)=z21.998z+0.9984.997107z+4.993107(2)
  接下来基于LADRC的框架进行离散化,其中LESO部分离散化为,

%% 包含了初始化部分和迭代部分
% 初始化部分
z1 = zeros(1, len);
z2 = zeros(1, len);
z3 = zeros(1, len);

% Future z(i-1)   now z(i-2)   before  z(i-3)
z1(2) = z1(1) + sampleTime*(3*omega_o*(y(3) - z1(1)) + z2(1));
z2(2) = z2(1) + sampleTime*(3*omega_o^2*(y(3) - z1(1)) + b0*u(2) + z3(1));
z3(2) = z3(1) + sampleTime*(omega_o^3*(y(3) - z1(1)));

%% 迭代部分
for i = 1:len-1
    % Future z(i-1)   now z(i-2)   before  z(i-3)
    z1(i+2) = z1(i+1) + sampleTime*(3*omega_o*(y(i+3) - z1(i+1)) + z2(i+1));
    z2(i+2) = z2(i+1) + sampleTime*(3*omega_o^2*(y(i+3) - z1(i+1)) + b0*u(i+2) + z3(i+1));
    z3(i+2) = z3(i+1) + sampleTime*(omega_o^3*(y(i+3) - z1(i+1)));
    
    z1(i+1) = z1(i+2);
    z2(i+1) = z2(i+2);
    z3(i+1) = z3(i+2);
end

  PD控制器部分,

%% 初始化部分
% y(k) = -1.998*y(k-1) - 0.998*y(k-2) + 4.997e-7*u(k) + 4.993e-7*u(k - 1)
y = zeros(1, len);
u = zeros(1, len);

% Initialize all
e1(1) = input_signal(1) - z1(1);
u0(1) = Kp*e1(1) - Kd*z2(1);
e2(1) = u0(1) - z3(1);

u(1) = 0;
u(2) = e2(1) / b0;

% G(s) = 1/(s^2 + 2*s + 4);
% Gz = c2d(G, sampleTime) -----> Y/U = (4.997e-07 z + 4.993e-07) / (z^2 - 1.998 z + 0.998)
y(3) = 1.998*y(2) - 0.998*y(1) + 4.997e-7*u(2) + 4.993e-7*u(1);
error = 0;

%% 迭代部分
    e1(i+1) = input_signal(i+1) - z1(i+1);
    u0(i+1) = Kp*e1(i+1) - Kd*z2(i+1);
    e2(i+1) = u0(i+1) - z3(i+1);
    
    error = error + abs(e1(i+1));
    u(i+2) = e2(i+1) / b0;
    % G(s) = 1/(s^2 + 2*s + 4);
    
    % Gz = c2d(G, sampleTime) -----> Y/U = (4.997e-07 z + 4.993e-07) / (z^2 - 1.998 z + 0.998)
    y(i+3) = 1.998*y(i+2) - 0.998*y(i+1) + 4.997e-7*u(i+2) + 4.993e-7*u(i+1);

    y(i+1) = y(i+2);
    y(i+2) = y(i+3);
    
    u(i+1) = u(i+2);

  LADRC整体结构构建程序

% step 1: transfer function descrete.
% step 2: assemble all

clear
clc

%% Set sample time and end time, note: shanno sampling theory
sampleTime = 0.001;
offset = 0;

% 1.0
endtime = 1.5;
len = endtime / sampleTime;
t = sampleTime:sampleTime:endtime;

%% Parameter

%%% 0.019   15   180
%%% 0.05    15   90

b0 = 0.019;      % bo greater than or equal to b
omega_c = 15;
omega_o = 187.6250;

b0 = 0.019;      % bo greater than or equal to b
omega_c = 20;
omega_o = 187;

Kp = omega_c.^2;
Kd = 2*omega_c;

%% Set input signal
switch(1)
    case 1
        stepTime = 0.1;
        Temp = stepTime / sampleTime;
        input_signal(1:Temp) = 0;
        input_signal(Temp:len+1) = 1;
    case 2
        input_signal = impluse();
    case 3
        input_signal = wave();
    case 4
        input_signal = userDefine();
end

%% Descrete transfer function
% G(s) = 1/(s^2 + 2*s + 4);
% Gz = c2d(G, sampleTime) -----> Y/U = (4.997e-07 z + 4.993e-07) / (z^2 - 1.998 z + 0.998)
% Z^(-1) --->  y(k+2) - 1.998*y(k+1) + 0.998*y(k) = 4.997e-7*u(k+1) + 4.993e-7*u(k)
%        --->  y(k) = 1.998*y(k-1) - 0.998*y(k-2) + 4.997e-7*u(k-1) + 4.993e-7*u(k-2)

%% Initialize all
u0 = zeros(1, len);

z1 = zeros(1, len);
z2 = zeros(1, len);
z3 = zeros(1, len);

e1 = zeros(1, len);
e2 = zeros(1, len);

% Up to Gp(s) transfer function.
% y(k) = -1.998*y(k-1) - 0.998*y(k-2) + 4.997e-7*u(k) + 4.993e-7*u(k - 1)
y = zeros(1, len);
u = zeros(1, len);

%% Initialize all
e1(1) = input_signal(1) - z1(1);
u0(1) = Kp*e1(1) - Kd*z2(1);
e2(1) = u0(1) - z3(1);

u(1) = 0;
u(2) = e2(1) / b0;

% G(s) = 1/(s^2 + 2*s + 4);
% Gz = c2d(G, sampleTime) -----> Y/U = (4.997e-07 z + 4.993e-07) / (z^2 - 1.998 z + 0.998)
y(3) = 1.998*y(2) - 0.998*y(1) + 4.997e-7*u(2) + 4.993e-7*u(1);

% Future z(i-1)   now z(i-2)   before  z(i-3)
z1(2) = z1(1) + sampleTime*(3*omega_o*(y(3) - z1(1)) + z2(1));
z2(2) = z2(1) + sampleTime*(3*omega_o^2*(y(3) - z1(1)) + b0*u(2) + z3(1));
z3(2) = z3(1) + sampleTime*(omega_o^3*(y(3) - z1(1)));

error = 0;
%% Pro proccessing and update
for i = 1:len-1
    e1(i+1) = input_signal(i+1) - z1(i+1);
    u0(i+1) = Kp*e1(i+1) - Kd*z2(i+1);
    e2(i+1) = u0(i+1) - z3(i+1);

    error = error + abs(e1(i+1));
    u(i+2) = e2(i+1) / b0;
    
    % G(s) = 1/(s^2 + 2*s + 4);
    % Gz = c2d(G, sampleTime) -----> Y/U = (4.997e-07 z + 4.993e-07) / (z^2 - 1.998 z + 0.998)
    y(i+3) = 1.998*y(i+2) - 0.998*y(i+1) + 4.997e-7*u(i+2) + 4.993e-7*u(i+1);
    
    % Future z(i-1)   now z(i-2)   before  z(i-3)
    z1(i+2) = z1(i+1) + sampleTime*(3*omega_o*(y(i+3) - z1(i+1)) + z2(i+1));
    z2(i+2) = z2(i+1) + sampleTime*(3*omega_o^2*(y(i+3) - z1(i+1)) + b0*u(i+2) + z3(i+1));
    z3(i+2) = z3(i+1) + sampleTime*(omega_o^3*(y(i+3) - z1(i+1)));
    
    y(i+1) = y(i+2);
    y(i+2) = y(i+3);
    
    z1(i+1) = z1(i+2);
    z2(i+1) = z2(i+2);
    z3(i+1) = z3(i+2);
    
    u(i+1) = u(i+2);

end

error = error / length(u);

% input_signal = input_signal(1:len);
% u = u(1:len);
% y = y(1:len);
% z1 = z1(1:len);
% z2 = z2(1:len);
% z3 = z3(1:len);

%%
subplot(311)
plot(t, input_signal(1:len), t, y(1:len), t, z1(1:len),'--');
xlabel('Time array');
ylabel('set and y');
legend('set', 'y', 'z1')
subplot(312)
plot(t, z2(1:len))
xlabel('Time array');
ylabel('z2 Value');
legend('z2');
subplot(313)
plot(t, z3(1:len))
xlabel('Time array');
ylabel('z3 Value');
legend('z3');

三、结果

  其中LADRC参数选择为 b 0 = 0.019 , ω c = 15 , ω o = 187.6250 b_0=0.019,\omega_c=15,\omega_o=187.6250 b0=0.019,ωc=15,ωo=187.6250,最后运行结果如下,
在这里插入图片描述
  这里第一幅图为响应曲线,第二个为LESO估计的y的导数,第三个为LESO估计的总扰动。

四、总结

  通过离散化以后发现,在Matlab中使用Simulink仿真实际上是被优化过的,在现实应用中,LADRC受到了采样时间和噪声的约束。希望以后有机会能在工程中真的应用一下检测它的极限在哪些地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LADRC的离散化实现(Mark一下,重新开始) 的相关文章

  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he
  • 通过颜色渐变修补圆

    我正在尝试绘制一个颜色渐变 我希望它沿轴均匀 在下图由角度定义的情况下 pi 7 当我使用patch命令 绘图与所需的梯度方向匹配 但沿其方向并不均匀 沿圆的点之间形成各种三角形 这是代码 N 120 theta linspace pi p
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • 拟合具有扭曲时基的正弦波

    我想知道在 Matlab 中拟合具有扭曲时基的正弦波的最佳方法 时间失真由 n 阶多项式 n 10 给出 其形式为t distort P t 例如 考虑失真t distort 8 12t 6t 2 t 3 这只是幂级数展开 t 2 3 这将
  • 如何在Matlab中将图像从笛卡尔坐标更改为极坐标?

    我正在尝试将图像的像素从 x y 坐标转换为极坐标 但我遇到了问题 因为我想自己编写该函数 这是我到目前为止所做的代码 function newImage PolarCartRot read and show the image image
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • 如何调整x轴和y轴的大小

    如何调整 x 轴和 y 轴的大小 我想要什么 更具体 3900 60 30 0 60 120 180 3600 我做了什么 a 0 0 1 10000 plot a 我应该写什么才能按预期调整 x 和 y 轴的大小 EDIT 我不想 390
  • Python 中的 eig(a,b) 给出错误“需要 1 个位置参数,但给出了 2 个”

    根据https docs scipy org doc numpy 1 15 0 user numpy for matlab users html https docs scipy org doc numpy 1 15 0 user nump
  • matlab 中的 for 或 while 循环

    我刚刚开始在编程课的 matlab 中使用 for 循环 基本的东西对我来说很好 但是我被要求 使用循环创建一个 3 x 5 矩阵 其中每个元素的值是其行号其列号除以行号和列号之和的幂 例如元素 2 3 的值为 2 3 2 3 1 6 那么
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it

随机推荐

  • MySQL中Char和VarChar的区别

    VarChar VARCHAR类型用于存储可变长字符串 是最常见的字符串数据类型 它比定长类型更节省空间 因为它仅使用必要的空间 例如 越短的字符串使用越少的空间 有一种情况例外 如果MySQL表使用ROW FORMAT FIXED创建的话
  • linux开机自动挂载配置文件/etc/fstab

    如果我们想实现开机自动挂载某设备 只要修改 etc fstab文件即可 文件挂载的配置文件 etc fstab 查看此文件可知 每行定义一个要挂载的文件系统 其每行的格式如下 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项 转储频
  • Go []byte to a C *char

    https stackoverflow com questions 35673161 convert go byte to a c char ok b buf Bytes rc C the function unsafe Pointer b
  • c语言的标识符可分为哪3种字符,c语言标识符有哪三类?

    在计算机编程语言中 标识符是用户编程时使用的名字 用于给变量 常量 函数 语句块等命名 以建立起名称与使用之间的关系 标识符通常由字母和数字以及其它字符构成 c语言标识符的分类 C语言中标识符有三类 分别是 关键字 预定义标识符和用户标识符
  • MyBatis中resultMap解决映射关系(多对一、一对多)

    一 多对一映射处理 查询员工信息以及员工所对应的部门信息 public class Emp private Integer eid private String empName private Integer age private Str
  • 神经网络matlab工具箱有关参数设置

    1 常见参数 net trainParam epochs 最大训练次数 net trainParam goal 训练要求精度net trainParam lr 学习速率net trainParam show 显示训练迭代过程net trai
  • 如何使用远程仓库进行团队合作

    前言 如若我们的远程仓库又有了一名新的开发者 这时 新的开发者需要拉取远程仓库与其他开发者合作 文章目录 如何拉取远程仓库到本地仓库 git方法 clone远程分支 获取远程其他分支 Tortoise Git方法 clone远程分支 VS2
  • K8S部署前后端分离项目并支持Mysql和Redis数据持久化保存

    Springboot Vue Mysql Redis 文章目录 前端 1 default conf文件 2 创建Dockerfile 生成镜像 依赖nginx挂载配置文件 3 执行完以上步骤后 进行build tag push远程仓库 4
  • 软件质量管理-考试复习总结

    1 软件工程发展 软件开发的四大本质难题 不可见性 复杂性 一致性 可变性 除了不可见性以外 其他三个本质难题因项目而异 四大本质难题互动促进 可以缓解 但是不能彻底解决 软件危机 落后的软件生产方式无法满足迅速增长的计算机软件需求 从而导
  • cartographer-ros阅读梳理(一)数据接收部分

    一 前言 前段时间去忙了些杂活项目 调调代码测测算法 这几天闲下来准备硕士开题的事情 SLAM方面能开展的工作大家都大同小异 之前在梳理实验室程序的时候遇到一些阻碍 有一部分是引用的cartographer的东西 师兄把那部分的代码阉的千奇
  • upload-labs靶场-Pass-04关-思路以及过程

    开始前的小准备 upload labs靶场 是PHP环境运行的 所以我准备了一个PHP脚本和一张图片 图片好准备 PHP脚本如果不想写的话可以用我的这个获取当前时间的PHP脚本 还需要准备一个 htaccess下面的 脚本 是你上传文件的名
  • Python+Selenium- 环境搭建

    一 Selenium 简介 Selenium是目前最流行的web自动化测试工具 也常用于网络爬虫 已经更新到3以上的版本 1 组件 它提供了以下web自动化测试组件 Selenium IDE Firefox浏览器的一个插件 提供简单的脚本录
  • mysql 触发器 sql_mysql动态SQL的运用 (trigger、function、procedure)

    mysql中 当你在trigger function中编写动态的sql时 编译时就会出现 Error 1336 Dynamic SQL is not allowed in stored function or trigger trigger
  • Linq使用方法

    Linq是一种面向对象的查询方式 它和SQL语句及其类似 sql写法 select from 表 Linq写法 from n in 数据源 select n 为什么不跟sql写法一样将select一同写在语句的开头呢 主要是当时做IDE时考
  • elasticsearch安装部署和期间遇到的问题和解决

    因为工作需要用到elasticsearch 最近在测试环境部署单机版的elasticsearch服务 可以说是相当的波折 一个问题解决一个问题又来 都要吐血了已经 还好最终都得以解决 解决后那一刻真尼玛的爽啊啊啊 问题列表 elastics
  • 将本地项目上传到gitlab

    1 安装git https git scm com downloads 2 新建工程 3 创建密钥 a 桌面右键 b cd ssh 如果提示 No such file or directory 你可以手动的创建一个 ssh文件夹即可 mkd
  • 日本“性爱机器人”上线1小时被抢空

    来源 正商参阅 局座召忠 李开复 蒋东平网络等 日本 妻子 机器人被哄抢 不要房车不要彩礼 日本研发出一款 美女机器人 将其命名为 妻子 光看她的外形 你能识别出她其实只是一个机器人吗 60分钟售出万台 第一点就是人们所关注的价格方面 在日
  • node.js 环境安装(windows)

    准备需要安装的电脑 下载node js的安装包 地址 http nodejs cn download 下载的安装包双击打开 依次按照下图指示执行 下图点击接受 后下一步 下图 根据实际情况选择安装位置 如果记不住建议选择默认位置 直接点击n
  • 使用Python+VTK获取3D体渲染模型任意角度切面(更新中)

    目录 效果图 实现目标 安装依赖 Code 其他需求 效果图 废话少说先上效果图 右边红色的plane是想要获取3D模型对应切面的平面 左边是这个切面的切片的图像 实现目标 定义一个任意角度的切面 都能把体绘制模型的这个切面的图像获取 并且
  • LADRC的离散化实现(Mark一下,重新开始)

    LADRC的离散化实现 一 感慨 上一次写博客是两年前了 现在已经过了那么久 期间经历了许多事 有好有坏 不多大多时候是丧的 到了现在 终究让我相通了一件事情 深刻理解并追求自己想要做的事情是会幸福的 通过读了许多书 在b站上看了许多视频