35 for (i = 0; i < n; ++i) {
37 for (k = 0; k < n; ++k) {
49 for (i = 0; i < n; ++i) {
50 for (j = 0; j < n; ++j) {
52 for (k = 0; k < n; ++k) {
68 for (i = 0; i < n; ++i) {
74 for (i = 0; i < n; ++i) {
89 for (attempt = 0; attempt < 20; ++attempt) {
97 for (i = 0; i < x->
size; ++i) {
105 if (next_norm < *norm) {
111 if (*lambda < 1e-15) *lambda = 1e-15;
115 if (*lambda > 1e15) {
return 0; }
124 if (!isfinite(grad_norm)) {
128 if (iter == 0) *initial_gradient = grad_norm;
148 lmmc_real_t lambda, norm, initial_residual, initial_gradient = 0.0;
155 status = lm_workspace_create(x->
size, &work);
162 initial_residual = norm;
163 for (iter = 0; ; ++iter) {
166 if (!isfinite(norm)) {
177 grad_norm = lm_gradient(&work);
178 if (lm_stop(norm, grad_norm, initial_residual, &initial_gradient,
179 iter, cfg, out)) {
break; }
180 if (!lm_step(&work, residual, user_data, x, &lambda, &norm)) {
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_lu_solve(const lmmc_mat_t *lu, const size_t *pivots, const lmmc_vec_t *b, lmmc_vec_t *x)
利用 LU 分解结果求解线性系统 A*x = b。
lmmc_status_t lmmc_lu_decompose_inplace(lmmc_mat_t *a, size_t *pivots, size_t *out_swap_count)
就地 LU 分解(带部分主元选取):P*A = L*U。
void lmmc_memory_free(void *pointer)
lmmc_real_t lmmc_optimize_norm(const lmmc_vec_t *v)
计算向量的 L2 范数。
lmmc_mat_t lmmc_opt_workspace_matrix(lmmc_opt_workspace_t *work, size_t n)
lmmc_status_t lmmc_optimize_jacobian(lmmc_opt_func_t F, lmmc_opt_jac_t J, void *user_data, const lmmc_vec_t *x, const lmmc_vec_t *Fx, lmmc_mat_t *matrix, lmmc_vec_t *x_pert, lmmc_vec_t *F_pert)
临时向量由外层求解器一次性分配。
void lmmc_optimize_emit(const lmmc_optimize_config_t *cfg, const char *operation, size_t iteration, const lmmc_real_t *values, size_t value_count)
lmmc_vec_t lmmc_opt_workspace_vector(lmmc_opt_workspace_t *work, size_t n)
int lmmc_optimize_has_converged(lmmc_real_t residual, lmmc_real_t initial_residual, const lmmc_optimize_config_t *cfg)
lmmc_status_t lmmc_opt_workspace_create(size_t n, size_t vectors, size_t matrices, size_t extra, int need_pivots, lmmc_opt_workspace_t *work)
void lmmc_optimize_result_init(lmmc_optimize_result_t *out)
int lmmc_optimize_arguments_valid(const lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, const lmmc_optimize_result_t *out)
@ LMMC_OPT_FAILURE_MAX_ITER
@ LMMC_OPT_FAILURE_NUMERICAL_ISSUE
lmmc_status_t(*) lmmc_opt_func_t(const lmmc_vec_t *x, lmmc_vec_t *F, void *user_data)
非线性函数回调:计算 F(x)。
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_optimize_failure_t failure_reason
lmmc_status_t(*) lmmc_opt_jac_t(const lmmc_vec_t *x, lmmc_mat_t *J, void *user_data)
Jacobian 回调:计算 J(x)。
lmmc_real_t final_residual
工作区由本次调用拥有,视图仅借用存储,释放由调用方负责。
lmmc_opt_workspace_t arena
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_SINGULAR_MATRIX
@ LMMC_STATUS_INVALID_ARGUMENT