当前位置: 首页 > news >正文

高斯伪谱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软件许可协议。

相关文章:

高斯伪谱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 问:为什么只有这四种&#xf…...

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 &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…...

实验5-4 使用函数计算两点间的距离

本题要求实现一个函数&#xff0c;对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​)&#xff0c;求这两点之间的距离。 函数接口定义&#xff1a; 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&#xf…...

ARM交叉编译搭建SSH

首先搭建好arm-linux交叉编译环境&#xff0c;开发板和主机可以ping通。 一、下载需要的源码 下载zlib: zlib-1.2.3.tar.gz 下载ssl: openssl-0.9.8d.tar.gz 下载ssh: openssh-4.6p1.tar.gz 二、交叉编译 新建目录/home/leo/ssh&#xff0c;并且将三个源码复制到该目录下。…...

###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 延时函数的生成 1.通过延时计算器得到延时函数 2.可赋值改变…...

Z-Image-Turbo-辉夜巫女详细步骤:Xinference服务状态检查+Gradio端口映射配置

Z-Image-Turbo-辉夜巫女详细步骤&#xff1a;Xinference服务状态检查Gradio端口映射配置 1. 模型简介 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的LoRA版本&#xff0c;专门用于生成具有辉夜巫女风格的人物图片。这个模型通过Xinference框架部署&#xff0c;提供了稳定…...

ZLPhotoBrowser错误处理机制:构建稳定可靠的iOS图片选择器终极指南

ZLPhotoBrowser错误处理机制&#xff1a;构建稳定可靠的iOS图片选择器终极指南 【免费下载链接】ZLPhotoBrowser Wechat-like image picker. Support select photos, videos, gif and livePhoto. Support edit image and crop video. 微信样式的图片选择器&#xff0c;支持预览…...

C# + Halcon实战:药盒上多个条形码一次扫全的配置与代码详解(.NET Framework 4.8)

C# Halcon实战&#xff1a;药盒多条形码高精度识别系统开发指南 在药品包装生产线上&#xff0c;一个药盒往往同时印有追溯码、物流码和防伪码等多种条形码。传统扫码设备通常需要多次定位才能完成读取&#xff0c;而基于Halcon的机器视觉方案能实现毫秒级的多码同步识别。本文…...

aiofiles源码解析:从AsyncBase到线程池委托的完整实现

aiofiles源码解析&#xff1a;从AsyncBase到线程池委托的完整实现 【免费下载链接】aiofiles File support for asyncio 项目地址: https://gitcode.com/gh_mirrors/ai/aiofiles aiofiles 是一个专为异步文件操作设计的Python库&#xff0c;它巧妙地将阻塞式文件IO操作委…...

8个单元素CSS加载器终极指南:如何用纯CSS创建高性能动画效果

8个单元素CSS加载器终极指南&#xff1a;如何用纯CSS创建高性能动画效果 【免费下载链接】css-loaders A collection of loading spinners animated with CSS 项目地址: https://gitcode.com/gh_mirrors/cs/css-loaders 在现代Web开发中&#xff0c;CSS加载器已成为提升…...

玩转LS-DYNA爆破模拟:倾斜长短孔布孔实战

ANSYS/ls-dyna隧道、巷道爆破倾斜长短孔布孔方式下爆破损伤数值模拟 1.讲述小间隔长短型炮孔爆破模型的建模及网格划分全过程&#xff0c;包含网格尺寸设计。 2.装药结构修改&#xff0c;可实现长短炮孔中间隔装药、设置空孔&#xff0c;延期起爆、起爆位置等设置&#xff0c;讲…...

Win10系统代理服务器拒绝连接?3步搞定网络恢复(附图文详解)

Win10代理服务器连接故障排查指南&#xff1a;从原理到实战解决方案 当Windows 10突然弹出"代理服务器拒绝连接"的错误提示时&#xff0c;很多用户会感到手足无措。这种情况通常发生在系统更新后、网络环境变更时&#xff0c;或是某些应用程序擅自修改了系统设置。本…...

颠覆式消息留存方案:RevokeMsgPatcher全方位防撤回技术解析

颠覆式消息留存方案&#xff1a;RevokeMsgPatcher全方位防撤回技术解析 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitco…...

从iRMB到EMO:构建下一代轻量级密集预测模型的统一架构解析

1. 从iRMB到EMO&#xff1a;轻量级密集预测模型的进化之路 当我们在手机上使用人脸解锁功能&#xff0c;或是用修图软件一键抠图时&#xff0c;背后都离不开密集预测模型的支撑。这类模型需要处理图像中每个像素点的信息&#xff0c;传统方案要么计算量太大&#xff0c;要么精度…...

小白也能懂的Qwen3-VL微调教程:图文识别模型定制化入门

小白也能懂的Qwen3-VL微调教程&#xff1a;图文识别模型定制化入门 1. 为什么需要微调Qwen3-VL模型&#xff1f; Qwen3-VL是阿里云推出的新一代视觉语言模型&#xff0c;它能同时理解图片和文字内容。这个模型预训练时已经学会了很多通用技能&#xff0c;比如识别常见物体、理…...