|
LMMC
Lamina Mathematic core
|
#include "optimize_internal.h"结构体 | |
| struct | lmmc_newton_workspace_t |
函数 | |
| lmmc_status_t | lmmc_nleq_newton (lmmc_opt_func_t F, lmmc_opt_jac_t J, void *user_data, lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, lmmc_optimize_result_t *out) |
| Newton 法求解非线性方程组 F(x) = 0。 | |
| struct lmmc_newton_workspace_t |
在文件 optimize_newton.c 第 3 行定义.
| 成员变量 | ||
|---|---|---|
| lmmc_opt_workspace_t | arena | |
| lmmc_vec_t | value | |
| lmmc_vec_t | delta | |
| lmmc_vec_t | rhs | |
| lmmc_mat_t | jacobian | |
| lmmc_mat_t | lu | |
| lmmc_status_t lmmc_nleq_newton | ( | lmmc_opt_func_t | F, |
| lmmc_opt_jac_t | J, | ||
| void * | user_data, | ||
| lmmc_vec_t * | x, | ||
| const lmmc_optimize_config_t * | cfg, | ||
| lmmc_optimize_result_t * | out ) |
Newton 法求解非线性方程组 F(x) = 0。
每步求解 J(x)δ = -F(x) 并通过 LU 分解;若 J 为 NULL,则使用 单边有限差分近似 Jacobian,默认步长大小为 sqrt(LMMC_REAL_EPSILON) * max(|x_j|, 1)。优先使用前向扰动; 当前向点不可表示时自动改用后向扰动,并使用实际可表示步长。 残差范数采用缩放平方和计算,避免有限大残差或小残差因直接平方而 溢出或下溢。
| [in] | F | 非线性函数回调。 |
| [in] | J | Jacobian 回调(可为 NULL,使用有限差分)。 |
| [in] | user_data | 传递给回调的用户数据。 |
| [in,out] | x | 初始猜测 / 输出解。 |
| [in] | cfg | 算法配置。 |
| [out] | out | 迭代结果。 |
检查每个迭代结果,包括最后一次允许的更新。
差分计算复用求解阶段暂时空闲的 delta 与 rhs 缓冲区。
在文件 optimize_newton.c 第 47 行定义.
引用了 lmmc_opt_workspace_t::allocation, lmmc_newton_workspace_t::arena, lmmc_newton_workspace_t::delta, lmmc_optimize_result_t::failure_reason, lmmc_optimize_result_t::final_residual, lmmc_newton_workspace_t::jacobian, lmmc_memory_free(), lmmc_nleq_newton(), LMMC_OPT_FAILURE_NONE, LMMC_OPT_FAILURE_NUMERICAL_ISSUE, lmmc_optimize_arguments_valid(), lmmc_optimize_emit(), lmmc_optimize_jacobian(), lmmc_optimize_norm(), lmmc_optimize_result_init(), lmmc_optimize_stop(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_optimize_result_t::num_iter, lmmc_newton_workspace_t::rhs, lmmc_vec_t::size , 以及 lmmc_newton_workspace_t::value.
被这些函数引用 lmmc_nleq_newton().