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

2023-09-13 11:16:17

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计算得到的一致

代码资源在这里

更多推荐

Windows服务器设置Nginx实现分布式服务

1.安装Nginx下载Nginx-1.16.1版本。解压到如下目录:设置环境变量:检查版本:启动nginx.exe,出现黑框一闪而过,进程中出现如下情况代表启动成功:2.搭建模拟HTTP服务下载wiremock-standalone-2.25.1.jar,可以使用Maven配置pom.xml下载。注意下载standal

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合

目录实现思路相关技术的解析​编辑会话跟踪三个方案JWT令牌技术​生成令牌校验令牌登录下发令牌实现思路通过登录成功的标记来检测,在每个接口前做一个标记判断是否登录,若没登录则返回错误信息,并使前端退出.但这样较为繁琐,因此我们可以通过一种统一拦截的技术来拦截所有请求.相关技术的解析会话跟踪的三个方案1.访问cookie的

Nginx替代产品-Tengine健康检测

1、官网地址官网地址:TheTengineWebServer文档地址:文档-TheTengineWebServer健康检测模块:ngx_http_upstream_check_module-TheTengineWebServer2、安装下载wgethttps://tengine.taobao.org/download/

数据中心防雷机柜PDU产品应该怎么选?

PDU防雷插座是针对标准机柜上安装而设计,主要保护机柜内通信、电子等重要设备,避免因过电压和雷电感应而造成设备损坏。该类型PDU将防雷器与电源插板完美组合,配有多路输出插孔,兼容多国插头标准,可同时保护多路电源,使用安全可靠,简单方便,可更换式防雷模块、维护方便等优点。随着现代科技的发展和社会的进步,各行各业在不断地引

E. Moment of Bloom

Problem-E-Codeforces思路:这个题看到之后想到了不可能的情况,就是如果度为奇数就一定不可能实现都是偶数,但是后面就不知道怎么搞了。正解是欧拉定理的应用把算是,首先对于给定的q个要求,我们从a->b连一条边,如果此时生成的图由许多个欧拉回路组成,并且我们还知道给定的这个图是联通的,那么我们就可以生成一颗

阿里云产品试用系列-函数计算 FC

函数计算(FunctionCompute)是一个事件驱动的全托管Serverless计算服务,您无需管理服务器等基础设施,只需编写代码并上传,函数计算会为您准备好计算资源,并以弹性、可靠的方式运行您的代码。如上所示,在阿里云首页访问免费试用函数计算FC云计算产品如上所示,设置内存资源以及计算资源的容量如上所示,在阿里云

如何获取美团的热门商品和服务

导语美团是中国最大的生活服务平台之一,提供了各种各样的商品和服务,如美食、酒店、旅游、电影、娱乐等。如果你想了解美团的热门商品和服务,你可以使用爬虫技术来获取它们。本文将介绍如何使用Python和BeautifulSoup库来编写一个简单的爬虫程序,以及如何使用爬虫代理来提高爬虫的效率和稳定性。概述爬虫技术是一种通过网

【qiankun乾坤】从0到1搭建微前端

微前端是一种将一个大型单体应用拆分成多个小型应用的架构方式。它可以让不同的团队独立开发部署自己的应用,同时这些应用可以集成到一个统一的底座应用中,对用户来说就是一个完整的应用。qiankun是阿里开源的一个微前端实现框架,可以帮助我们比较容易地实现微前端架构。下面来介绍如何从0到1使用qiankun+vue搭建一个微前

单元测试(JUint)

单元测试概述单元测试就是方法测试。Junit单元测试框架JUnit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用JUnit编写单元测试。此外,几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试,JUnit目前最新版本是5。JUnit优点JUni

设计模式:原型模式

目录代码实现总结原型模式(PrototypePattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而无需通过实例化类来创建。原型模式允许我们通过复制现有对象的属性和方法来创建新的对象,从而避免了直接创建对象的开销。在原型模式中,有以下几个主要角色:原型(Prototype):定义了复制自身的方法。具体原

如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用

推荐:使用NSDT场景编辑器快速搭建3D应用场景概述在这篇博文中,引用了几种文件扩展名和模型格式。在开始之前,最好了解以下内容:OBJ–对象文件,一种标准的3D图像格式,可以通过各种3D图像编辑程序导出和打开。MTL–材料库文件,包含一个或多个材料定义,每个定义都包括OBJ模型中对象的各个材料的颜色、纹理和反射图glT

热文推荐