迭代学习笔记

一、迭代学习定义和分类

1、直观理解

  • 迭代学习一般应用于重复性的场景。比如控制一个单自由度的小车以特定的速度曲线移动到指定位置,整个时间是10s,控制频率是0.01,那么整个控制序列就会有1000个点。这1000个点在10s内依次发出,完成依次控制,目的就是让小车的速度或者位置跟踪上特定的曲线。我们有一个优势在于跟踪曲线不变,那么我们可以不断进行尝试,只要获得一组良好的控制序列,那么就可以完成控制。

2、更新率

  • 如果我们可以设置一个更新率,根据每一个点面临的误差对控制量进行修改,那么就可以在若干次更新后获得完美的控制序列。
    新控制量 = 旧控制量 + 更新率 新控制量 = 旧控制量 + 更新率 新控制量=旧控制量+更新率

  • 根据更新率与什么参数有关,可以分为开环、闭环、开闭环。如果跟上一次的误差有关就是开环,如果跟此刻的误差有关就是闭环,如果都有关就是开闭环。根据更新率的结构还可以分为D型、PD型等。

  • 需要注意一下有D型和PD型,没有P型,我在仿真中试了半天P型都不收敛。

二、实现例子

  • 网上关于迭代学习的代码实现比较少,很多还是用simulink搭的,不方便复现。这里给一个D型闭环迭代学习例子,被控对象是一个钟摆小车,全部代码用python实现,直接运行即可。
    在这里插入图片描述

1、动力学模型

# 动力学模型函数
def dynamics(state, u):x, theta, dx, dtheta = statedd_x = (u + m2*l*dtheta*dtheta + m2*g*np.sin(theta)*np.cos(theta)) / (m1 + m2*np.sin(theta)*np.sin(theta))dd_theta = (-dd_x*np.cos(theta) + dx*np.sin(theta)*dtheta - np.sin(theta)*(dx*dtheta + g)) / lreturn np.array([dx, dtheta, dd_x, dtheta])

2、四阶龙格库塔积分器和控制器更新率

# 四阶龙格库塔法函数
def RK4(t_start, t_end, fun, Npoints, init_state, u_list, pos_des, spd_des):t = np.linspace(t_start, t_end, Npoints)dt = t[1] - t[0]state = np.zeros((Npoints, len(init_state)))state[0, :] = init_statee = np.zeros((Npoints, 2))for i in range(Npoints-1):u_list[i] = u_list[i] + 1 * (spd_des[i] - state[i, 2])  # 闭环D型更新率u = u_list[i]e[i, 0] = pos_des[i] - state[i, 0]e[i, 1] = spd_des[i] - state[i, 2]k1 = fun(state[i, :], u)k2 = fun(state[i, :] + 0.5 * dt * k1, u)k3 = fun(state[i, :] + 0.5 * dt * k2, u)k4 = fun(state[i, :] + dt * k3, u)state[i + 1, :] = state[i, :] + (1/6) * dt * (k1 + 2 * k2 + 2 * k3 + k4)return state, u_list, e

3、进行迭代

for i in range(10):# 运行RK4state, u_list, e_buff = RK4(t_start, t_end, dynamics, Npoints, [0, 0, 0, 0], u_list, pos_des, spd_des)

