特征模型仿真例1:参数辨识

news2024/11/15 19:47:27

题目

考虑被控对象
G ( s ) = 3 s + 4 s 4 + 5 s 3 + 10 s 2 + 6 s + 4 G(s)=\frac{3 s+4}{s^{4}+5 s^{3}+10 s^{2}+6 s+4} G(s)=s4+5s3+10s2+6s+43s+4
和特征模型
y ( k ) = ϕ T ( k − 1 ) θ ( k ) y(k)=\boldsymbol{\phi}^{\mathrm{T}}(k-1)\boldsymbol{\theta}(k) y(k)=ϕT(k1)θ(k)
其中
ϕ ( k − 1 ) = [ y ( k − 1 ) y ( k − 2 ) u ( k − 1 ) ] T θ ( k ) = [ f 1 ( k ) f 2 ( k ) g 0 ( k ) ] T \begin{aligned} \phi(k-1) =& [\begin{matrix} y(k-1) & y(k-2) & u(k-1) \end{matrix}]^{\mathrm{T}} \\ \theta(k) =& [\begin{matrix} f_{1}(k) & f_{2}(k) & g_{0}(k) \end{matrix}]^{\mathrm{T}} \end{aligned} ϕ(k1)=θ(k)=[y(k1)y(k2)u(k1)]T[f1(k)f2(k)g0(k)]T
控制输入 u u u 取如下四种形式:

  1. 阶跃信号 u ( k ) = 10 u(k)=10 u(k)=10
  2. 经 “平滑” 的阶跃信号 u ( k ) = 0.97 u ( k − 1 ) + 0.3 u(k)=0.97u(k-1)+0.3 u(k)=0.97u(k1)+0.3
  3. 周期为 1 1 1 的正弦信号 u ( k ) = 10 cos ⁡ ( 2 π k T ) u(k)=10\cos(2\pi kT) u(k)=10cos(2πkT)
  4. 周期为 1 1 1 的方波信号 u ( k ) = 10 sign ⁡ ( cos ⁡ ( 2 π k T ) ) u(k)=10\operatorname{sign}(\cos(2\pi kT)) u(k)=10sign(cos(2πkT))

采样周期取 Δ t = 0.05 \Delta t=0.05 Δt=0.05

仿真

下面的所有仿真都使用 simucpp。
原系统阶跃响应结果
在这里插入图片描述
原系统阶跃响应程序

# include "simucpp.hpp"
using namespace simucpp;
using namespace zhnmat;
using namespace std;
int main() {
    Simulator sim1;
    FUInput(uin1, &sim1);
    FUOutput(uout1, &sim1);
    auto *tf1 = new TransferFcn(&sim1, vecdble{3, 4}, vecdble{1, 5, 10, 6, 4});
    sim1.connectU(uin1, tf1, 0);
    sim1.connectU(tf1, 0, uout1);
    uin1->Set_Function([](double t){return 10;});
    sim1.Initialize();
    sim1.Simulate(10);
    sim1.Plot();
    return 0;
}
  1. 阶跃信号 u ( k ) = 10 u(k)=10 u(k)=10
    在这里插入图片描述
  2. 经 “平滑” 的阶跃信号 u ( k ) = 0.97 u ( k − 1 ) + 0.3 u(k)=0.97u(k-1)+0.3 u(k)=0.97u(k1)+0.3
    在这里插入图片描述
  3. 周期为 1 1 1 的正弦信号 u ( k ) = 10 cos ⁡ ( 2 π k T ) u(k)=10\cos(2\pi kT) u(k)=10cos(2πkT)
    在这里插入图片描述
  4. 周期为 1 1 1 的方波信号 u ( k ) = 10 sign ⁡ ( cos ⁡ ( 2 π k T ) ) u(k)=10\operatorname{sign}(\cos(2\pi kT)) u(k)=10sign(cos(2πkT))
    在这里插入图片描述
    全部代码
/**************************************************************
特征模型仿真例1:参数辨识
simucpp版本:2.1.12
**************************************************************/
#include <cmath>
#include "simucpp.hpp"
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
using namespace simucpp;
using namespace zhnmat;
using namespace std;
constexpr double LIMIT(double x, double min, double max) {
    return x<=min ? min : (x>=max ? max : x);}
constexpr double SIGN(double x) {
    return x<0 ? -1 : (x>0 ? 1 : 0);}

