RMVL  2.1.0-dev
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::vector<double> &)>
 多元函数
 
using rm::FuncNds = std::vector<std::function<double(const std::vector<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::LsqMode : uint8_t { rm::LsqMode::GN , rm::LsqMode::LM }
 最小二乘求解模式 更多...
 

函数

double rm::derivative (Func1d func, double x, DiffMode mode=DiffMode::Central, double dx=1e-3)
 计算一元函数的导数
 
std::vector< double > rm::grad (FuncNd func, const std::vector< 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::vector< double >, double > rm::fminunc (FuncNd func, const std::vector< double > &x0, const OptimalOptions &options={})
 无约束多维函数的最小值搜索 [4] [8] ,可参考 多维无约束最优化方法
 
std::pair< std::vector< double >, double > rm::fmincon (FuncNd func, const std::vector< double > &x0, FuncNds c, FuncNds ceq, const OptimalOptions &options={})
 有约束多维函数的最小值搜索
 
std::vector< double > rm::lsqnonlin (const FuncNds &funcs, const std::vector< double > &x0, const OptimalOptions &options={})
 无约束非线性最小二乘求解
 

详细描述

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

类型定义说明

◆ 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::vector<double> &)>

#include <rmvl/algorithm/numcal.hpp>

多元函数

◆ FuncNds

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

#include <rmvl/algorithm/numcal.hpp>

多元函数组

枚举类型说明

◆ DiffMode

enum class rm::DiffMode : uint8_t
strong

#include <rmvl/algorithm/numcal.hpp>

梯度/导数计算模式

枚举值
Central 
Python: rm.DiffMode.Central

中心差商

Ridders 
Python: rm.DiffMode.Ridders

Richardson 外推

◆ FminMode

enum class rm::FminMode : uint8_t
strong

#include <rmvl/algorithm/numcal.hpp>

多维函数最优化模式

枚举值
ConjGrad 
Python: rm.FminMode.ConjGrad

共轭梯度法

Simplex 
Python: rm.FminMode.Simplex

单纯形法

◆ LsqMode

enum class rm::LsqMode : uint8_t
strong

#include <rmvl/algorithm/numcal.hpp>

最小二乘求解模式

枚举值
GN 
Python: rm.LsqMode.GN

改进的 Gauss-Newton 法

LM 
Python: rm.LsqMode.LM

Levenberg-Marquardt 法

函数说明

◆ 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导数计算模式,默认为中心差商 Diff_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_itertol
返回
[x, fval] 最小值点和最小值

◆ fmincon()

std::pair< std::vector< double >, double > rm::fmincon ( FuncNd func,
const std::vector< 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]optionsoptions 优化选项,可供设置的有 exteriorfmin_modemax_itertoldx
返回
[x, fval] 最小值点和最小值

◆ fminunc()

std::pair< std::vector< double >, double > rm::fminunc ( FuncNd func,
const std::vector< double > & x0,
const OptimalOptions & options = {} )
Python:
rm.fminunc(func, x0[, options]) -> x, fval

#include <rmvl/algorithm/numcal.hpp>

无约束多维函数的最小值搜索 [4] [8] ,可参考 多维无约束最优化方法

参数
[in]func多维约束函数
[in]x0初始点
[in]options优化选项,可供设置的有 fmin_modemax_itertoldx
返回
[x, fval] 最小值点和最小值

◆ grad()

std::vector< double > rm::grad ( FuncNd func,
const std::vector< 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梯度计算模式,默认为中心差商 Diff_Central
[in]dx计算偏导数时,坐标的微小增量,默认为 1e-3
返回
函数在指定点的梯度向量

◆ lsqnonlin()

std::vector< double > rm::lsqnonlin ( const FuncNds & funcs,
const std::vector< double > & x0,
const OptimalOptions & options = {} )
Python:
rm.lsqnonlin(funcs, x0[, options]) -> x

#include <rmvl/algorithm/numcal.hpp>

无约束非线性最小二乘求解

参数
[in]funcs多维最小二乘约束函数,满足

\[F(\pmb x_k)=\frac12\|\pmb f(\pmb x_k)\|_2^2=\frac12 \left(\texttt{funcs}[0]^2+\texttt{funcs}[1]^2+\cdots+\texttt{funcs}[n]^2\right)\]

[in]x0初始点
[in]options优化选项,可供设置的有 lsq_modemax_itertoldx
返回
最小二乘解

◆ 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搜索步长
返回
搜索区间