利用OOQP求解二次凸优化问题

2023-05-16

最近使用到了OOQP求解凸优化问题,所以记录一下求解简单的二次凸优化问题。

目录

一、OOQP安装

二、OOQP相关介绍

三、例题

1.数学例题

2.代码求解

3.求解结果

总结


一、OOQP安装

参考了浙大高飞老师团队提供的 OOQP 的安装步骤,其参考链接如下:

Teach-Repeat-Replan/onboard_computer/controller/n3ctrl at experiment · HKUST-Aerial-Robotics/Teach-Repeat-Replan · GitHub

二、OOQP相关介绍

OOQP的介绍文档如下,不过是全英的,看起来可能稍微有点不爽,但是勉强可以理解。

https://pages.cs.wisc.edu/~swright/ooqp/ooqp-userguide.pdf

其中参数的介绍也有详细的说明。这里也可以参考这位博主的文章有对相关参数的详细介绍:

2021-08-31_流川_phone的博客-CSDN博客_ooqp求解器

三、不等式约束例题

1.参数提取

从上式中可以提取出Q = \begin{bmatrix} 1 & -1\\ -1 & 2 \end{bmatrix}c = \begin{bmatrix} -2 &-6 \end{bmatrix}C = \begin{pmatrix} 1 & 1\\ -1 & 2\\ 2& 1 \end{pmatrix}。x的取值范围是负无穷到正无穷。到这儿就提取出了这几个主要的矩阵参数信息。

2.代码求解

代码如下:

#include "ooqp/QpGenData.h"
#include "ooqp/QpGenVars.h"
#include "ooqp/QpGenResiduals.h"
#include "ooqp/GondzioSolver.h"
#include "ooqp/QpGenSparseMa27.h"

#include <iostream>
#include <string.h>

using namespace std;

const int nx = 2;
double c[] = {-2,-6};
double xupp[] = {0,0};
char ixupp[] = {0,0};

double xlow[] = {0,0};
char ixlow[] = {0,0};

const int nnzQ = 3;
int irowQ[] = {0,1,1};
int jcolQ[] = {0,0,1};
double dQ[] = {1,-1,2};

int my = 0;//线性等式约束的个数
double *b = 0;
int nnzA = 0;
int *irowA = 0;
int *jcolA = 0;
double *dA = 0;

const int mz = 3;
double clow[] = {0,0,0};
char iclow[] = {1,1,1};

double cupp[] = {2,2,3};
char icupp[] = {1,1,1};

const int nnzC = 6;
int irowC[] = {0,0,1,1,2,2};
int jcolC[] = {0,1,0,1,0,1};
double dC[] = {1,1,-1,2,2,1};

int main(int argc,char * argv[])
{
	int usage_ok = 1;
	int quiet = 0;
	if(argc > 2)
	{
		usage_ok = 0;
	}
	if(argc == 2)
	{
		if(0 == strcmp("--quiet",argv[1]))
		{
			quiet = 1;
		}
		else
		{
			usage_ok = 0;
		}
	}	

	if(!usage_ok)
	{
		cerr<<"Usage:"<<argv[0]<<"[--quiet]"<<endl;
		return 1;
	}
	QpGenSparseMa27 * qp = new QpGenSparseMa27(nx,my,mz,nnzQ,nnzA,nnzC);
	QpGenData * prob = (QpGenData *)qp -> copyDataFromSparseTriple(
			c,irowQ,nnzQ,jcolQ,dQ,
			xlow,ixlow,xupp,ixupp,
			irowA,nnzA,jcolA,dA,b,
			irowC,nnzC,jcolC,dC,
			clow,iclow,cupp,icupp);
	QpGenVars * vars = (QpGenVars *)qp -> makeVariables(prob);
	QpGenResiduals *resid = (QpGenResiduals *)qp -> makeResiduals(prob);

	GondzioSolver *s = new GondzioSolver(qp,prob);
	
	if(!quiet)
	{
		s->monitorSelf();
	}
	int ierr = s->solve(prob,vars,resid);

	if(ierr == 0)
	{
		cout.precision(4);
		cout<<"Solution:"<<endl;
		vars->x->writefToStream(cout,"x[%{index}] = %{value}");
	}
	else
	{
		cout<<"Could not solve the problem!"<<endl;
	}

	return ierr;
}

