LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
optimize_lm.c 文件参考
optimize_lm.c 的引用(Include)关系图:

浏览该文件的源代码.

结构体

struct  lmmc_lm_workspace_t

枚举

enum  lmmc_lm_trial_t {
  LMMC_LM_TRIAL_READY ,
  LMMC_LM_TRIAL_RETRY ,
  LMMC_LM_TRIAL_FAILURE
}

函数

lmmc_status_t lmmc_minimize_levenberg_marquardt (lmmc_opt_func_t residual, lmmc_opt_jac_t J, void *user_data, lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, lmmc_optimize_result_t *out)
 Levenberg-Marquardt 非线性最小二乘。

结构体说明

◆ lmmc_lm_workspace_t

struct lmmc_lm_workspace_t

在文件 optimize_lm.c 第 3 行定义.

lmmc_lm_workspace_t 的协作图:
成员变量
lmmc_opt_workspace_t arena
lmmc_vec_t residual
lmmc_vec_t next_residual
lmmc_vec_t delta
lmmc_vec_t gradient
lmmc_vec_t trial
lmmc_vec_t rhs
lmmc_mat_t jacobian
lmmc_mat_t gram
lmmc_mat_t augmented

枚举类型说明

◆ lmmc_lm_trial_t

枚举值
LMMC_LM_TRIAL_READY 
LMMC_LM_TRIAL_RETRY 
LMMC_LM_TRIAL_FAILURE 

在文件 optimize_lm.c 第 9 行定义.

函数说明

◆ lmmc_minimize_levenberg_marquardt()

lmmc_status_t lmmc_minimize_levenberg_marquardt ( lmmc_opt_func_t residual,
lmmc_opt_jac_t J,
void * user_data,
lmmc_vec_t * x,
const lmmc_optimize_config_t * cfg,
lmmc_optimize_result_t * out )

Levenberg-Marquardt 非线性最小二乘。

求解 (JᵀJ + λI)δ = -Jᵀr,自适应调整 λ(接受步减小 λ,拒绝步增大 λ)。 当 ||r||₂ 或 ||Jᵀr||₂ 满足绝对容差或相对于各自初始范数的相对容差时 收敛,因此允许非零残差的驻点。残差和梯度范数必须均为有限数。 final_residual 为输出 x 处的 ||r||₂。

参数
[in]residual残差函数回调 r(x)。
[in]JJacobian 回调(可为 NULL,使用有限差分)。
[in]user_data传递给回调的用户数据。
[in,out]x初始猜测 / 输出解。
[in]cfg算法配置(lm_damping 指定初始 λ)。
[out]out迭代结果。
返回
::LMMC_STATUS_OK(通过 out->converged 判断是否收敛)。
注解
  • 就地修改 x->data。
  • 分配并释放多个临时向量和 n×n 矩阵。
  • 多次调用 residual 和 J 回调。

尝试阻尼步之前,Jacobian 计算可复用试探缓冲区。

在文件 optimize_lm.c 第 141 行定义.

引用了 lmmc_opt_workspace_t::allocation, lmmc_lm_workspace_t::arena, lmmc_optimize_result_t::failure_reason, lmmc_optimize_result_t::final_residual, lmmc_lm_workspace_t::jacobian, lmmc_optimize_config_t::lm_damping, lmmc_memory_free(), lmmc_minimize_levenberg_marquardt(), LMMC_OPT_FAILURE_NUMERICAL_ISSUE, lmmc_optimize_arguments_valid(), lmmc_optimize_emit(), lmmc_optimize_jacobian(), lmmc_optimize_norm(), lmmc_optimize_result_init(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_lm_workspace_t::next_residual, lmmc_optimize_result_t::num_iter, lmmc_lm_workspace_t::residual, lmmc_vec_t::size , 以及 lmmc_lm_workspace_t::trial.

被这些函数引用 lmmc_minimize_levenberg_marquardt().

函数调用图:
这是这个函数的调用关系图: