高斯伪谱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.mfbz.cn/a/378109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Appium使用初体验之参数配置,简单能够运行起来

一、服务器配置 Appium Server配置与Appium Server GUI(可视化客户端)中的配置对应,尤其是二者如果不在同一台机器上,那么就需要配置Appium Server GUI所在机器的IP(Appium Server GUI的HOST也需要配置本机IP&#xf…

Docker-Learn(三)创建镜像Docker(换源)

根据之前的内容基础,本小点的内容主要涉及到的内容是比较重要的文本Dockerfile 1. 编辑Dockerfile 启动命令行终端(在自己的工作空间当中),创建和编辑Dockerfile。 vim Dockerfile然后写入以下内容 # 使用一个基础镜像 FROM ubuntu:late…

Flink流式数据倾斜

1. 流式数据倾斜 流式处理的数据倾斜和 Spark 的离线或者微批处理都是某一个 SubTask 数据过多这种数据不均匀导致的,但是因为流式处理的特性其中又有些许不同 2. 如何解决 2.1 窗口有界流倾斜 窗口操作类似Spark的微批处理,直接两阶段聚合的方式来解决…

单片机——FLASH(2)

文章目录 flash (stm32f40x 41x的内存映射中区域详解)flash写数据时 flash (stm32f40x 41x的内存映射中区域详解) Main memory 主存储区 放置代码和常数 System memory 系统存储区 方式bootloader代码 OTP区 一次性可编程区 选项…

redis存储对象的过期设置在实际项目中的运用案例展示

redis存储对象的过期设置在实际项目中的运用案例展示!经过前面的学习,我们已经基本上初步掌握了redis数据库存储对象的过期时间是如何设置的了。下面给大家展示一个具体的实际开发项目中用到业务场景。 在项目化生寺小程序游戏开发中,有道具&…

DC-7靶机渗透详细流程

信息收集: 1.存活扫描: 由于靶机和kali都是nat的网卡,都在一个网段,我们用arp-scan会快一点: arp-scan arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6…

从零开始手写mmo游戏从框架到爆炸(十一)— 注册与登录

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 从这一章开始,我们进入业务的部分,从注册登录开始。 创建注册和登录的路由 package com.loveprogrammer.command.server;public interface Se…

Java面向对象 继承

目录 继承继承的好处继承具有传递性实例创建Person类Student继承Person类测试 继承 Java中的继承是面向对象编程的一个核心特性,它允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。通过继承&#xff0…

蓝桥杯备战——12.超声波与测频代码优化

1.优化分析 昨天我在看原理图的发现超声波模块的反馈引脚P11刚好可以使用PCA模块0的捕获功能,我就想着把PCA功能留给超声波,然后测频功能还是改成定时器0来完成,然后前后台功能改成定时器1。 至于我为什么要这么改呢,看一下我原…

157基于matlab的GVF-snake算法能自动收敛到目标区域

基于matlab的GVF-snake算法能自动收敛到目标区域。关键技术GVF snake模型算法matlab源程序,GVF是根据光流场原理,利用变分方法,从图像中得到的一种向量场,该向量场被称为梯度矢量流(GVF)场。 Snake模型称为动态轮廓模型(Active Contour Model&#xff0…

vue的8大生命周期

第072个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 提供vue2的一些基本操作:安装、引用,模板使用,computed&a…

51单片机之数码管显示表白数字篇

朝菌不知晦朔 蟪蛄不知春秋 眼界决定境界 CSDN 请求进入专栏 是否进入《51单片机专栏》? 确定 目录 数码管的简介 数码管引脚定义 数码管的原理图 74HC245 代码实现 静态数码管的显示 动态数码管的显示 数码管实现表白画面 数码管的简介 L…

阿里云ECS服务器Linux安装Mysql8

链接:https://pan.baidu.com/s/1s9j7OhiOMV9e9Qq9GDbysA 提取码:dd5a --来自百度网盘超级会员V5的分享 Mysql官网:MySQL 关于Mysql Yum Repository介绍可以看下 更加简单 关于X86和ARM 传到服务器 进入所在包 cd /usr/local/develop/mysql8 解压 …

深度学习(15)--PyTorch构建卷积神经网络

目录 一.PyTorch构建卷积神经网络(CNN)详细流程 二.graphviz torchviz使PyTorch网络可视化 2.1.可视化经典网络vgg16 2.2.可视化自己定义的网络 一.PyTorch构建卷积神经网络(CNN)详细流程 卷积神经网络(Convolutional Neural Networks)是一种深度学…

前端vite+vue3——自动化配置路由布局

文章目录 ⭐前言💖vue3系列文章 ⭐ 自动化配置路由💖引入vite版本自定义目录映射💖自动化读取文件下的路由💖main入口加载路由💖入口app.vue配置💖layout基础布局配置💖效果 ⭐总结⭐结束 ⭐前言…

【MySQL进阶之路】BufferPool底层设计(上)

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

jvm垃圾收集器之七种武器

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

OpenCV-32 膨胀操作

膨胀是与腐蚀相反的操作,基本原理是只要保证卷积核的锚点是非0值,周边无论是0还是非0值,都变为0。 使用API---dilate(img, kernel, iterationms 1) 示例代码如下: import cv2 imp…

C# 实现微信自定义分享

目录 需求与调整 代码实现 获取令牌 生成合法票据 获取有效签名 客户端准备 客户端实现 小结 需求与调整 在微信中打开网页应用后,可以选择将地址发送给朋友进行分享,如下图: 在实际的应用中,我们可能不是简单的将该网页…

HiveSQL——借助聚合函数与case when行转列

一、条件函数 if 条件函数 if函数是最常用到的条件函数&#xff0c;其写法是if(xn,a,b), xn代表判断条件&#xff0c;如果xn时&#xff0c;那么结果返回a ,否则返回b。 selectif(age < 25 or age is null, 25岁以下, 25岁以上) as age_cnt,count(1) as number from table…
最新文章