| RMVL 2.3.0 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
类 | 类型定义 | 枚举 | 函数
最优化算法库
数学、算法模块

包含一维函数最小值搜索、无约束多维函数最小值搜索等最优化算法 更多...

最优化算法库 的协作图:

## 类
struct | rm::OptimalOptions
| 多维函数优化选项 更多...

## 类型定义
using | rm::Func1d = std::function<double(double)>
| 一元函数
using | rm::Func1ds = std::vector<std::function<double(double)>>
| 一元函数组
using | rm::FuncNd = std::function<double(const std::valarray<double> &)>
| 多元函数
using | rm::FuncNds = std::function<std::valarray<double>(const std::valarray<double> &)>
| 多元函数组

## 枚举
enum class | rm::DiffMode : uint8_t { rm::DiffMode::Central , rm::DiffMode::Ridders }
| 梯度/导数计算模式 更多...
enum class | rm::FminMode : uint8_t { rm::FminMode::ConjGrad , rm::FminMode::Simplex }
| 多维函数最优化模式 更多...
enum class | rm::ConsMode : uint8_t { rm::ConsMode::Exterior , rm::ConsMode::Lagrange }
| 约束求解模式 更多...
enum class | rm::LsqMode : uint8_t { rm::LsqMode::SGN , rm::LsqMode::GN , rm::LsqMode::LM }
| 最小二乘求解模式 更多...
enum class | rm::RobustMode : uint8_t { rm::RobustMode::L2 , rm::RobustMode::Huber , rm::RobustMode::Tukey , rm::RobustMode::Cauchy , rm::RobustMode::GM }
| Robust 核函数 更多...

## 函数
double | rm::derivative (Func1d func, double x, DiffMode mode=DiffMode::Central, double dx=1e-3)
| 计算一元函数的导数
std::valarray< double > | rm::grad (FuncNd func, const std::valarray< double > &x, DiffMode mode=DiffMode::Central, double dx=1e-3)
| 计算多元函数的梯度
std::pair< double, double > | rm::region (Func1d func, double x0, double delta=1)
| 采用进退法确定搜索区间
std::pair< double, double > | rm::fminbnd (Func1d func, double x1, double x2, const OptimalOptions &options={})
| 一维函数最小值搜索
std::pair< std::valarray< double >, double > | rm::fminunc (FuncNd func, const std::valarray< double > &x0, const OptimalOptions &options={})
| 无约束多维函数的最小值搜索，可参考 多维无约束最优化方法
std::pair< std::valarray< double >, double > | rm::fmincon (FuncNd func, const std::valarray< double > &x0, FuncNds c, FuncNds ceq, const OptimalOptions &options={})
| 有约束多维函数的最小值搜索
std::valarray< double > | rm::lsqnonlin (const FuncNds &func, const std::valarray< double > &x0, const OptimalOptions &options={})
| 非线性最小二乘求解，实现与 [1] 类似的算法
std::valarray< double > | rm::lsqnonlinRKF (const FuncNds &func, const std::valarray< double > &x0, RobustMode rb, const OptimalOptions &options={})
| 带 Robust 核函数的非线性最小二乘求解

## 详细描述

包含一维函数最小值搜索、无约束多维函数最小值搜索等最优化算法

## 类型定义说明

## ◆ Func1d

using rm::Func1d = std::function<double(double)>

`#include <rmvl/algorithm/numcal.hpp>`

一元函数

## ◆ Func1ds

using rm::Func1ds = std::vector<std::function<double(double)>>

`#include <rmvl/algorithm/numcal.hpp>`

一元函数组

## ◆ FuncNd

using rm::FuncNd = std::function<double(const std::valarray<double> &)>

`#include <rmvl/algorithm/numcal.hpp>`

多元函数

## ◆ FuncNds

using rm::FuncNds = std::function<std::valarray<double>(const std::valarray<double> &)>

`#include <rmvl/algorithm/numcal.hpp>`

多元函数组

## 枚举类型说明

## ◆ ConsMode

enum class rm::ConsMode : uint8_t
| strong

