高斯伪谱C++封装库开源!

Windows x64/86 C++无依赖运行高斯伪谱法求解最优控制问题,你只需要ElegantGP!

Author: Y. F. Zhang His Github: https://github.com/ZYunfeii

写在前面

这个库在你下载它的那一时刻起不再依赖任何其他代码,直接可用来构建C++的最优控制问题并进行求解。我还写了一个visual studio使用该库的demo项目,供学习。
项目主要基于Lpopc进行封装,编译不易,下载地址:https://download.csdn.net/download/weixin_43145941/88817667

文件简述

arma: 矩阵第三方库 https://gitlab.com/conradsnicta/armadillo-code

Lpopc: 高斯伪谱法库 https://sourceforge.net/projects/lpopc/

Debug_win64: Debug版本64位库

Release_win64: Release版本64位库

MKL: MKL相关库和一个intel导入库(libiomp5md.lib)

对于库中文件解释:

Ipopt-vc8.dll:ipopt动态库

Ipopt-vc8.lib:ipopt导入库

liblpopc.lib:高斯伪谱封装库

使用

库的介绍

../Example文件夹中给出了一个经典的轨迹优化案例visual studio项目。

使用C++版本解决高斯伪谱问题需要的库有(Release):

  1. Ipopt-vc8.lib
  2. liblpopc.lib
  3. mkl_intel_lp64.lib
  4. mkl_intel_thread.lib
  5. mkl_core.lib
  6. libiomp5md.lib

