PSO 优化 LQR 权重系数(2)

PSO 优化 LQR 权重系数(2)

主要编写了 MATLAB 代码,能够正常运行,注释还是比较详细的

%% 清空工作空间并跑一下路径规划
clc;
clear all;
run('double_lane.m');%% 基本参数设置
% 车辆参数
cf=-66900*2;
cr=-62700*2;
m=1723;
Iz=4175;
a=1.232;
b=1.468;% 纵向速度及AB矩阵计算
vx_km = 30;
vx = vx_km / 3.6;
A=[0,1,0,0;0,(cf+cr)/(m*vx),-(cf+cr)/m,(a*cf-b*cr)/(m*vx);0,0,0,1;0,(a*cf-b*cr)/(Iz*vx),-(a*cf-b*cr)/Iz,(a*a*cf+b*b*cr)/(Iz*vx)];
B=[0;-cf/m;0;-a*cf/Iz];%% PSO参数设置
w = 0.6;    % 惯性因子
c1 = 2;     % 权重因子
c2 = 2;Dim = 5;    % 维数
SwarmSize = 5;     % 粒子群规模
MaxIter = 5;      % 最大迭代次数
MinFit = 0.03;       % 最小适应值
Vmax = 20;   % 最大速度
Vmin = -20;  % 最小速度
Ub = [1000 1000 1000 1000 1000];   % 函数上界
Lb = [1 1 1 1 1]; % 函数下界
ObjFun = @PSO_LQR;  % 待优化函数句柄%% 初始化PSO
Range = ones(SwarmSize,1)*(Ub - Lb);
% 初始化粒子群和速度
Swarm = rand(SwarmSize, Dim).*Range + ones(SwarmSize,1)*Lb;
VStep = rand(SwarmSize, Dim)*(Vmax - Vmin) + Vmin;
% 初始化粒子群的适应值
fSwarm = zeros(SwarmSize, 1);
kSwarm = zeros(SwarmSize, 4);   % 记录不同种群的K值
for i = 1 : SwarmSize[fSwarm(i,:), kSwarm(i,:)] = feval(ObjFun, A, B, Swarm(i,:));
end
% 最小适应值的值及索引
[bestf,bestindex] = min(fSwarm);
zbest = Swarm(bestindex,:);     % 全局最佳
kbest = kSwarm(bestindex,:);    % 最佳适应度对应的K
gbest = Swarm;      % 个体最佳
fzbest = bestf;     % 全局最佳适应值
fgbest = fSwarm;    % 个体最佳适应值%% PSO迭代,循环搜索最优的QR
iter = 0;
while((iter < MaxIter) && (fzbest > MinFit))for j = 1: SwarmSize% 速度更新VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:)-Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));if VStep(j,:) > Vmax, VStep(j,:) = Vmax; endif VStep(j,:) < Vmin, VStep(j,:) = Vmin; end% 位置更新Swarm(j,:) = Swarm(j,:) + VStep(j,:);for k = 1 : Dimif Swarm(j, k) > Ub(k), Swarm(j,k) = Ub(k); endif Swarm(j, k) < Lb(k), Swarm(j,k) = Lb(k); endend% 个体最优更新[fSwarm(j,:), kSwarm(j,:)] = feval(ObjFun, A, B, Swarm(j,:));if fSwarm(j) < fgbest(j)gbest(j,:) = Swarm(j,:);fgbest(j) = fSwarm(j);end% 群体最优更新if fSwarm(j) < fzbestzbest = Swarm(j,:);fzbest = fSwarm(j);kbest = kSwarm(j,:);endenditer = iter + 1;     % 迭代次数更新
end
% 将工作空间的内容保存
save('results.mat');%% PSO_LQR函数,通过不同的QR求解出K,跑Simulink模型确定适应度函数
function [f, k] = PSO_LQR(A, B, qr)Q = [qr(1),0,0,0;0,qr(2),0,0;0,0,qr(3),0;0,0,0,qr(4)];R = qr(5);% 进行LQR求解K = lqr(A, B, Q, R);% 第一列作为时间戳,防止报错k1 = [0, K(1)];k2 = [0, K(2)];k3 = [0, K(3)];k4 = [0, K(4)];    assignin('base','k1',k1);assignin('base','k2',k2);assignin('base','k3',k3);assignin('base','k4',k4);% 运行模型并将结果输出到工作空间simOut = sim('pso_lqr_test');assignin('base','simOut',simOut);% 计算适应度函数err = simOut.err.signals.values;assignin('base','err',err);[m,n] = size(err);fitness = sqrt(sum(err(:,1).^2) / m) + sqrt(sum(err(:,3).^2) / m);    f = fitness;k = K;
end

编写完 MATLAB 代码后对算法有了进一步认识,算法的主要思路就是通过粒子生成不同的 QR 值,从而生成不同的反馈增益 K,运行 Simulink 代码输出该 QR 值下的适应值,已达到期望的适应值

对 Simulink 模型进行更改

在这里插入图片描述

主要是 lqr_offline 模块,直接将工作空间中的 k1,k2,k3,k4 输入到 Simulink 模型中

function k  = fcn(k1,k2,k3,k4)k=[k1,k2,k3,k4];
end

参考《**Path tracking controller of an autonomous armoured vehicle using modified Stanley controller optimized with particle swarm optimization》**论文设置适应度函数

在这里插入图片描述

横向距离误差ed横摆角误差eφ均方根之和作为适应度函数

fitness = sqrt(sum(err(:,1).^2) / m) + sqrt(sum(err(:,3).^2) / m); 

添加 kSwarmkbest 保存粒子群的 K 值和最优 K 值