`#include <rmvl/algorithm/numcal.hpp>`

约束求解模式

枚举值
Exterior Python: rm.ConsMode.Exterior | 外罚函数法
Lagrange Python: rm.ConsMode.Lagrange | 拉格朗日乘子法（仅支持等式约束）

## ◆ DiffMode

enum class rm::DiffMode : uint8_t
| strong

`#include <rmvl/algorithm/numcal.hpp>`

梯度/导数计算模式

枚举值
Central Python: rm.DiffMode.Central | 中心差商
Ridders Python: rm.DiffMode.Ridders | Richardson 外推 [17]

## ◆ FminMode

enum class rm::FminMode : uint8_t
| strong

`#include <rmvl/algorithm/numcal.hpp>`

多维函数最优化模式

枚举值
ConjGrad Python: rm.FminMode.ConjGrad | 共轭梯度法 [7]
Simplex Python: rm.FminMode.Simplex | 单纯形法 [13]

## ◆ LsqMode

enum class rm::LsqMode : uint8_t
| strong

`#include <rmvl/algorithm/numcal.hpp>`

最小二乘求解模式

枚举值
SGN Python: rm.LsqMode.SGN | 改进的 Gauss-Newton 法，单次寻找最优步长的 Gauss-Newton 法
GN Python: rm.LsqMode.GN | Gauss-Newton 法
LM Python: rm.LsqMode.LM | Levenberg-Marquardt 法 [4] [11]

## ◆ RobustMode

enum class rm::RobustMode : uint8_t
| strong

`#include <rmvl/algorithm/numcal.hpp>`

Robust 核函数

枚举值
L2 Python: rm.RobustMode.L2 | `L2` 核函数
Huber Python: rm.RobustMode.Huber | `Huber` 核函数 [8]
Tukey Python: rm.RobustMode.Tukey | `Tukey` 核函数 [18]
Cauchy Python: rm.RobustMode.Cauchy | `Cauchy` 核函数
GM Python: rm.RobustMode.GM | `Geman-McClure` 核函数 [6]

## 函数说明

## ◆ derivative()

double rm::derivative | ( | Func1d | func,
|  | double | x,
|  | DiffMode | mode = DiffMode::Central,
|  | double | dx = 1e-3 )

Python:
| rm.derivative( | func, x[, mode[, dx]] | ) -> | grad

`#include <rmvl/algorithm/numcal.hpp>`

计算一元函数的导数

参数

  [in] | func | 一元函数
  [in] | x | 指定位置的自变量
  [in] | mode | 导数计算模式，默认为中心差商 `DiffMode::Central`
  [in] | dx | 坐标的微小增量，默认为 `1e-3`

返回
  函数在指定点的导数

## ◆ fminbnd()

std::pair< double, double > rm::fminbnd | ( | Func1d | func,
|  | double | x1,
|  | double | x2,
|  | const OptimalOptions & | options = {} )

Python:
| rm.fminbnd( | func, x1, x2[, options] | ) -> | x, fval

`#include <rmvl/algorithm/numcal.hpp>`

一维函数最小值搜索

参数

  [in] | func | 一维约束函数
  [in] | x1 | 搜索区间左端点
  [in] | x2 | 搜索区间右端点
  [in] | options | 优化选项，可供设置的有 `max_iter` 和 `tol`

返回
  `[x, fval]` 最小值点和最小值

## ◆ fmincon()

std::pair< std::valarray< double >, double > rm::fmincon | ( | FuncNd | func,
|  | const std::valarray< double > & | x0,
|  | FuncNds | c,
|  | FuncNds | ceq,
|  | const OptimalOptions & | options = {} )

Python:
| rm.fmincon( | func, x0, c, ceq[, options] | ) -> | x, fval

`#include <rmvl/algorithm/numcal.hpp>`

有约束多维函数的最小值搜索

参数

  [in] | func | 多维函数
  [in] | x0 | 初始点
  [in] | c | 不等式约束 \(f_c(x)\le0\)
  [in] | ceq | 等式约束 \(f_{ceq}(x)=0\)
  [in] | options | options 优化选项，可供设置的有 `cons_mode`、`max_iter`、`tol` 和 `dx`，当 `cons_mode == ConsMode::Exterior` 时，`fmin_mode` 也可供设置