3.求解结果

从上图中可以看出变量的取值分别为 0.6667 和 1.333。

四、等式约束例题

1、参数提取

最小化的目标函数同上一部分所介绍的目标函数是一样的,不同的是这个只有等式约束没有不等式约束,需要修改的是这一部分,如下图所示。

这里线性等式约束只有一个故需要修改,b 的值是等式约束右侧的值,nnzA 是等式约束左侧系数矩阵中的下三角元素个数,irowA 和 jcolA 分别为元素对应的角标都是从 0 开始的,dA 代表等式约束中系数矩阵的元素的值。其余部分和上面那部分的代码相同。

2、代码求解

#include "ooqp/QpGenData.h"
#include "ooqp/QpGenVars.h"
#include "ooqp/QpGenResiduals.h"
#include "ooqp/GondzioSolver.h"
#include "ooqp/QpGenSparseMa27.h"

#include <iostream>
#include <string.h>

using namespace std;

const int nx = 2;
double c[] = {-2,-6};

double xupp[] = {0,0};
char ixupp[] = {0,0};

double xlow[] = {0,0};
char ixlow[] = {0,0};

const int nnzQ = 3;
int irowQ[] = {0,1,1};
int jcolQ[] = {0,0,1};
double dQ[] = {1,-1,2};


int my = 1;//线性等式约束的个数
double b[] = {0};
int nnzA = 1;
int irowA[] = {0,0};
int jcolA[] = {0,1};
double dA[] = {1,1};

const int mz = 0;
double *clow = 0;
char *iclow = 0;
double *cupp = 0;
char *icupp = 0;

const int nnzC = 0;
int *irowC = 0;
int *jcolC = 0;
double *dC = 0;

int main(int argc,char * argv[])
{
	int usage_ok = 1;
	int quiet = 0;
	if(argc > 2)
	{
		usage_ok = 0;
	}
	if(argc == 2)
	{
		if(0 == strcmp("--quiet",argv[1]))
		{
			quiet = 1;
		}
		else
		{
			usage_ok = 0;
		}
	}	

	if(!usage_ok)
	{
		cerr<<"Usage:"<<argv[0]<<"[--quiet]"<<endl;
		return 1;
	}
	QpGenSparseMa27 * qp = new QpGenSparseMa27(nx,my,mz,nnzQ,nnzA,nnzC);
	QpGenData * prob = (QpGenData *)qp -> copyDataFromSparseTriple(
			c,irowQ,nnzQ,jcolQ,dQ,
			xlow,ixlow,xupp,ixupp,
			irowA,nnzA,jcolA,dA,b,
			irowC,nnzC,jcolC,dC,
			clow,iclow,cupp,icupp);
	QpGenVars * vars = (QpGenVars *)qp -> makeVariables(prob);
	QpGenResiduals *resid = (QpGenResiduals *)qp -> makeResiduals(prob);

	GondzioSolver *s = new GondzioSolver(qp,prob);
	
	if(!quiet)
	{
		s->monitorSelf();
	}
	int ierr = s->solve(prob,vars,resid);

	if(ierr == 0)
	{
		cout.precision(4);
		cout<<"Solution:"<<endl;
		vars->x->writefToStream(cout,"x[%{index}] = %{value}");
	}
	else
	{
		cout<<"Could not solve the problem!"<<endl;
	}

	return ierr;
}

三、求解结果

从求解结果中可以得出 x1 和 x2 值分别是 0 和 3。


