高斯伪谱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):
- Ipopt-vc8.lib
- liblpopc.lib
- mkl_intel_lp64.lib
- mkl_intel_thread.lib
- mkl_core.lib
- 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项目配置
- 遵循Debug对应Base下Debug库,Release对应Base下Release库,编译平台选x64。
- VC++目录>>包含目录:
$(SolutionDir)..\ElegantGP\Lpopc\Common
$(SolutionDir)..\ElegantGP\Lpopc\Core
$(SolutionDir)..\ElegantGP\Lpopc\SparseMatrix
$(SolutionDir)..\ElegantGP\arma\include
具体路径根据用户Base位置确定。
- VC++目录>>库目录:
$(SolutionDir)..\ElegantGP\Debug_win64
$(SolutionDir)..\ElegantGP\MKL
具体路径根据用户库位置确定。再次强调,Debug和Release需对应。
- 链接器>>输入>>附加依赖项:
Ipopt-vc8.lib
liblpopc.lib
mkl_intel_lp64.lib
mkl_intel_thread.lib
mkl_core.lib
libiomp5md.lib
输入上述库名称。
- C/C++>>代码生成>>运行库:选择多线程调试(/MTd)
其余可根据用户需求进一步细优化配置,至此,可进行项目生成。
- 将
Ipopt-vc8.dll和libiomp5md.dll拷贝到生成的可执行文件夹下(也可以把dll配置到环境变量,但保险起见使用前者可以保证本库的dll最先被找到,因为可能你的电脑上存在同名dll,据我所知,matlab里面有,如果你配了matlab的环境变量,那很可能找到它的同名dll导致exe运行时出现程序定位点错误)【重要】 - 双击执行生成的
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核
HyperSensitive轨迹优化Release版本求解0.581s(Release进行了编译运算优化)。HyperSensitive轨迹优化Debug版本求解0.967s。HyperSensitive轨迹优化Matlab2019b相同初始值求解7.937s。


计算误差在1e-10级别。
另一个例子:
高超声速飞行器再入轨迹优化问题:Matlab2019b求解35s,ElegantGP只需要1.7s。
不足
- liblpopc.lib比较臃肿导致编译出来的可执行文件达几十MBytes。
- MKL的库也十分臃肿,为了打包我都拷贝过来了,但是文件过大。
关于从头编译lpopc库
Linux下lpopc库的编译还是较为容易的,但也不是非常的容易。而Windows下该项目的编译可以用困难重重形容。
Lpopc的作者在文档LpopcDoc.pdf(\lpopc-master\Lpopc\doc)中给出了其编译流程,但仍旧有许多不一致。感兴趣的读者可以自行尝试编译:
- git下来Ipopt的项目,进入
Ipopt-3.12.3\Ipopt\MSVisualStudio\v8-ifort,最终是要把Ipopt-vc8项目编译出来。但它的编译依赖解决方案中CoinMetis,CoinMumpsC,CoinMumpsF90,IpOptFor项目编译出来的静态库,因此需要先编译这几个项目。 - 1中提到的需要先编译的项目中有Fortan项目,这里需要安装Fortran编译器
ifort,除此之外MKL库也是必须的。 - CoinMetis,CoinMumpsC,CoinMumpsF90的编译依赖METIS和MUMPS项目,需要下载源码,把1中项目.F文件用源码替代。
- 使用ipopt编译好的库对liblpopc库进行编译,这里liblpopc的vs项目源文件少添加了关于hpLiu的mesh方法cpp和hpp文件。
- 使用liblpopc的库对高斯伪谱优化问题编译。
这里只是非常简略得叙述了下编译过程,实际上有很多细微的问题,不再赘述。
对原库的细节修改
Lpopc原本是求解完最优问题后通过arma的接口将结果写入磁盘,这不利于将GP嵌入自己的算法作为中间环节。因此,我将LpLpopcAlgorithm.hpp文件中LpopcAlgorithm类的私有变量cd_data_改为public,同时将LpLpopcApplication.hpp文件中algorithm_改为public。这一改动不够优雅但无伤大雅。
软件许可协议
ElegantGP项目采用较为宽松的MIT软件许可协议。
相关文章:
高斯伪谱C++封装库开源!
Windows x64/86 C无依赖运行高斯伪谱法求解最优控制问题,你只需要ElegantGP! Author: Y. F. Zhang His Github: https://github.com/ZYunfeii 写在前面 这个库在你下载它的那一时刻起不再依赖任何其他代码,直接可用来构建C的最优控制问题并进行求解。…...
Spring + Tomcat项目中nacos配置中文乱码问题解决
实际工作的时候碰到了nacos中文乱码的问题,一顿排查最终还是调源码解决了。下面为具体的源码流程,有碰到的可以参考下。 对于nacos配置来说,初始主要源码就在NacosConfigService类中。里面有初始化获取配置content以及设置对应监听器的操作。…...
Unity SRP 管线【第十讲:SRP/URP 图形API】
Unity 封装的图形API 文章目录 Unity 封装的图形API一、 CommandBuffer 要执行的图形命令列表1. CommandBuffer 属性2. CommandBuffer 常用图形API(方法)(1)设置(2)获取临时纹理 GetTemporaryRT以及释放(3)设置纹理为渲染目标 SetRenderTarget(4)Command…...
使用playwright进行自动化端到端测试
项目希望能接入自动化端到端测试提高可靠性,发现微软的 playwright 还挺好用的,推荐一下,顺便说下遇到的一些难点以及最佳实践。 难点 登录 项目不能帐号密码登录,只能扫二维码 临时方案是先自己扫码保存 cookie 用于测试&#…...
ES实战-相关性搜索
ES打分机制 1.TF-IDF 词频-逆文档频率 2.Okapi BM25 3.随机性分歧- DFR相似度 4.基于信息 - IB相似度 5.LM Dirichlet 相似度 6.LM Jelinek Mercer相似度 解释一个查询的结果集 curl -XPOST localhost:9200/get-together/_search?pretty -H Content-Type: application/json -…...
MQTT的学习与应用
文章目录 一、什么是MQTT二、MQTT协议特点三、MQTT应用领域四、安装Mosquitto五、如何学习 MQTT 一、什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在低带宽、不稳定的网络环境中进行高效的通信…...
编译原理实验1——词法分析(python实现)
文章目录 实验目的实现定义单词对应的种别码定义输出形式:三元式python代码实现运行结果检错处理 总结 实验目的 输入一个C语言代码串,输出单词流,识别对象包含关键字、标识符、整型浮点型字符串型常数、科学计数法、操作符和标点、注释等等。…...
C语言——oj刷题——模拟实现库函数strlen
目录 方法一:迭代法 方法二:递归法 方法三:指针算术法 方法四:汇编指令法 当我们使用C语言进行字符串操作时,经常会用到库函数strlen来获取字符串的长度。strlen函数的作用是计算一个以null字符结尾的字符串的长度…...
对进程与线程的理解
目录 1、进程/任务(Process/Task) 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理(Memory Manage) 4、线程(Thread)…...
「数据结构」线性表
定义和基本操作 定义:相同数据类型的 n ( n ≥ 0 ) n(n \ge 0) n(n≥0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表一般表示: L ( a 1 , a 2 , … … , a i , a i 1 , a n ) L(a_1,a_2,……,a_i,a_{i1},a_n) L(a…...
GEE:关于在GEE平台上进行回归计算的若干问题
作者:CSDN _养乐多_ 记录一些在Google Earth Engine (GEE)平台上进行机器学习回归计算的问题和解释。 文章目录 一、回归1.1 问:GEE平台上可以进行哪些机器学习回归算法?1.2 问:为什么只有这四种…...
Vivado -RAM
ip_ram 定义了一个名为ip_ram的模块,该模块具有以下端口: sys_clk:系统时钟输入。 sys_rst_n:系统复位输入。 module ip_ram( input sys_clk, input sys_rst_n);wire ram_en ; wire ram_wea …...
备战蓝桥杯---图论之最短路dijkstra算法
目录 先分个类吧: 1.对于有向无环图,我们直接拓扑排序,和AOE网类似,把取max改成min即可。 2.边权全部相等,直接BFS即可 3.单源点最短路 从一个点出发,到达其他顶点的最短路长度。 Dijkstra算法&#x…...
C#系列-C#实现秒杀功能(14)
在C#中实现商品秒杀功能,通常需要考虑并发控制、数据库事务、缓存策略、限流措施等多个方面。下面是一个简单的示例,演示了如何使用C#和数据库来实现一个基本的商品秒杀功能。 首先,假设你有一个商品表(Product)和一个…...
Java ‘Elasticsearch‘ 操作
依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</ar…...
【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024
AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…...
实验5-4 使用函数计算两点间的距离
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。 函数接口定义: double dist( double x1, double y1, double x2, double y2 );其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2)&…...
【JavaEE】_JavaScript(Web API)
目录 1. DOM 1.1 DOM基本概念 1.2 DOM树 2. 选中页面元素 2.1 querySelector 2.2 querySelectorAll 3. 事件 3.1 基本概念 3.2 事件的三要素 3.3 示例 4.操作元素 4.1 获取/修改元素内容 4.2 获取/修改元素属性 4.3 获取/修改表单元素属性 4.3.1 value…...
ARM交叉编译搭建SSH
首先搭建好arm-linux交叉编译环境,开发板和主机可以ping通。 一、下载需要的源码 下载zlib: zlib-1.2.3.tar.gz 下载ssl: openssl-0.9.8d.tar.gz 下载ssh: openssh-4.6p1.tar.gz 二、交叉编译 新建目录/home/leo/ssh,并且将三个源码复制到该目录下。…...
###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 目录 一. 延时函数的生成 1.通过延时计算器得到延时函数 2.可赋值改变…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