注解
  当 `cons_mode == ConsMode::Lagrange` 时，参数 `c` 被忽略

返回
  `[x, fval]` 最小值点和最小值

## ◆ fminunc()

std::pair< std::valarray< double >, double > rm::fminunc | ( | FuncNd | func,
|  | const std::valarray< double > & | x0,
|  | const OptimalOptions & | options = {} )

Python:
| rm.fminunc( | func, x0[, options] | ) -> | x, fval

`#include <rmvl/algorithm/numcal.hpp>`

无约束多维函数的最小值搜索，可参考 多维无约束最优化方法

参数

  [in] | func | 多维约束函数
  [in] | x0 | 初始点
  [in] | options | 优化选项，可供设置的有 `fmin_mode`、`max_iter`、`tol` 和 `dx`

返回
  `[x, fval]` 最小值点和最小值

## ◆ grad()

std::valarray< double > rm::grad | ( | FuncNd | func,
|  | const std::valarray< double > & | x,
|  | DiffMode | mode = DiffMode::Central,
|  | double | dx = 1e-3 )

Python:
| rm.grad( | func, x[, mode[, dx]] | ) -> | grad

`#include <rmvl/algorithm/numcal.hpp>`

计算多元函数的梯度

参数

  [in] | func | 多元函数
  [in] | x | 指定位置的自变量
  [in] | mode | 梯度计算模式，默认为中心差商 `DiffMode::Central`
  [in] | dx | 计算偏导数时，坐标的微小增量，默认为 `1e-3`

返回
  函数在指定点的梯度向量

## ◆ lsqnonlin()

std::valarray< double > rm::lsqnonlin | ( | const FuncNds & | func,
|  | const std::valarray< double > & | x0,
|  | const OptimalOptions & | options = {} )

Python:
| rm.lsqnonlin( | func, x0[, options] | ) -> | x

`#include <rmvl/algorithm/numcal.hpp>`

非线性最小二乘求解，实现与 [1] 类似的算法

参数

  [in] | func | 最小二乘目标函数，满足 \[F(\boldsymbol x_k)=\frac12\|\boldsymbol f(\boldsymbol x_k)\|_2^2=\frac12 \left(\texttt{func}[0]^2+\texttt{func}[1]^2+\cdots+\texttt{func}[n]^2\right)\]
  [in] | x0 | 初始点
  [in] | options | 优化选项，可供设置的有 `lsq_mode`、`max_iter`、`tol` 和 `dx`

返回
  最小二乘解

## ◆ lsqnonlinRKF()

std::valarray< double > rm::lsqnonlinRKF | ( | const FuncNds & | func,
|  | const std::valarray< double > & | x0,
|  | RobustMode | rb,
|  | const OptimalOptions & | options = {} )

Python:
| rm.lsqnonlinRKF( | func, x0, rb[, options] | ) -> | x

`#include <rmvl/algorithm/numcal.hpp>`

带 Robust 核函数的非线性最小二乘求解

参数

  [in] | func | 最小二乘目标函数，参考 rm::lsqnonlin
  [in] | x0 | 初始点
  [in] | rb | Robust 核函数模式，参考 rm::RobustMode ，选择 `rm::RobustMode::L2` 时退化为 `rm::lsqnonlin`
  [in] | options | 优化选项，可供设置的有 `lsq_mode`、`max_iter`、`tol` 和 `dx`

返回
  最小二乘解

## ◆ region()

std::pair< double, double > rm::region | ( | Func1d | func,
|  | double | x0,
|  | double | delta = 1 )

Python:
| rm.region( | func, x0[, delta] | ) -> | a, b

`#include <rmvl/algorithm/numcal.hpp>`

采用进退法确定搜索区间

参数

  [in] | func | 一维函数
  [in] | x0 | 初始点
  [in] | delta | 搜索步长

返回
  搜索区间