ceres学习笔记(二)

news2024/11/19 17:45:18

继续关于ceres官方doc里教程的学习,对于powell's function的学习。

一、powell's function

鲍威尔法,严格来说是鲍威尔共轭方向法,是迈克尔J.D.鲍威尔提出的一种求解函数局部最小值的算法。该函数不能是可微分的,并且不会导出衍生函数。

该函数必须是固定数量的实值输入的实值函数。通过传入一组初始搜索向量,通常会传入N个搜索向量(譬如{s1,,,,,sn})这是与每个轴对齐的法线。

鲍威尔法是在无约束优化共扼方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,取复这一过程直到获得满意解,其优点是不必计算目标函数的 梯度就可以在有限步内找到极值点。

以上内容引用自百科,直接看官方的例子:

 它的意思是说, F(x)是上面四个残差值的方程,现在要寻找合适的x使\frac{1}{2}*||F(X)||^2最小。

下面使用ceres进行求解。

二、定义残差方程

按照前面学习的步骤,进行定义:

struct f1{
    template<typename T>
    bool operator()(const T* const x1, const T* const x2, T* residual) const {
        residual[0] = x1[0] + 10.0 * x2[0];
        return true;
    }
};

struct f2{
    template<typename T>
    bool operator()(const T* const x3, const T* const x4, T* residual) const {
        residual[0] = sqrt(5) * (x3[0] - x4[0]);
        return true;
    }
};

struct f3{
    template<typename T>
    bool operator()(const T* const x2, const T* const x3, T* residual) const {
        residual[0] = (x2[0] - 2.0 * x3[0]) * (x2[0] - 2.0 * x3[0]);
        return true;
    }
};

struct f4{
    template<typename T>
    bool operator()(const T* const x1, const T* const x4, T* residual) const {
        residual[0] = sqrt(10) * (x1[0] -   x4[0]) * (x1[0] -   x4[0]) ;
        return true;
    }
};

这里我调试的时候,犯了几个错误,记录一下:

1. 关于x1的设置,要写成x1[0]的形式。

2. 所有的数要写成double的形式。10 要写成 10.0。

三、构建寻优问题

    Problem problem;
    problem.AddResidualBlock(new AutoDiffCostFunction<f1, 1, 1, 1>(new f1), NULL, &x1, &x2);
    problem.AddResidualBlock(new AutoDiffCostFunction<f2, 1, 1, 1>(new f2), NULL, &x3, &x4);
    problem.AddResidualBlock(new AutoDiffCostFunction<f3, 1, 1, 1>(new f3), NULL, &x2, &x3);
    problem.AddResidualBlock(new AutoDiffCostFunction<f4, 1, 1, 1>(new f4), NULL, &x1, &x4);

也是按照之前的格式来写的,没什么问题。

四、配置并运行求解器

    Solver::Options options;
    options.linear_solver_type = ceres::DENSE_QR;
    options.minimizer_progress_to_stdout = true;
    Solver::Summary summary;
    Solve(options, &problem, &summary);

五、输出结果

    cout << summary.BriefReport() << "\n";

    cout << "x1 : " << x1 << "\n";
    cout << "x2 : " << x2 << "\n";
    cout << "x3 : " << x3 << "\n";
    cout << "x4 : " << x4 << "\n";

最后算出来到结果是:

 基本上和0,差不多。符合官网的参考答案。

六、换成其它的格式

#include <ceres/ceres.h>
#include <iostream>

using namespace std;
using namespace ceres;

struct f{
    template<typename T>
    bool operator()(const T* const x, T* residual) const {
        residual[0] = x[0] + 10.0 * x[1];
        residual[1] = sqrt(5) * (x[2] - x[3]);
        residual[2] = (x[1] - 2.0 * x[2]) * (x[1] - 2.0 * x[2]);
        residual[3] = sqrt(10) * (x[0] -   x[3]) * (x[0] -   x[3]) ;
        return true;
    }
};

int main(int argc, char** argv)
{
    double x[4] = {1,2,3,4};


    Problem problem;
    problem.AddResidualBlock(new AutoDiffCostFunction<f, 4, 4>(new f), NULL, x);

    Solver::Options options;
    options.linear_solver_type = ceres::DENSE_QR;
    options.minimizer_progress_to_stdout = true;
    Solver::Summary summary;
    Solve(options, &problem, &summary);

    cout << summary.BriefReport() << "\n";

    cout << "x1 : " << x[0] << "\n";
    cout << "x2 : " << x[1] << "\n";
    cout << "x3 : " << x[2] << "\n";
    cout << "x4 : " << x[3] << "\n";

    return 0;
}

按造自己的想法,优化了下。主要是使用了x数组代替了4个单独的变量,并重新设置residual的纬度。需要注意的是,problem.AddResidualBlock()函数中最后一个参数,原来是单个数就需要取地址符号,设置成数组就直接写数组名就好了。

最后算出结果:

 两次结果基本一致。

准备把官方doc里面的example部分全部刷一遍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring用注解读取与获取对象

前言 上一篇博客简单的介绍了spring的功能与使用&#xff0c;可以看到我们创建一个对象&#xff0c;就需要在xml中存储一个bean对象&#xff0c;这种操作非常的繁琐&#xff0c;因此spring发明了使用注解来快捷存储bean对象 配置工作 我们在xml文件中写下面的代码片段 <…

基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

目录 0 引言 1 计及风光储能和需求响应的微电网日前经济调度模型 1.1风光储能需求响应都不参与的模型 1.2风光参与的模型 1.3风光和储能参与模型 1.4 风光和需求响应参与模型 1.5 风光储能和需求响应都参与模型 2 需求侧响应评价 2.1 负载率 2.2 可再生能源消纳率 …

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分 V1.0版本发布 2022年1月19日 内置常用PE工具&#xff0c;7-Zip、EasyImageX_x64、XorBoot Uefi修复、NT6修复、Ghost、CGI、Google浏览器、PENetwork、RegWorkshop、迅雷迷你版、、BOOTICEx64、windows安装器、XP安…

路径计数2

路径计数2 题目描述 一个NNN \times NNN的网格&#xff0c;你一开始在(1,1)(1,1)(1,1)&#xff0c;即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子&#xff0c;问到达(N,N)(N,N)(N,N)&#xff0c;即右下角有多少种方法。 但是这个问题太简单了&#xff0c;所以现…

MySQL 数据同步 Elasticsearch 的技术方案选型

文章目录1.同步双写2.异步双写3.定时任务4.数据订阅1.同步双写 优点&#xff1a;实现简单缺点&#xff1a; 业务耦合&#xff0c;商品的管理中耦合大量数据同步代码 影响性能&#xff0c;写入两个存储&#xff0c;响应时间变长 不便扩展&#xff1a;搜索可能有一些个性化需求&…

jvm学习的核心(三)---运行时数据区详解(1)

图片等相关信息来源于&#xff1a;尚硅谷宋红康JVM全套教程 1.程序计数器 程序计数器又叫pc寄存器&#xff0c;中文有两个名字 我们可以反编译字节码文件查看方法中操作指令对应的指令地址 javap -v "对应的class文件"为什么要用pc寄存器&#xff0c;pc寄存器有什…

13、Javaweb_Filter登陆验证动态代理过滤敏感词Listener

Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能。 * 过滤器的作用&…

深入理解计算机系统_可执行目标文件和可重定位目标文件的3个区别

这篇笔记对比一下可执行目标文件和可执行目标的3个区别。下图分别是可重定位目标文件和可执行目标文件各段结构。 1.1 可执行目标文件和可重定位目标文件的3个区别 区别1&#xff1a;可执行目标文件的rel.text和.rel.data消失了 链接器将.o中.text和.data节整合到一起时&a…

【ROS2入门】理解 ROS 2 Topics 话题

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中节点的功能以及与之交互的工具&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的…