4、完整代码和效果展示

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd# 动力学模型函数
def dynamics(state, u):x, theta, dx, dtheta = statedd_x = (u + m2*l*dtheta*dtheta + m2*g*np.sin(theta)*np.cos(theta)) / (m1 + m2*np.sin(theta)*np.sin(theta))dd_theta = (-dd_x*np.cos(theta) + dx*np.sin(theta)*dtheta - np.sin(theta)*(dx*dtheta + g)) / lreturn np.array([dx, dtheta, dd_x, dtheta])# 四阶龙格库塔法函数
def RK4(t_start, t_end, fun, Npoints, init_state, u_list, pos_des, spd_des):t = np.linspace(t_start, t_end, Npoints)dt = t[1] - t[0]state = np.zeros((Npoints, len(init_state)))state[0, :] = init_statee = np.zeros((Npoints, 2))for i in range(Npoints-1):u_list[i] = u_list[i] + 1 * (spd_des[i] - state[i, 2])  # 闭环D型更新率u = u_list[i]e[i, 0] = pos_des[i] - state[i, 0]e[i, 1] = spd_des[i] - state[i, 2]k1 = fun(state[i, :], u)k2 = fun(state[i, :] + 0.5 * dt * k1, u)k3 = fun(state[i, :] + 0.5 * dt * k2, u)k4 = fun(state[i, :] + dt * k3, u)state[i + 1, :] = state[i, :] + (1/6) * dt * (k1 + 2 * k2 + 2 * k3 + k4)return state, u_list, e# 参数设置
m1 = 5
m2 = 1
l = 1
g = 9.8t_start = 0
t_end = 10
Npoints = 10000
t = np.linspace(t_start, t_end, Npoints)# 期望位置和速度
pos_des = np.sin(t) + t
spd_des = np.cos(t) + 1pos_des = t * t + 2 * t
spd_des = 2 * t + 2# 初始状态和控制输入
u_list = [0] * 10000# 创建图形对象
plt.figure(figsize=(12, 12))for i in range(20):# 运行RK4state, u_list, e_buff = RK4(t_start, t_end, dynamics, Npoints, [0, 0, 0, 0], u_list, pos_des, spd_des)# 清除当前图像plt.clf()# 绘制实际位置和期望位置的对比图plt.subplot(3, 1, 1)plt.plot(t, state[:, 0], label='Actual x (position)')plt.plot(t, pos_des, label='Desired x (position)', linestyle='--')plt.xlabel('Time (s)')plt.ylabel('Position')plt.legend()plt.title(f'Iteration {i+1}')# 绘制实际速度和期望速度的对比图plt.subplot(3, 1, 2)plt.plot(t, state[:, 2], label='Actual dx (velocity)')plt.plot(t, spd_des, label='Desired dx (velocity)', linestyle='--')plt.xlabel('Time (s)')plt.ylabel('Velocity')plt.legend()# 绘制控制输入(力)曲线plt.subplot(3, 1, 3)plt.plot(t, u_list, label='Control input (force)')plt.xlabel('Time (s)')plt.ylabel('Force')plt.legend()# 显示图像plt.pause(0.01)# 最后显示图像
plt.show()# 将误差和力存储到CSV文件
data = np.hstack((e_buff, np.array(u_list).reshape(-1, 1)))
df = pd.DataFrame(data, columns=['Position Error', 'Velocity Error', 'Control Input'])
df.to_csv('error_and_force_data.csv', index=False)

在这里插入图片描述

5、实物效果

  • 这个曲线不是上面仿真小车钟摆的实物测试,而是一个有一定质量的物体yaw轴回转的控制效果,展示的是位置曲线。这个物体受到不小的摩擦力,所以在开始迭代时开始和后来都会有停止不动的情况出现。同时,摩擦力也导致这个物体受到很大的干扰,就像小车钟摆的重物一样。

  • 值得一提的是整个实物的算法测试过程非常顺利,在代码完成后,一次测试就成功了。使用的还是闭环D型迭代学习,经过三四次迭代就收敛到期望曲线附近了。这说明迭代学习还是一种很实用的算法。
    在这里插入图片描述

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

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

相关文章

小白快速入门量化交易的自学路径

今年已然过去一半了,年初立的flag都实现了吗? 据我多年来的观察,很多小白萌新开始学习量化,特别是年初的时候立下“宏图大志”,但有相当一部分最终没能"上岸",从入门到放弃,从然后到没…

数据结构2—顺序表(附源码)

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就是说连续的一条直线…

抽象java入门1.5.2

前言: 坑留下来是为了补的 正片: 一、面向对象特性 二、面向对象编程详细展开 这些没有加粗的方法究竟来源哪? 在上一期的提示中,我们说了这些方法来源于面向对象编程的一个特性 验证: 第一步:我们先…

区块链空投之空投合约

关于 solidity、空投、智能合约 空投作为区块链行业最大的惊喜之一,很多人都是通过空投才接触到了这一领域。 甚至有很多专业薅空投羊毛的专业玩家。行业内有句话,小薅养活妻儿、大薅… 文章目录 前言空投到底是什么空投什么?空投合约代码空投步骤代码解析代码详解前言 今…

代码随想录算法训练营第23天|39. 组合总和、40.组合总和II、131.分割回文串