%% 初始化PSO
Range = ones(SwarmSize,1)*(Ub - Lb);
% 初始化粒子群和速度
Swarm = rand(SwarmSize, Dim).*Range + ones(SwarmSize,1)*Lb;
VStep = rand(SwarmSize, Dim)*(Vmax - Vmin) + Vmin;
% 初始化粒子群的适应值
fSwarm = zeros(SwarmSize, 1);
kSwarm = zeros(SwarmSize, 4);   % 记录不同种群的K值
for i = 1 : SwarmSize[fSwarm(i,:), kSwarm(i,:)] = feval(ObjFun, A, B, Swarm(i,:));
end
% 最小适应值的值及索引
[bestf,bestindex] = min(fSwarm);
zbest = Swarm(bestindex,:);     % 全局最佳
kbest = kSwarm(bestindex,:);    % 最佳适应度对应的K
gbest = Swarm;      % 个体最佳
fzbest = bestf;     % 全局最佳适应值
fgbest = fSwarm;    % 个体最佳适应值

跑完 PSO 优化后,直接将最优的 K 值作为 Constant 输入到 lqr_offline,输出优化后的跟踪效果

运行后全局最佳 zbest = [1000 112.897583812313 568.027423573199 1000 1000]

对应的 QR 如下

Q = [1000 0 0 00 112.897583812313 0 00 0 568.027423573199	00 0 0 1000]R = 1000		  

对应的 kbest = [0.999999999999997 0.164764226510168 2.97084954431260 0.665701721954984]

效果如下,直观上看确实有所提升,精度和稳定性都还可以

在这里插入图片描述

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

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

相关文章

openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup

文章目录 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup151.1 背景信息151.2 前提条件151.3 语法151.4 示例151.5 从备份文件恢复数据 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup 151.1 …

Oracle-pl/sql developer客户端连接报错问题分析

问题一&#xff1a; 用户在windows电脑使用pl/sql developer客户端使用tns方式连接数据库时&#xff0c;出现ORA-12170 TNS连接超时报错 使用ezconnect方式连接可以成功 问题一分析: 首先&#xff0c;查看pl/sql developer软件的Oracle客户端配置configure-->preferences,确…

麒麟系统使用桌面共享远程桌面

客户端安装vinager 服务端 安装 vnc4server xrdp tightvncserver vino 安装完成后 需要重启 在用户的家目录下新建 .xsession 写入xfce4-session防止闪退 雪花屏 开启xrdp服务 远程链接 Vnc只能链接系统登录的用户 Rdp可以链接所有普通用户

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域&#xff0c;晶圆划片机作为一种先进的切割工具&#xff0c;正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺&#xff0c;晶圆划片机将LED陶瓷基板高效地切割成独立的芯片&#xff0c;为LED产业的快速发展提供了有力支持…

【队列】数据也得排队

目录 引言 队列的概念 队列的实现 单向链表队列 结构 初始化 入队 出队 取队头 取队尾 求个数 判空 内存释放 总结 引言 队列&#xff0c;这个看似普通的数据结构&#xff0c;其实隐藏着无尽的趣味和巧思。就像单向链表这把神奇的魔法钥匙&#xff0c;它能打开队…

redis数据淘汰策略:

面试官&#xff1a;了解redis数据淘汰策略吗&#xff1f; 就是当Redis内存使用达到设置的上限时&#xff0c; 此时需要使用redis数据淘汰机制来进行数据淘汰。&#xff08;有针对key的 和 针对value数据的&#xff09; Redis支持8种不同策略来选择要删除的key&#xff1a; n…

【JavaSE专栏62】Java继承:面向对象编程中重要的基石

Java继承&#xff1a;面向对象编程中重要的基石 &#x1f680; Java继承&#xff1a;面向对象编程中重要的基石 &#x1f680;摘要引言 &#x1f310; 一、探寻继承的本质 &#x1f575;️‍♂️1. 继承的基本原理2. 实现继承的方式单继承与多继承extends关键字 3. 子类与父类关…

SSL证书更新

首先&#xff0c;我们需要理解为什么需要更新SSL证书。SSL证书的有效期通常为一年。一旦证书过期&#xff0c;浏览器会显示警告&#xff0c;提示用户该网站的SSL证书已经过期&#xff0c;这可能会导致用户对网站的信任度下降&#xff0c;甚至直接离开网站。此外&#xff0c;一些…

【IDEA】IntelliJ IDEA中进行Git版本控制

本篇文章主要记录一下自己在IntelliJ IDEA上使用git的操作&#xff0c;一个新项目如何使用git进行版本控制。文章使用的IDEA版本 IntelliJ IDEA Community Edition 2023.3&#xff0c;远程仓库为https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Git…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化&#xff1a;持久化是指将数据保存到磁盘上&#xff0c;以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面让我依次给你介绍一下&#xff1a; RDB持久化 作用 这是将Redis数据保存…

【JavaSE专栏64】抽象类 vs. 接口:面向对象编程中的非实例化之争

】抽象类 vs. 接口&#xff1a;面向对象编程中的非实例化之争 《抽象类 vs. 接口&#xff1a;面向对象编程中的非实例化之争》摘要 &#x1f680;引言 &#x1f310; 一、抽象类的实质与应用 &#x1f4d8;二、接口&#xff1a;定义规范与实现解耦 &#x1f4dd;三、对比抽象类…

STM32-TIM定时器输出比较

目录 一、输出比较简介 二、PWM简介 三、输出比较通道&#xff08;通用&#xff09; 四、输出比较通道&#xff08;高级&#xff09; 五、输出比较模式 六、PWM基本结构 七、PWM参数计算 八、外设介绍 8.1 舵机 8.2 直流电机及驱动 九、开发步骤 十、输出比较库函数…