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

浏览该文件的源代码.

结构体

struct  lmmc_lsqr_state_t

函数

lmmc_status_t lmmc_lsqr_solve (const lmmc_sparse_mat_t *a, const lmmc_vec_t *b, const lmmc_itersolve_config_t *cfg, lmmc_vec_t *x, lmmc_itersolve_result_t *out_result)
 LSQR 求解最小二乘问题 min ||Ax - b||_2 。

结构体说明

◆ lmmc_lsqr_state_t

struct lmmc_lsqr_state_t

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

lmmc_lsqr_state_t 的协作图:
成员变量
lmmc_vec_t u
lmmc_vec_t v
lmmc_vec_t w
lmmc_vec_t tmp_vec
lmmc_vec_t av_tmp
double alpha
double beta
double rho_bar
double phi_bar
double anorm
double rho
double theta
double norm_r
double threshold

函数说明

◆ lmmc_lsqr_solve()

lmmc_status_t lmmc_lsqr_solve ( const lmmc_sparse_mat_t * a,
const lmmc_vec_t * b,
const lmmc_itersolve_config_t * cfg,
lmmc_vec_t * x,
lmmc_itersolve_result_t * out_result )

LSQR 求解最小二乘问题 min ||Ax - b||_2 。

基于 Golub-Kahan 双对角化。matrix-free 模式要求 cfg->apply_op 和 cfg->apply_transpose_op 同时非 NULL,并分别计算 A*x 和 A^T*x,共享 cfg->op_user_data;此时 a 必须为 NULL。显式矩阵模式要求两个回调均为 NULL。

初始及每次完成 x 更新后计算真实残差 r=b-A*x,统计和诊断均报告其 2-范数。 收敛条件为 ||r||_2 <= abs_tol + rel_tol * ||b||_2,或 ||A^T*r||_2 <= rel_tol * anorm * ||r||_2,其中 anorm 为双对角化的 Frobenius 范数估计。后者通过归一化残差计算以避免下溢,因此最小二乘 收敛时 final_residual_norm 可以非零;abs_tol 始终具有残差量纲。

num_iter 计完成的解更新次数。达到 max_iter 或基空间耗尽且未满足停止式, 返回 OK / converged=0;非有限状态返回 NUMERICAL_FAILURE,算子错误原样 传播,错误统计保留最近成功计算的真残差。每步额外计算一次前向算子, 需要驻点检查时再计算一次转置算子。一次分配工作区,迭代中不分配; restart 被忽略。

在文件 itersolve_lsqr.c 第 232 行定义.

引用了 lmmc_lsqr_state_t::av_tmp, lmmc_itersolve_do_log(), lmmc_itersolve_finish(), lmmc_itersolve_initial(), lmmc_itersolve_result_init(), lmmc_itersolve_workspace(), lmmc_lsqr_solve(), lmmc_memory_free(), LMMC_STATUS_OK, lmmc_lsqr_state_t::norm_r, lmmc_vec_t::size, lmmc_lsqr_state_t::threshold, lmmc_lsqr_state_t::tmp_vec, lmmc_lsqr_state_t::u, lmmc_lsqr_state_t::v , 以及 lmmc_lsqr_state_t::w.

被这些函数引用 lmmc_lsqr_solve().

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