打卡Day23 1.39. 组合总和2.40.组合总和II3.131.分割回文串 1.39. 组合总和 题目链接:39. 组合总和 文档讲解: 代码随想录 这道题和昨天做的组合之和由两个区别:被选的元素没有数量限制,同时被选的元素可以无限重复,…

【嵌入式开发之标准I/O】流的刷新、定位以及格式化输出、输入

流的刷新 int fflush(FILE *fp); 成功时返回0;出错时返回EOF。 将流缓冲区中的数据写入实际的文件。 Linux下只能刷新输出缓冲区,输入缓冲区丢弃。 如果输出到屏幕使用fflush(stdout)。 流的定位 流的定位:ftell()函数 long ftell(FILE *stream)…

JavaScript:节流与防抖

目录 一、前言 二、节流(Throttle) 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装节流函数 三、防抖(Debounce) 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装防抖函数 四、异同点总结 一、前言 …

信息检索(39):Condenser: a Pre-training Architecture for Dense Retrieval

Condenser: a Pre-training Architecture for Dense Retrieval 摘要1 引言2 相关工作3 方法3.1 前提3.2 Transformer 编码器的问题3.3 Condenser3.4 Transformer 编码器的 Condenser 4 实验4.1 预训练4.2 句子相似度4.3 开放域问答检索4.4 Web search 检索 5 注意力分析6 结论 …

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro(简称Pr)是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用,包括Windows和Mac系统,并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

《从C/C++到Java入门指南》- 9.字符和字符串

字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符,所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

npm install时报错 reason: connect ETIMEDOUT

在VS code中导入新项目,执行npm install时报错: npm warn old lockfile Could not fetch metadata for antv/coord0.1.0 FetchError: request to https://registry.npmjs.org/antv%2fcoord failed, reason: connect ETIMEDOUT 150.242.56.251:443 npm w…

大数据之路 读书笔记 Day8 数据存储

回顾: 大数据之路 读书笔记 Day7 实时技术 简介及流式技术架构 大数据之路 读书笔记 Day6 离线数据开发之数据开发平台 数据存储 1 数据类型 实时任务在运行过程中,会计算很多维度和指标,这些数据需要放在一个存储系统中作为恢复或者关联使…

微信小程序开发:DOM 相关 API 使用详解

在微信小程序开发中,与传统的网页开发相比,由于安全性和性能考虑,访问 DOM(文档对象模型)是受限的。然而,微信小程序提供了一些特定的 API,使开发者能够处理和操作视图层,实现丰富的…

Transformer之Vision Transformer结构解读

论文地址 代码地址 写在前面 什么是Transformer呢?就是把符号向量化为Token, 再和位置编码求和或者做阿达玛积,最后送入一定层数的Attention Block构成的Encoder和Decoder,就完成了Transformer的基础功能。 那么,把上…

C基础函数——内存分配(未完)

在C语言中,内存管理是非常重要的一部分。C语言提供了几种不同的函数用于动态内存分配和释放,这些函数允许程序在运行时根据需要分配和回收内存。以下是C语言中常用的几个内存管理函数: malloc() void malloc(size_t size); 这个函数用于请求…

C++中枚举(enum)的用法和限制

在C中,枚举(enum)是一种用户定义的类型,它允许程序员为整数常量指定易于阅读的名字。枚举类型是由一组命名的整型常量组成的类型,每个常量都表示该类型的一个有效值。枚举在编程中常用于表示一组固定的值,如…

MySQL:mysql的数据类型

MySQL 作为一个流行的关系型数据库管理系统,支持多种数据类型以满足不同的数据处理和存储需求。正确理解和使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。 MySQL 数据类型 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。…

idea2019版本创建JavaWeb项目并配置Tomcat步骤

一、创建JavaWeb项目 1.新建项目File->New->Project 2. 选择JavaWeb应用在New Project窗口中选择Java后勾选Java EE中的Web Application后点击next即可 3.设置项目名称后点击finish即可 4.至此项目创建完成,检查文件是否齐全,开始配置Tomcat 二、…

IDEA工具中Java语言写小工具遇到的问题

一:读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法: 在pom.xml中把poi的引文包放在最前面即可(目前就算放在最后面也不报错了,不知道为啥) 二:本地maven打包时,没有…