第1个库为ipopt库(由https://github.com/coin-or/Ipopt 编译)。第2个库为高斯伪谱库(由 https://sourceforge.net/projects/lpopc/ 编译)。第3,4,5个库是MKL的静态库,这里我直接将其拷贝过来了,无需使用者自行安装。缺点就是这几个静态库十分臃肿。第6个库是intel相关库,我也直接拷贝过来了。

MKL全称Intel Math Kernel Library, 是由Intel 公司开发的,专门用于矩阵计算的库。

visual studio项目配置
  1. 遵循Debug对应Base下Debug库,Release对应Base下Release库,编译平台选x64。
  2. VC++目录>>包含目录:
$(SolutionDir)..\ElegantGP\Lpopc\Common
$(SolutionDir)..\ElegantGP\Lpopc\Core
$(SolutionDir)..\ElegantGP\Lpopc\SparseMatrix
$(SolutionDir)..\ElegantGP\arma\include

具体路径根据用户Base位置确定。

  1. VC++目录>>库目录:
$(SolutionDir)..\ElegantGP\Debug_win64
$(SolutionDir)..\ElegantGP\MKL

具体路径根据用户库位置确定。再次强调,Debug和Release需对应。

  1. 链接器>>输入>>附加依赖项:
Ipopt-vc8.lib
liblpopc.lib
mkl_intel_lp64.lib
mkl_intel_thread.lib
mkl_core.lib
libiomp5md.lib

输入上述库名称。

  1. C/C++>>代码生成>>运行库:选择多线程调试(/MTd)

其余可根据用户需求进一步细优化配置,至此,可进行项目生成。

  1. Ipopt-vc8.dlllibiomp5md.dll拷贝到生成的可执行文件夹下(也可以把dll配置到环境变量,但保险起见使用前者可以保证本库的dll最先被找到,因为可能你的电脑上存在同名dll,据我所知,matlab里面有,如果你配了matlab的环境变量,那很可能找到它的同名dll导致exe运行时出现程序定位点错误)【重要】
  2. 双击执行生成的example.exe

[可选] C/C++>>优化 选用 最大优化(优化速度)

库函数

高斯伪谱mesh refine方法选用hp-Liu(hp方法求解效率不行):

app->Options()->SetStringValue("mesh-refine-methods", "hp-Liu");

最大网格数设置:

app->Options()->SetIntegerValue("max-grid-num", 120); 

误差设置:

app->Options()->SetNumericValue("finite-difference-tol", 1e-3);
app->Options()->SetNumericValue("desired-relative-error", 1e-3);
求解结果
txt形式

在exe文件目录下生成state time control文件,其为轨迹优化结果。

代码形式

我对原库进行了修改,可直接从应用层获取求解结果:

app->algorithm_->cd_data_->result[0].get()->state; // mat形式的state,0表示phase编号,从0开始

具体可获取的结果见如下结构体:

struct SolutionData
{vec time;mat state;mat control;mat parameter;mat costate;mat pathmult;mat Hamiltonian;double mayerCost;double lagrangeCost;};

lagrangeCost表示积分型代价函数值,mayerCost就是传统意义上不带积分的代价函数值。

性能相关

cpu: Intel i7-11700 16核

  1. HyperSensitive轨迹优化Release版本求解0.581s(Release进行了编译运算优化)。
  2. HyperSensitive轨迹优化Debug版本求解0.967s
  3. HyperSensitive轨迹优化Matlab2019b相同初始值求解7.937s

请添加图片描述
请添加图片描述

计算误差在1e-10级别。

另一个例子:

高超声速飞行器再入轨迹优化问题:Matlab2019b求解35s,ElegantGP只需要1.7s

不足

  1. liblpopc.lib比较臃肿导致编译出来的可执行文件达几十MBytes。
  2. MKL的库也十分臃肿,为了打包我都拷贝过来了,但是文件过大。

关于从头编译lpopc库

Linux下lpopc库的编译还是较为容易的,但也不是非常的容易。而Windows下该项目的编译可以用困难重重形容。

Lpopc的作者在文档LpopcDoc.pdf(\lpopc-master\Lpopc\doc)中给出了其编译流程,但仍旧有许多不一致。感兴趣的读者可以自行尝试编译:

  1. git下来Ipopt的项目,进入Ipopt-3.12.3\Ipopt\MSVisualStudio\v8-ifort,最终是要把Ipopt-vc8项目编译出来。但它的编译依赖解决方案中CoinMetis,CoinMumpsC,CoinMumpsF90,IpOptFor项目编译出来的静态库,因此需要先编译这几个项目。
  2. 1中提到的需要先编译的项目中有Fortan项目,这里需要安装Fortran编译器ifort,除此之外MKL库也是必须的。
  3. CoinMetis,CoinMumpsC,CoinMumpsF90的编译依赖METIS和MUMPS项目,需要下载源码,把1中项目.F文件用源码替代。
  4. 使用ipopt编译好的库对liblpopc库进行编译,这里liblpopc的vs项目源文件少添加了关于hpLiu的mesh方法cpp和hpp文件。
  5. 使用liblpopc的库对高斯伪谱优化问题编译。

这里只是非常简略得叙述了下编译过程,实际上有很多细微的问题,不再赘述。

对原库的细节修改

Lpopc原本是求解完最优问题后通过arma的接口将结果写入磁盘,这不利于将GP嵌入自己的算法作为中间环节。因此,我将LpLpopcAlgorithm.hpp文件中LpopcAlgorithm类的私有变量cd_data_改为public,同时将LpLpopcApplication.hpp文件中algorithm_改为public。这一改动不够优雅但无伤大雅。

软件许可协议

ElegantGP项目采用较为宽松的MIT软件许可协议。

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

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

相关文章

jvm垃圾收集器之七种武器

目录 1.回收算法 1.1 标记-清除算法(Mark-Sweep) 1.2 复制算法(Copying) 1.3 标记-整理算法(Mark-Compact) 2.HotSpot虚拟机的垃圾收集器 2.1 新生代的收集器 Serial 收集器(复制算法) ParNew 收集器 (复制算法) Parallel Scavenge 收集器 (复制…

LeetCode.145. 二叉树的后序遍历

题目 145. 二叉树的后序遍历 分析 上篇文章我们讲了前序遍历,这道题目是后序遍历。 首先要知道二叉树的后序遍历是什么?【左 右 根】 然后利用递归的思想,就可以得到这道题的答案,任何的递归都可以采用 栈 的结构来实现&#…

【Java程序设计】【C00270】基于Springboot的moba类游戏攻略分享平台(有论文)

基于Springboot的moba类游戏攻略分享平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏攻略分享平台 本系统分为系统功能模块、管理员功能模块、以及用户后台功能模块。 系统功能模块:在平台首…

CVE-2023-22602 漏洞复现

CVE-2023-22602 简述: 由于 1.11.0 及之前版本的 Shiro 只兼容 Spring 的ant-style路径匹配模式(pattern matching),且 2.6 及之后版本的 Spring Boot 将 Spring MVC 处理请求的路径匹配模式从AntPathMatcher更改为了PathPatter…

React官网摘抄

https://react.dev/learn 1、组件名称大写 2、变量,用{} vue中用{{}} react中用{}3、遍历 4、state使用

OpenCV基础:用Python生成一幅随机的噪声图像

使用Python:生成一幅随机数值的灰度图像,图像大小为1616像素。借助OpenCV库。输出数值,并显示图像。 # -*- coding: utf-8 -*- """ Created on Wed Feb 14 21:49:09 2024author: 李立宗公众号:计算机视觉之光知识…

【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床

准备工作: 首先电脑得提前完成安装如下: 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…

docker常用容器命令

首先说下容器: 它是指当docker运行镜像时,创建了一个隔离环境,称之为 容器。 这种方式优点:可以开启多个服务,服务之前是互相隔离的(比如:在一台服务器上可以开启多个mysql,可以是…

【Android】使用Android Studio打包APK文件

文章目录 1. 新建项目2. 打包生成APK3. 安装APK 1. 新建项目 打包APK之前,首先需要新建项目,有基础的可以跳过。 无基础的可以参考:使用Android Studio运行Hello World项目 2. 打包生成APK 1.找到Build -> Generate Signed Bundle or …

【Zigbee课程设计系列文章】Zigbee开发环境搭建

【Zigbee课程设计系列文章】Zigbee开发环境搭建 前言IAR 下载安装Z-Stack协议栈安装 🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程完整代码原理图完整课设报告) 前言 👑由于无线传感器网络(也即…

ctfshow——命令执行

文章目录 web 29——通配符*绕过web30——调用其他命令执行函数web 31——参数逃逸web 32-web 36——配合文件包含伪协议web 37-web 39——文件包含web 40—— web 29——通配符*绕过 i不区分大小写,直接?csystem(tac fl*.php); web30——调用其他命令执行函数 调用…

【RL】Bellman Equation (贝尔曼等式)

Lecture2: Bellman Equation State value 考虑grid-world的单步过程: S t → A t R t 1 , S t 1 S_t \xrightarrow[]{A_t} R_{t 1}, S_{t 1} St​At​ ​Rt1​,St1​ t t t, t 1 t 1 t1:时间戳 S t S_t St​:时间 t t t时所处的sta…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填,用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库,点击运用ok,等待刷新即可 最后&#xff1a…

Linux-进程信号

Linux进程信号 初步认识信号信号的存储结构信号的处理方式信号的产生硬件异常产生的信号核心转储sigset_t信号集信号集的操作函数对block表的操作对pending表的操作对handler表的操作信号的捕捉用户态和内核态 信号的处理过程可重入函数volatile关键字 初步认识信号 生活中有哪…

【日常聊聊】新年新征程:迎接学习的挑战

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 结语 我的其他博客 前言 随着新的一年的到来,程序员们站在了全新的起点。这是一个充满机遇和挑战的时刻&#xff0…

【Java程序设计】【C00257】基于Springboot的校园二手书交易平台(有论文)

基于Springboot的校园二手书交易平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的乐校园二手书交易管理系统 本系统分为系统功能模块、管理员功能模块、卖家用户功能模块以及用户功能模块。 系统功能模块&…

Flaurm实现中文搜索

目录 摘要需求本文涉及环境情况如下解决方案最终效果文章其他链接: 摘要 Flarum本身对中文支持并不理想,但随着版本更新,逐渐加强了对中文的优化。然而在1.8.5版本,却还是不支持中文搜索网站文章内容。作者在检索了全网教程&#…

MyBatis中的XML实现和动态SQL实现

文章目录 一、XML实现1.1增1.2删1.3查1.4改 二、XML方式实现动态SQL2.1if标签2.2trim标签2.3where标签2.4set标签2.5foreach标签2.6include标签和sql标签 一、XML实现 先在新建的XML文件中写入如下内容&#xff1a; <?xml version"1.0" encoding"UTF-8&qu…

腾讯云4核8G服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

[论文总结] 深度学习在农业领域应用论文笔记12

文章目录 1. 3D-ZeF: A 3D Zebrafish Tracking Benchmark Dataset (CVPR, 2020)摘要背景相关研究所提出的数据集方法和结果个人总结 2. Automated flower classification over a large number of classes (Computer Vision, Graphics & Image Processing, 2008)摘要背景分割…