class ParamIdentifier {
public:
    ParamIdentifier(double sigma=0) {
        _P = eye(3) * 1e6;
        _theta = Mat(vecdble{2, -1, 0});
        _lambda = 0.5;
    };
    Mat Update(double u, double y) {
        Mat x(vecdble{_yk1, _yk2, u});
        Mat K = 1/(_lambda + (x.T()*_P*x).at(0, 0)) * _P * x;
        _P = (eye(3) - K*x.T()) * _P / _lambda;
        _theta += K * (y - (x.T()*_theta).at(0, 0));
        _yk2 = _yk1; _yk1 = y;
        return _theta;
    }
    Mat _P;  // P矩阵
    Mat _theta;  // 特征模型参数(f1, f2, g)
    double _lambda;  // 遗忘因子
    double _yk1=0, _yk2=0;  // y(k-1)
};

int main() {
    Simulator sim1;
    FUConstant(uin1, &sim1);
    FUOutput(uout1, &sim1);
    auto *tf1 = new TransferFcn(&sim1, vecdble{3, 4}, vecdble{1, 5, 10, 6, 4});
    ParamIdentifier idf;
    sim1.connectU(uin1, tf1, 0);
    sim1.connectU(tf1, 0, uout1);
    sim1.Initialize();

    Mat theta(3, 1);
    vecdble plott, plotf1, plotf2, plotg;
    double outValue = 0;
    for (uint32_t i = 0; i < 50; i++) {  // 周期0.05仿真50次为2.5秒
        // outValue = 10;
        outValue = 0.97*outValue + 0.3;
        // outValue = 10*cos(0.1*i*M_PI);
        // outValue = 10*SIGN(cos(0.1*i*M_PI));
        uin1->Set_OutValue(outValue);
        for (uint32_t j = 0; j < 50; j++)  // 步长0.001秒仿真50次为T=0.05秒
            sim1.Simulate_OneStep();
        theta = idf.Update(uin1->Get_OutValue(), uout1->Get_OutValue());
        plott.push_back(0.05*(i+1));
        plotf1.push_back(theta.at(0, 0));
        plotf2.push_back(theta.at(1, 0));
        plotg.push_back(theta.at(2, 0));
    }
    plt::named_plot("f1", plott, plotf1);
    plt::named_plot("f2", plott, plotf2);
    plt::named_plot("g", plott, plotg);
    plt::legend();
    plt::show();
    // sim1.Plot();
    return 0;
}

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

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

相关文章

谁告诉我这是什么文件,怎么了?活不起了?得靠这个冲业绩?

TIM 从一年前就卸载了&#xff0c;今天整理磁盘才发现还有这么多文件&#xff0c;想着没什么用直接删掉得了&#xff0c;没想到他娘的死活删不掉&#xff0c;好多文件一个一个删才找到这玩意&#xff0c;所有能查找运行程序的地方都找遍了&#xff0c;死活没找到在哪打开了&…

第一章 系统服务监控-SpringBootAdmin

前言 本来想用一节就写完SpringBootAdmin的&#xff0c;但随着研究的深入发现一节应该是不够的&#xff0c;网上的资料也不会非常系统&#xff0c;官网的例子有些已经好几年没更新了&#xff0c;所以接下来还是系统性的来写下吧 第一节 完成基础配置&#xff0c;暴露所有端点…

​如何从任何地方访问办公室电脑?

​远程办公已然成为了一种常见的办公方式&#xff0c;在远程工作期间访问办公室电脑获取必要的文件或信息非常重要。与远程访问同一网络中的电脑不同&#xff0c;使用Windows远程桌面从外部访问办公室电脑需要进行端口转发。对于很多人来说&#xff0c;端口转发可能有点复杂。那…

SpringBoot整合RestTemplate用法讲解(完整详细)

前言&#xff1a;本篇主要介绍了RestTemplate中的GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE、文件上传和文件下载6大常用的功能&#xff0c;每一个方法和每一行代码都进行了详细的讲解&#xff0c;代码都是亲自测试过的&#xff0c;整篇博客写完以后自己也是受益匪…

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案 一。缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 方案一&#xff1a; 方案二&#xff1a; 二。缓存击穿 给某一个key设置了过期时间&#xff0…

Mongdb之Robo3T

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MyBatis详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光的…

2023年PTA行业研究报告

第一章 行业概况 精对苯二甲酸&#xff08;Pure Terephthalic Acid&#xff0c;简称PTA&#xff09;是一种主要用于制造聚酯纤维和塑料的关键化学品。PTA是一种白色结晶固体&#xff0c;可通过对苯二酮在催化剂的作用下进行氧化得到。它是聚对苯二甲酸乙二醇酯&#xff08;PET…