总结

以上就是OOQP的安装以及使用OOQP对简单的二次凸优化问题进行求解的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用OOQP求解二次凸优化问题 的相关文章

  • 即时通讯 3

    即时通讯 3 内容待写
  • HMC5883L 磁力计校准

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8ie html 这里针对 HMC5883L 磁力计 的校准 xff0c 做一个简单讲解 欢迎交流 xff0c 新浪长沙 64 Wal
  • linux下如何编译c++工程项目

    首先 xff0c 你必须 有一 个Linux开发环境 xff0c 这样才能进行C 43 43 开发 笔者用的是安装在虚拟机中的Ubuntu 9 04 xff0c Ubuntu操作系统是没带C 43 43 编译器g 43 43 在连网的情况下
  • 【ROS程序】 --- 4-1. URDF-GAZEBO 文件介绍

    没人天赋异禀 xff0c 介绍两种实现对比发现 gaze中的urdf文件1 碰撞参数设置2 惯性矩阵设置3 颜色设置 介绍 在前边提过的rviz中 xff0c 只负责整体机器人的建模和运动 xff0c 而在gazebo中集成urdf文件则需
  • 【ROS机器人】 --- 2-2.slam建图保存

    山无拦 海无遮 xff01 前期准备建图I 运行机器人 gazebo II 建图文件编写III 配置rviz并保存1 添加机器人和雷达2 添加TF3 地图map4 保存配置 IV 控制运动建图V 保存地图1 map server2 保存查看
  • 【ROS机器人】 --- 2-4. 路径规划_move_base

    我回来啦 前期准备基础知识1 action通信2 代价地图及组成3 碰撞算法 文件详解及过程I 集成参数的launch文件II 配置文件1 costmap common params yaml2 global costmap params
  • 【ROS机器人】 --- 2-5.自主导航并slam建图

    压线才低头 前期准备基础知识编写launch文件执行流程最后重写launch文件 本节目标 xff1a 加载一张未知地图 xff0c 为机器人设置目标点 机器人会边走路 边建图 最后还可以用map server保存 实现 xff1a 打开g
  • [xdm+ip]ubuntu下载数据慢或者不通

    解决了从官网下载kitti数据集慢的问题 1 改ip 测ping2 更改 etc hosts文件3 使用xdm工具4 配置浏览器和xdm5 使用 环境 ubuntu20 04 问题 从kitti数据集官网下载数据集慢或不通的问题 使用过we
  • 【Docker】--5.docker图形化(享用主机的屏幕)

    心向骄阳万丈光 1 主机操作2 初始化容器3 注意查看效果 docker图形无法显示 网上流传两种方法解决 一种是lightdm 容器初始化好后 另一种是我亲测有用的这种 初始化容器时 1 主机操作 安装 span class token
  • [ros+python]无法rosrun 导入自定义.py文件的python可执行文件

    问题描述 在ROS环境下 自定义a py文件作为模块 被b py引用 rosrun b的时候疯狂报错 not found python文件可以单独用python编译器跑通过 放在rosrun下边就不对 解决办法 删除掉工作空间下之前编译残留
  • 【从kitti开始自动驾驶】--9.1 利用IMU/GPS测距并比较效果(jupyter)

    义勇添青史几段 1 基础知识1 1 角度计算1 2 距离计算 2 python程序编写2 1 大圆距离公式函数2 2 a GPS测距离2 2 b IMU测距离2 3 绘图2 4 效果展示2 5 结论 3 Measure distance源码
  • 【gdb调试器】gdb的调试参数和使用方法

    34 江山不负英雄泪 34 GDB调试器GDB主要功能常用调试命令参数 小例子测试gdb编译生成可执行文件调试查看 GDB调试器 GDB GNU Debugger 是一个用来调试C C 43 43 程序的功能强大的调试器 是linux系统开
  • 磁力计的基本工作原理

    此文详细讲解了 磁力计 的基本工作原理 干扰产生的原因以及如何校准 磁力计与倾角传感器如何结合使用等内容 原文地址 xff1a http www dzsc com data html 2010 11 29 87454 html 电子罗盘是一
  • Linux安装confluence

    一 准备工作 1 安装jdk 在官网下载Linux环境下的jdk1 8 xff1a https www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • [ROS+catkin_make]编译100%后出现 unreference to ...的现象

    问题描述 catkin make编译100 后 突然出现unreference to 的情况 但是能定义过去 即根据VSCODE可以追踪过去问题解决 静态成员变量必须在类外初始化
  • 【linux基础】7.linux系统自定义应用名和应用图标

    34 懦弱之人毫无价值 34 1 做应用和图标1 1 测试和加入侧边栏 3 命令行重命名唤醒 任务叙述 xff1a 有一个x sh文件可以在命令行执行 sh x sh xff0c 这样太麻烦 将其做成app且配上logo xff0c 下次直
  • [Linux基础]8. linux下脚本将pdf转各图片并合成长图

    34 你也有不看星星 34 1 将PDF的每一页转换为图片2 将转换后的多张图片合并为一张长图3 完整脚本 任务叙述 xff1a 已经有一个很长的pdf xff0c 要在linux上用脚本合成一张长图 xff0c 如果由程序完成将PDF转换

