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

2024-02-17 15:30

本文主要是介绍特征模型仿真例1:参数辨识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要 多种不同信号输入一个稳定的4阶系统,根据系统的输入和输出信号建立参考特征模型并使用最小二乘法辨识参数,比较多种输入信号下的辨识结果。
专栏全部文章见 基于特征模型的全系数自适应控制。

题目

考虑被控对象
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))
    在这里插入图片描述

注意到最后两个正弦信号的辨识结果不准,把遗忘因子改大即可,例如改成0.99时,第3个信号的辨识结果为
在这里插入图片描述

代码

全部使用C++

把最小二乘法封装成一个类,主程序使用 simucpp 仿真。

/**************************************************************
// 特征模型仿真例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;
}

c++与python混合

被控对象使用 simucpp 并封装成动态链接库供python调用(见 Python通过SWIG调用C++),调试起来更方便。
下面为python主函数,完整代码见 https://gitee.com/xd15zhn/character_example

from plants import Plant
import numpy as np
import matplotlib.pyplot as pltplant = Plant()
plott, plotf1, plotf2, plotg = [], [], [], []
theta = np.array([[2.], [-1.], [-0.]])
P = np.eye(3)*1e6
lamb = 0.99
u = 0.
yk1, yk2 = 0, 0
for n in range(50):# u = 10.u = 0.97*u + 0.3# u = 10*np.cos(0.1*n*np.pi)# u = 10*np.sign(np.cos(0.1*n*np.pi))plant.Set_Input(u)plant.Simulate(50)y = plant.Get_Output()x = np.array([[yk1], [yk2], [u]])K = np.matmul(P, x) / (lamb + np.matmul(x.T, np.matmul(P, x)))P = 1/lamb * np.matmul((np.eye(3) - np.matmul(K, x.T)), P)theta += K*(y - np.matmul(x.T, theta))yk2, yk1 = yk1, yplott.append(n*0.05)plotf1.append(theta[0, 0])plotf2.append(theta[1, 0])plotg.append(theta[2, 0])
print('finished')
plt.plot(plott, plotf1)
plt.plot(plott, plotf2)
plt.plot(plott, plotg)
plt.show()

这篇关于特征模型仿真例1:参数辨识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/718213

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言