机器视觉三维重建

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链。 1、Meshroom ⭐4,474 Meshroom是一款基于AliceVision摄影测量计算机视觉框架的免费开源三维重建软件。 https://github.com/alicevision/meshroom 2、Openmvg ⭐2,829 Openmvg库根据三维计算机视觉和结构的运动。…

Web3 通过truffle 脚本进行智能合约测试

上文 Web3 处理智能合约部署到本地区块链&#xff0c;并在本地进行测试中 我们讲解了部署智能合约 然后在终端测试的方法 但上文那种终端测试 其实并不保险 而且也比较不专业 对于这个 有一个mocha测试 这是基于node部署环境的一种环境测试 但是这个需要一定的基础 大家可以专门…

国产BI工具和国外BI工具,差距大不大,用哪种比较好?

自“十四五”以来&#xff0c;我国诸多政策开始推动信创产业的深入&#xff0c;实现关键数字技术自主研发和自主可控。我国信创产业竞争力不断突破&#xff0c;国产化进程稳步推进。2022年开始政策重点提及“数字经济”、“数字政府”和国家信息化。在此背景下&#xff0c;BI产…

el-date-picker 的初始化数据格式理解、报错 “TypeError: date.getFullYear is not a function“

个人理解 如果后端传给前端的时间数据是字符串类型的&#xff0c;那么当触发 el-date-picker 组件时&#xff0c;就会报出很多错误&#xff0c;例如 这是由于初始化赋值格式的问题&#xff0c;需要对初始化值&#xff0c;进行一个 new Date(your_time_data) 前端演示模板&…

虚拟机快速克隆的步骤

目录 1、关于让应用的快捷方式出现在开始栏的方法2、使用VMware快速克隆2-12-22-32-42-5 克隆虚拟机命名 1、关于让应用的快捷方式出现在开始栏的方法 把应用的快捷方式&#xff0c;放到这个目录中 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs2、…

uniapp app分享pdf等文件等到微信以及其他应用

uniapp自带的api uni.share只能分享图文等&#xff0c;但不能分享pdf这种之类的 想实现分享文件这种就要调用系统的分享功能 分享插件地址 这个插件完美解决&#xff0c;安卓分享到微信也不需要配置appid 封装用法 /*** 任意文件分享,需勾选云插件并云打包* 安卓调用系统分享无…

DFS解决N-皇后问题

题目&#xff1a; n−皇后问题是指将 n个皇后放在 nn的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包…

《IntelliJ IDEA 2023最新版快捷键大全GIF动图演示》——提升你的开发效率

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

用css来实现上下左右箭头

i {/* 用border值来控制箭头粗细 */border: 3px solid black;/* 上、右、下、左 四个边框的宽度 */border-width: 0px 1px 1px 0px;display: inline-block;/* padding值控制箭头大小 */padding: 5px; } ____________________________________.right {transform: rotate(-45deg…

浮动——案例

案例1——做出如下图的框架 提示&#xff1a;用ul li来完成 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

KnowStreaming系列教程第一篇——安装和使用

KnowStreaming介绍 Know Streaming是一套云原生的Kafka管控平台&#xff0c;脱胎于众多互联网内部多年的Kafka运营实践经验&#xff0c;专注于Kafka运维管控、监控告警、资源治理、多活容灾等核心场景。在用户体验、监控、运维管控上进行了平台化、可视化、智能化的建设&#…

一份保姆级的Stable Diffusion部署教程,开启你的炼丹之路 | 京东云技术团队

市面上有很多可以被用于AI绘画的应用&#xff0c;例如DALL-E、Midjourney、NovelAI等&#xff0c;他们的大部分都依托云端服务器运行&#xff0c;一部分还需要支付会员费用来购买更多出图的额度。在2022年8月&#xff0c;一款叫做Stable Diffusion的应用&#xff0c;通过算法迭…

利用css实现渐变色(通俗易懂)

利用css实现渐变色 0、前言1、线性渐变2、径向渐变2.1 径向渐变2.1.1 圆形2.1.2 椭圆形 2.2 重复性径向渐变 3、边框颜色渐变3.1 边框渐变3.1.1 线性渐变3.1.2 径向渐变 3.2 单侧边框渐变3.2.1 底部边框线性渐变3.2.2 右侧边框线性渐变 4、扩展&#xff08;CSS线性渐变颜色网站…