随机推荐

  • 【linux网络问题】,ping出现connect问题,知乎(ipv6)能通,百度ipv4通不了

    问题 今天遇到一个很奇怪的事情 xff0c 有线连接的ifconfig中没有ipv4的解析 xff0c 只有ipv6的解析系统是ubuntu20 04及以上nslookup 43 网址的时候发现能访问网络的都是被解析成ipv6的 xff0c
  • 制作树莓派SD卡备份镜像——树莓派系统备份与还原指南

    制作树苺派SD卡备份镜像 树苺派系统备份与还原指南 科技爱好者关注 0 1452016 05 28 22 12 33字数 501阅读 26 658 树莓派使用SD卡来安装系统 xff0c 如果SD卡丢失或者损坏 xff0c 那么树莓派上的数
  • ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

    转自 xff1a http blog chinaaet com jihceng0622 p 5100001238 坐在上海回北京的高铁上 xff0c 漫长的旅途着实让人感到无聊 xff08 没买到直达的高铁 xff0c 只能慢悠悠的走一站停
  • 基于MFC的简易TCP/IP调试助手开发

    在学习TCP IP通讯过程中 xff0c 打算参考网上的教程写一个简易的调试助手 xff0c 服务器与客户端分别参考以下两位代码完成 xff0c 效果图如下 1 如何基于TCP IP协议进行MFC Socket网络通讯编程 Ezreal z
  • 下载的软件包保存在缓存中,直到下次成功执行事务。 您可以通过执行 'dnf clean packages' 删除软件包缓存。 错误:事务检查错误

    下载的软件包保存在缓存中 xff0c 直到下次成功执行事务 您可以通过执行 dnf clean packages 删除软件包缓存 错误 xff1a 事务检查错误 使用yum安装时出现了这个错误 xff0c 更新一下 sudo yum upd
  • @SpringBootApplication注解无效

    64 SpringBootApplication注解无效 import或clone下来的项目idea打开后 64 SpringBootApplication注解无效 1 查看看maven依赖是否报红 xff0c 如果报红说明依赖有问题检查p
  • 修改docker容器中的配置文件

    容器创建好后有时需要进入容器修改配置 xff0c 发现没有vim 我们可以使用sed命令来修改配置文件 sed i 3s yes no a conf 将a conf中第3行中的yes修改为no sed i 3ayes 61 no a con
  • 最近开始研究openpilot的开源飞控,记录一下

    国内用这个飞控的人比较少 xff0c 也没有太多的文章来描述包括代码结构之类的 xff0c 其实该飞控相当强大 xff0c 而且有一个用QT做的很强悍的GCS xff0c 我用380的机架已经搭建了一个四轴 xff0c 用默认参数就能飞得很
  • 解决aria2下载磁力链接或bt文件时没有速度或速度为0

    使用aria2下载磁力链接和种子时 xff0c 发现长时间都没有速度 xff0c 因为默认的配置是没有加tracker列表的 xff0c 就像迅雷没有p2p共享一样 xff0c 所以要在配置文件中加入trackers xff0c 速度就会提
  • UDP 打洞 java demo

    UDP打洞的具体原理就不细说了文章还是很多 xff0c 说下我的网络环境 xff0c 家里台式电脑网线连的家里路由器 移动宽带 xff0c 公司台式电脑网线连的公司路由器 电信宽带 xff0c 一台有公网IP的华为云主机 xff08 我是试
  • 云服务器内存不够,设置swap交换分区

    购买了一台阿里的云服务器1核2G的 xff0c 装上docker后 xff0c 运行了十几个容器后面的容器就再也没法启动了 xff0c 一看物理内存为0 xff0c 加内存又没钱 xff0c 只能牺牲速度了 xff0c 阿里云的服务器默认是
  • sql 拼接一列数据为一个字段

    最近有个功能中需要把一列数据拼接成一个字段的需要 xff0c 本以为concat 轻松就能实现 xff0c 结果却差点意思 xff0c 这个是拼接一行之间的 xff0c group concat 需要分组才能拼接组内的一列数据 xff0c
  • idea反编译

    idea有自带的反编译插件java decompiler jar xff0c 默认是安装的 这个工具包在F Program Files JetBrains IntelliJ IDEA 2020 2 3 plugins java decomp
  • android远程协助

    一部手机有时候需要远程协助另一台手机如QQ的远程协助一样 xff0c 准备两个手机 下面用AB代替 1 A手机 xff08 需要被协助的手机 xff09 开启开发者选项 xff0c usb连接电脑 xff0c 命令开启ADB xff08 手
  • 阿里云服务器安装图形界面

    为了自动化流程安装图形界面 xff0c 我的服务器是Centos7 1 yum安装gnome图形界面 yum groupinstall GNOME Desktop y 2 安装远程桌面服务端 yum y install tigervnc s
  • 国网 内网U盘 服务未启动 驱动版本不符问题

    国网内网U盘问题处理 1 提示服务未启动 是因为Bios开启了Secure BOOT xff0c 将这个选项设置为disable就可以 xff0c 进入Bios这个选项有的主板在Boot选项下 xff0c 有的在Security选项下 xf
  • 【C++】面试题目,整理自牛客网

    来源 1 写出完整版的strcpy函数 char strcpy char strDest const char strSrc assert strDest 61 NULL amp amp strSrc 61 NULL char addres
  • 卡尔曼滤波

    系列文章目录 前言 一 线性高斯系统 二 卡尔曼滤波算法 1 卡尔曼滤波算法的应用 2 卡尔曼滤波的数学推导 1 预测部分的推导 2 观测部分的推导 前言 最近在阅读概率机器人这本书 xff0c 读到了卡尔曼滤波的相关内容 xff0c 想要
  • xcode升级到6.2,解决了simulator国际化无法获取中文的问题

    问题描述 xff1a http blog csdn net aileenyuxiao article details 42704917 xcode最近升级到6 2 xff0c 这个bug也一起解决了 xff0c 只需要修改simulator
  • 利用OOQP求解二次凸优化问题

    最近使用到了OOQP求解凸优化问题 xff0c 所以记录一下求解简单的二次凸优化问题 目录 一 OOQP安装 二 OOQP相关介绍 三 例题 1 数学例题 2 代码求解 3 求解结果 总结 一 OOQP安装 参考了浙大高飞老师团队提供的 O