RS232 RS485 TO ETH TCP-Modbus 测试

原来modbus 传感器都是有对应的指令码的&#xff0c;不同功能的指令码也不一样&#xff0c;比如测温度和湿度的指令码也是不一样的&#xff1b; 硬件连接如下图 &#xff08;温湿度传感器&#xff0c;板载SHT20&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超…

华为VRRP、BFD实验配置

目录 VRRP实验配置 BFD实验配置 配置单跳检测 配置多跳检测 配置单臂回声 BFD与路由协议联动配置 BFD与OSPF联动 BFD与ISIS联动 BFD与BGP联动 VRRP实验配置 VRRP配置 AR1配置&#xff08;VRRP缺省优先级100&#xff09; int g0/0/0 ip add 192.168.10.1 24 vrrp vrid …

织音云站长扶持计划:可免费获得CDN或虚拟主机

活动介绍活动详情页&#xff1a;织音云站长扶持计划网站被恶意攻击时是中小站长最脆弱的时候&#xff0c;90%的站长都会动“关站不干了”的心思&#xff0c;夹在中间真的很难搞!因此织音云决定为中小站长提供免费的全球CDN加速服务和提供免费的虚拟主机,免备案&#xff01;只需…

智改数转水循环在线监测系统,提升企业生产安

江苏省政府印发《江苏省制造业智能化改造和数字化转型三年行动计划&#xff08;2022&#xff0d;2024年&#xff09;》&#xff0c;提出通过三年的努力&#xff0c;全省制造业数字化、网络化、智能化水平显著提升&#xff0c;新业态、新模式、新动能显著壮大&#xff0c;制造业…

linux系统中使用QT操作硬件蜂鸣器的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT进行蜂鸣器的控制与实现。 目录 第一&#xff1a;资源基本简介 第二&#xff1a;应用实例的代码实现 第三&#xff1a;源文件“mainwindow.cpp”的具体实现 第四&#xff1a;程序运行效果 第一&#xff1a;资…

自动控制原理课程设计

一、实验目的(1)要求学生根据书上习题的要求&#xff0c;自行设计一校正装置&#xff0c;并用本 实验挂件 构成的模拟系统 进行实验和实际调试、使学生能认识到校正装置在系统中的重要性。(2)掌握工程中常用的 二阶系统 和 三阶系统 的工程设计方法。二、实验所需挂件及附件型 …

Docker 安装mysql主从复制

1、新建主服务器容器实例3307docker run -d -p 3307:3306 -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDroot --name mysql-master mysql:5.72、进入/myd…

Acwing——第二场热身赛

题目链接 AcWing 3547. 特殊数字 AcWing 3548. 双端队列 AcWing 3549. 最长非递减子序列 题目描述 3547.特殊数字 我们规定&#xff0c;对于一个整数 a&#xff0c;如果其各位数字相加之和能够被 4 整除&#xff0c;则称它是一个特殊数字。 现在&#xff0c;给定一个整数 n…

算法第十一期——BFS(广度优先搜索)入门与应用

目录 BFS BFS:找最短路路径 BFS:用队列实现 特点 最短路径问题用BFS 应用场合 例题一 【思路】 输出路径的两种方法 简单方法 标准方法&#xff08;栈&#xff09; BFS:连通性判断 例题二&#xff1a;全球变暖 【思路】 BFS的三种实现 1、queue实现 2、 li…

分享66个Java源码,总有一款适合您

Java源码 分享66个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1wnPO7GfR_cVmDb2qx-4vEw?pwdlrsu …

Android 深入系统完全讲解(16)

2 属性权限 我们来看下属性权限的整体流程&#xff0c;简单分析下这个模块。init.cpp -->property_init() init 进程 进入第二阶段的时候&#xff0c;初始化属性。 关键点&#xff0c;创建了一个目录&#xff0c;这个目录就是我们属性后续会存在的地方。加载对应文件中的配…