【LQR】离散代数黎卡提方程的求解,附Matlab/python代码(笔记)

news2024/11/24 8:50:50

LQR的核心是设计QRN,并求解对应的黎卡提方程

对于连续状态空间方程系统,先求连续LQR后离散 和 先离散后求离散LQR方程 的结果 是不一样的

1.离散代数黎卡提方程

注:LQR算法中含N项

离散系统:
在这里插入图片描述

在matlab里有现成的函数dlqr(),但为了搞清楚其内核,编写matlab代码展示其求解过程

matlab帮助文件里的dlqr()说明
在这里插入图片描述对于离散代数黎卡提方程的求解,红圈3是关键,将其中的S单独拿出,即可转化为:

S0=A'*S*A-(A'*S*B+N)*inv(B'*S*B+R)*(B'*S*A+N')+Q

其中等号左边的S0认为是S(k+1),右边的S认为是S(k)

此公式迭代即可,采用下文的迭代思想(仅仅参考迭代法的思想):
在这里插入图片描述

2.matlab代码

clc
clear
close all
%% 1.参数
mb=240;
mt=30;
ks=16000;
kt=160000;
A0=[0 1 0 -1;
    -ks/mb 0 0 0;
    0 0 0 1;
    ks/mt 0 -kt/mt 0];
B0=[0;-1/mb;0;1/mt];
G0=[0;0;-1;0];
C0=[-ks/mb 0 0 0;
    1 0 0 0;
    0 0 1 0];
E0=[-1/mb;0;0];
%离散化
SimTime=200;
sim_step = 200;
[A_Dis,B_Dis]=c2d(A0,B0,SimTime/sim_step/4);%离散化
%% 2.LQR信息
q1=100;
q2=10000;
q3=0.01;
Q=[q1+q2*(ks/mb)^2 0 0 0;
    0 0 0 0;
    0 0 q3 0;
    0 0 0 0];
R=q2/mb/mb;
N=[q2*ks/mb/mb;0;0;0];
%% 3.迭代法解离散代数黎卡提方程
A=A_Dis;
B=B_Dis;
S = Q - N*inv(R)*N';
error0=10^-10;
for i=1:10000
    S0=A'*S*A-(A'*S*B+N)*inv(B'*S*B+R)*(B'*S*A+N')+Q;
    error=norm((S0-S),'Inf');
    max(max(abs(S0-S)))
    if error<error0
        break
    else
        S=S0;
    end
    i
end
K_cal=inv(B'*S*B+R)*(B'*S*A+N');
%% 4.对照组
[K_fun,P_fun]=dlqr(A_Dis,B_Dis,Q,R,N);

%可以看出K_cal与K_fun是一样的,说明matlab的dlqr()的内核也是这样

运行结果:
K_cal(本代码运行结果)与K_fun(matlab自带的dlqr()函数计算结果)是一致的
在这里插入图片描述

代码在4638次循环结束,误差为5.6161e-11
计算得到的S与K:
在这里插入图片描述

3.python代码

import numpy as np
#原始离散数据
mb=240
mt=30
ks=16000
kt=160000
A_Dis=np.mat([[-0.243382598182876,0.108881140243305,-1.20976052488348,-0.00276338043649671],
              [-7.25874268288700,-0.364358650671223,-7.07451732045390,-0.0151220065610436],
              [-0.120976052488348,0.0106117759806808,0.830279867651214,0.00408985243408179],
              [1.47380289946490,-0.120976052488348,-21.8125463151029,0.951255920139562]])
B_Dis=np.mat([[-7.77114123864297e-05],
               [-0.000453671417680438],
               [-7.56100328052176e-06],
               [9.21126812165565e-05]])
#LQR数据
q1=100
q2=10000
q3=0.01
Q=np.mat([[q1+q2*(ks/mb)**2,0,0,0],
    [0,0,0,0],
    [0,0,q3,0],
    [0,0,0,0]])
R=q2/mb/mb
N=np.mat([[q2*ks/mb/mb],[0],[0],[0]])
#迭代法解黎卡提方程
A=A_Dis
B=B_Dis
S = Q - N / R @N.T
error0=10**-10

for i in range(1,10000):
    S0=A.T @ S @ A-(A.T @ S @ B+N) @ np.linalg.inv(B.T @ S @ B+R) @ (B.T @ S @ A+N.T)+Q
    print(abs(S0-S).max())#控制台输出误差
    if(abs(S0-S).max()<error0):
        break
    else:
        S=S0
print(i)
K_cal=np.linalg.inv(B.T @ S @ B+R) @ (B.T @ S @ A+N.T);

python运行结果:
代码在第9999次循环结束
控制台输出abs(S0-S).max()均在e-08大小
在这里插入图片描述
最后计算得到的S与K:

在这里插入图片描述与Matlab计算得到的一致

代码资源在这里

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

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

相关文章

【C语言】可变参数列表详解

可变参数列表 一、可变参数列表的使用1、可变参数列表的形式2、可变参数列表的提取3、使用演示4、利用可变参数实现一个简单的日志打印功能 二、可变参数列表的原理1、原理的讲解2、原理的证明 一、可变参数列表的使用 1、可变参数列表的形式 有时我们在使用C语言时可能会碰到…

解决RequestParam.value() was empty on parameter 0

在网上查询很多种方式&#xff0c;都解决不了问题&#xff0c;比如&#xff1a; 在RequestParam RequestBody注解 解决办法:在RequestParam中的name加上对应参数 如 : RequestParam( name "name" ) RequestBody也是同理 最后解决的办法&#xff0c;是发现mave…

【Linux】nohub指令--终端退出后命令仍旧执行

文章目录 0、背景1、作用2、语法3、用法演示4、关于2>&1 0、背景 Shell中&#xff0c;执行一个持续进行的指令&#xff0c;会"霸屏"&#xff0c;即你想再执行其他指令&#xff0c;要么重开个shell终端&#xff0c;要么退出这个执行。 1、作用 nohub&#x…

vue 把echarts封装成一个方法 并且从后端读取数据 +转换数据格式 =动态echarts 联动echarts表

1.把echarts 在 methods 封装成一个方法mounted 在中调用 折线图 和柱状图 mounted调用下边两个方法 mounted(){//最早获取DOM元素的生命周期函数 挂载完毕console.log(mounted-id , document.getElementById(charts))this.line()this.pie()},methods里边的方法 line() {// …

苹果麻烦了,全球没有消费者愿意接受印度制造的iPhone

据外媒报道指印度制造的iPhone良率只有一半&#xff0c;以至于发出的货被质量工程师打回一半&#xff0c;由此引发欧洲消费者的抗拒&#xff0c;为安抚欧洲消费者&#xff0c;苹果表示欧洲市场的iPhone15将全数由中国制造供应&#xff0c;而印度制造的iPhone将在印度市场销售以…

基于python的urllib 库抓取网站上的图片

最近写了个爬虫实例&#xff0c;有python环境的话就可以直接运行了。 运行效果是这样的&#xff1a; 完整代码如下&#xff1a; import urllib import urllib.request import re import random import time import os #目标网址: imagePath"https://pic.netbian.com&quo…

JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

对象 内存分配的两种方式 指针碰撞 适用场合&#xff1a;堆内存规整&#xff08;即没有内存碎片&#xff09;的情况下。 原理&#xff1a;用过的内存全部整合到一边&#xff0c;没有用过的内存放在另一边&#xff0c;中间有一个分界指针&#xff0c;只需要向着没用过的内存…

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积-[北邮鲁鹏]

目录标题 参考学习链接卷积的定义卷积的性质叠加性平移不变性交换律结合律分配律标量 边界填充边界填充方法 - 常数填充最常用常数填充零填充&#xff08;zero padding&#xff09;拉伸镜像 卷积示例单位脉冲核无变化平移平滑锐化 卷积核平均卷积核高斯卷积核高斯卷积核定义高斯…

智能金融决策策略,规则引擎在大数据金融行业的实战案例

在金融风控场景中&#xff0c;规则引擎是一个核心风险管理的利器&#xff0c;它预先设定一系列规则设定&#xff0c;用于便捷的评估和处理各种交易、客户行为或其他需要自动化决策、计算、推理判断的情况。 以下是一个详细的示例&#xff0c;说明规则引擎在金融风控中的使用。 …

智能工厂的产业前景如何?

智能工厂的产业前景相当光明&#xff0c;并且正在迅速发展。智能工厂&#xff0c;也称为工业 4.0 或第四次工业革命&#xff0c;代表了先进技术和数据驱动自动化推动的制造和工业流程的重大转变。以下是智能工厂产业前景的一些关键方面&#xff1a; 1.提高效率&#xff1a;智能…

OSCP系列靶场-Intermediate-BTRSys2.1保姆级

OSCP系列靶场-Intermediate-BTRSys2.1 目录 OSCP系列靶场-Intermediate-BTRSys2.1总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试21-FTP端口的信息收集21-FTP版本版本信息与MSF利用21-FTP端口匿名登录测试(成功)21-FTP端口-文件GET收集…

C++中的深拷贝和浅拷贝介绍

对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: class Base{public:Base(): m_a(0), m_b(0){ }Base(int a, int b): m_a(a), m_b(b){ }private:int m_a;int m_b;};int main(){int a = 10;int b = a; //拷贝Base obj1(10, 20);Base obj2…

项目管理软件在项目中的这些作用,你知道吗?

现在项目管理软件成为各类企业必不可少的工具&#xff0c;给项目提供全面的视图、促进团队协作、实时跟踪和监控、优化资源利用、改善决策制定等优势。 它们可以帮助团队成员更好地组织和协作&#xff0c;是实现项目目标的必备工具。通过合理利用项目管理软件的功能和特点&…

87 # express 应用和创建应用的分离

创建应用的过程和应用本身要进行分离。路由和创建应用的过程也做一个分离。 下面实现创建应用的过程和应用本身要进行分离&#xff1a; express.js const Application require("./application");function createApplication() {// 通过类来实现分离操作return ne…

一篇文章告诉您立仪3D线激光位移传感器

激光位移传感器是利用激光技术进行测量的传感器。它由激光器、激光检测器和测量电路组成。激光传感器是新型测量仪表。能够精确非接触测量被测物体的位置、位移等变化。 可以测量位移、厚度、振动、距离、直径等精密的几何测量。激光有直线度好的优良特性&#xff0c;同样激光…

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充 如时间数据以单位1为间隔排序&#xff0c; 可插间隔为0.5的数据 。 一、实现效果 1.规则间隔数据 2.非规则间隔数据 二、主程序代码 1.插值测试效果 %% 清空环境变量 warning off …

【送书活动1】强势挑战Java,Kotlin杀回TIOBE榜单Top 20!

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 强势挑战Java&#xff0c;Kotlin杀回TIOBE榜单Top 20&#xff01; …

python绘制钻头外径磨损图

import matplotlib.pyplot as plt import numpy as np srcpathrC:\Users\user\Documents\F1-21\data0.125-1.8.txtdef openreadtxt(file_name):data []with open(file_name, r) as file:file_data file.readlines() # 读取所有行for row in file_data:tmp_list row.split()…

跨境支付融合解析:有效解决跨境电商系统开发的支付问题

作为跨境电商系统开发的专家&#xff0c;我们深知支付问题对整个系统的重要性。在不同国家、不同支付体系的交叉领域里&#xff0c;跨境支付融合是一个引人注目的话题。本文将深入探讨跨境支付融合的必要性&#xff0c;分析其优势&#xff0c;并提供一系列解决方案&#xff0c;…

vue-element-admin项目部署 nginx动态代理 含Docker部署、 Jenkins构建

介绍三种方式&#xff1a; 1.直接部署到nginx中 2.用nginx docker镜像部署 3.使用Jenkins构建 1.直接用nginx部署 vue-element-admin项目下有两个.env文件&#xff0c;.env.production是生产环境的&#xff0c;.env.developpment是开发环境的 vue-element-admin默认用的是mock数…