|
LMMC
Lamina Mathematic core
|
#include "itersolve_internal.h"结构体 | |
| 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 。 | |
| struct lmmc_lsqr_state_t |
在文件 itersolve_lsqr.c 第 3 行定义.
| 成员变量 | ||
|---|---|---|
| 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_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().