|
LMMC
Lamina Mathematic core
|
标量非线性方程求根:二分法,Newton,割线法. 更多...
结构体 | |
| struct | lmmc_nonlinear_result_t |
| 求根结果统计. 更多... | |
| struct | lmmc_nonlinear_config_t |
| 求根算法配置. 更多... | |
类型定义 | |
| typedef lmmc_real_t(*) | lmmc_scalar_func_t(lmmc_real_t x, void *user_data) |
| 标量函数签名: \(f(x)\) . | |
| typedef lmmc_real_t(*) | lmmc_scalar_dfunc_t(lmmc_real_t x, void *user_data) |
| 标量函数导数签名: \(f'(x)\) ,与 lmmc_scalar_func_t 同形参. | |
枚举 | |
| enum | lmmc_nonlinear_failure_t { LMMC_NONLINEAR_FAILURE_NONE = 0 , LMMC_NONLINEAR_FAILURE_INVALID_BRACKET = 1 , LMMC_NONLINEAR_FAILURE_MAX_ITER = 2 , LMMC_NONLINEAR_FAILURE_ZERO_DERIVATIVE = 3 , LMMC_NONLINEAR_FAILURE_NUMERICAL_ISSUE = 4 , LMMC_NONLINEAR_FAILURE_SINGULAR_STEP = 5 } |
| 求根失败原因. 更多... | |
函数 | |
| const char * | lmmc_nonlinear_failure_string (lmmc_nonlinear_failure_t reason) |
| 获取失败原因对应的可读字符串. | |
| lmmc_status_t | lmmc_nonlinear_default_config (lmmc_nonlinear_config_t *out_cfg) |
| 生成默认配置. | |
| lmmc_status_t | lmmc_bisection_solve (lmmc_scalar_func_t func, void *user_data, lmmc_real_t left, lmmc_real_t right, const lmmc_nonlinear_config_t *cfg, lmmc_nonlinear_result_t *out_result) |
| 二分法求根. | |
| lmmc_status_t | lmmc_newton_solve (lmmc_scalar_func_t func, lmmc_scalar_dfunc_t dfunc, void *user_data, lmmc_real_t x0, const lmmc_nonlinear_config_t *cfg, lmmc_nonlinear_result_t *out_result) |
| Newton 法求根. | |
| lmmc_status_t | lmmc_secant_solve (lmmc_scalar_func_t func, void *user_data, lmmc_real_t x0, lmmc_real_t x1, const lmmc_nonlinear_config_t *cfg, lmmc_nonlinear_result_t *out_result) |
| 割线法求根. | |
标量非线性方程求根:二分法,Newton,割线法.
在文件 nonlinear.h 中定义.
| struct lmmc_nonlinear_result_t |
求根结果统计.
在文件 nonlinear.h 第 45 行定义.
| 成员变量 | ||
|---|---|---|
| int | converged |
是否收敛. |
| size_t | num_iter |
实际迭代次数. |
| lmmc_real_t | root |
估计的根. |
| lmmc_real_t | function_value |
在 |
| lmmc_real_t | residual_norm |
残差范数 |f(root)| . |
| lmmc_nonlinear_failure_t | failure_reason |
失败原因,未失败为 LMMC_NONLINEAR_FAILURE_NONE . |
| struct lmmc_nonlinear_config_t |
求根算法配置.
在文件 nonlinear.h 第 57 行定义.
| 成员变量 | ||
|---|---|---|
| lmmc_real_t | abs_tol |
残差绝对容差. |
| lmmc_real_t | rel_tol |
步长相对容差. |
| size_t | max_iter |
最大迭代次数. |
| lmmc_real_t | derivative_step |
Newton 自动差分的相对扰动步长. |
| lmmc_real_t | min_derivative |
Newton 法允许的最小导数绝对值. |
| lmmc_real_t | min_step |
维持迭代稳定性的步长下限. |
| lmmc_diagnostic_sink_t | diagnostics |
统一诊断出口. |
| typedef lmmc_real_t(*) lmmc_scalar_func_t(lmmc_real_t x, void *user_data) |
| typedef lmmc_real_t(*) lmmc_scalar_dfunc_t(lmmc_real_t x, void *user_data) |
标量函数导数签名: \(f'(x)\) ,与 lmmc_scalar_func_t 同形参.
在文件 nonlinear.h 第 28 行定义.
求根失败原因.
在文件 nonlinear.h 第 33 行定义.
| const char * lmmc_nonlinear_failure_string | ( | lmmc_nonlinear_failure_t | reason | ) |
获取失败原因对应的可读字符串.
在文件 nonlinear.c 第 111 行定义.
引用了 LMMC_NONLINEAR_FAILURE_INVALID_BRACKET, LMMC_NONLINEAR_FAILURE_MAX_ITER, LMMC_NONLINEAR_FAILURE_NONE, LMMC_NONLINEAR_FAILURE_NUMERICAL_ISSUE, LMMC_NONLINEAR_FAILURE_SINGULAR_STEP, lmmc_nonlinear_failure_string() , 以及 LMMC_NONLINEAR_FAILURE_ZERO_DERIVATIVE.
被这些函数引用 lmmc_nonlinear_failure_string().
| lmmc_status_t lmmc_nonlinear_default_config | ( | lmmc_nonlinear_config_t * | out_cfg | ) |
生成默认配置.
在文件 nonlinear.c 第 130 行定义.
引用了 lmmc_nonlinear_config_t::abs_tol, lmmc_nonlinear_config_t::derivative_step, lmmc_nonlinear_config_t::diagnostics, LMMC_DEFAULT_ABS_TOL, LMMC_DEFAULT_REL_TOL, lmmc_nonlinear_default_config(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_nonlinear_config_t::max_iter, lmmc_nonlinear_config_t::min_derivative, lmmc_nonlinear_config_t::min_step , 以及 lmmc_nonlinear_config_t::rel_tol.
被这些函数引用 lmmc_nonlinear_default_config() , 以及 lmmc_nonlinear_load_and_validate_config().
| lmmc_status_t lmmc_bisection_solve | ( | lmmc_scalar_func_t | func, |
| void * | user_data, | ||
| lmmc_real_t | left, | ||
| lmmc_real_t | right, | ||
| const lmmc_nonlinear_config_t * | cfg, | ||
| lmmc_nonlinear_result_t * | out_result ) |
二分法求根.
要求 f(left)*f(right) < 0(或端点本身为根)。中点与半区间宽度按 端点符号选择等价公式,不形成可能溢出的 left+right 或 right-left。收敛判据为 |f(mid)| <= abs_tol 或半区间宽度 <= x_tol。
| [in] | func | 标量函数 f(x). |
| [in] | user_data | 传递给 func 的用户上下文. |
| [in] | left | 区间左端点,要求 left < right. |
| [in] | right | 区间右端点. |
| [in] | cfg | 配置参数,可为 NULL(使用默认值). |
| [out] | out_result | 求根结果统计. |
在文件 nonlinear_bisection.c 第 126 行定义.
引用了 lmmc_nonlinear_result_t::converged, lmmc_nonlinear_result_t::failure_reason, bisection_state_t::func, bisection_state_t::iter, bisection_state_t::left, lmmc_bisection_solve(), LMMC_NONLINEAR_FAILURE_MAX_ITER, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, bisection_state_t::local_cfg, lmmc_nonlinear_config_t::max_iter, bisection_state_t::out_result, bisection_state_t::right , 以及 bisection_state_t::user_data.
被这些函数引用 lmmc_bisection_solve().
| lmmc_status_t lmmc_newton_solve | ( | lmmc_scalar_func_t | func, |
| lmmc_scalar_dfunc_t | dfunc, | ||
| void * | user_data, | ||
| lmmc_real_t | x0, | ||
| const lmmc_nonlinear_config_t * | cfg, | ||
| lmmc_nonlinear_result_t * | out_result ) |
Newton 法求根.
若 dfunc 为 NULL,使用中心差分自动计算导数。解析导数与数值导数均按 min_derivative 判定是否可用,该阈值不随 x 的绝对量级隐式变化。 收敛判据为 |f(x)| <= abs_tol 或 |x_{k+1}-x_k| <= x_tol。
| [in] | func | 标量函数 f(x). |
| [in] | dfunc | 解析导数 f'(x),可为 NULL(自动差分). |
| [in] | user_data | 传递给 func/dfunc 的用户上下文. |
| [in] | x0 | 初始猜测. |
| [in] | cfg | 配置参数,可为 NULL. |
| [out] | out_result | 求根结果统计. |
在文件 nonlinear_newton.c 第 126 行定义.
引用了 lmmc_nonlinear_config_t::abs_tol, lmmc_nonlinear_result_t::converged, newton_state_t::dfunc, lmmc_nonlinear_result_t::failure_reason, newton_state_t::func, lmmc_nonlinear_result_t::function_value, newton_state_t::fx, newton_state_t::iter, lmmc_newton_solve(), lmmc_nonlinear_do_log(), LMMC_NONLINEAR_FAILURE_MAX_ITER, LMMC_NONLINEAR_FAILURE_NONE, LMMC_NONLINEAR_FAILURE_NUMERICAL_ISSUE, lmmc_nonlinear_load_and_validate_config(), lmmc_nonlinear_reset_result(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, newton_state_t::local_cfg, lmmc_nonlinear_config_t::max_iter, newton_state_t::out_result, lmmc_nonlinear_result_t::residual_norm, lmmc_nonlinear_result_t::root, newton_state_t::user_data , 以及 newton_state_t::x.
被这些函数引用 lmmc_newton_solve().
| lmmc_status_t lmmc_secant_solve | ( | lmmc_scalar_func_t | func, |
| void * | user_data, | ||
| lmmc_real_t | x0, | ||
| lmmc_real_t | x1, | ||
| const lmmc_nonlinear_config_t * | cfg, | ||
| lmmc_nonlinear_result_t * | out_result ) |
割线法求根.
仅需函数值,不需要导数。使用两个初始点 x0 != x1 逼近;函数值先按 相邻值的最大绝对值缩放,异号函数值使用凸组合计算截距,因此函数值差、 初始点差均不必在原始量级上可表示。非零常数缩放 f 不改变判定。 收敛判据同 Newton 法。
| [in] | func | 标量函数 f(x). |
| [in] | user_data | 传递给 func 的用户上下文. |
| [in] | x0 | 第一个初始点. |
| [in] | x1 | 第二个初始点,须 x0 != x1. |
| [in] | cfg | 配置参数,可为 NULL. |
| [out] | out_result | 求根结果统计. |
在文件 nonlinear_secant.c 第 106 行定义.
引用了 lmmc_nonlinear_config_t::abs_tol, lmmc_nonlinear_result_t::converged, secant_state_t::f0, secant_state_t::f1, lmmc_nonlinear_result_t::failure_reason, secant_state_t::func, lmmc_nonlinear_result_t::function_value, secant_state_t::iter, lmmc_nonlinear_do_log(), LMMC_NONLINEAR_FAILURE_MAX_ITER, LMMC_NONLINEAR_FAILURE_NONE, LMMC_NONLINEAR_FAILURE_NUMERICAL_ISSUE, lmmc_nonlinear_load_and_validate_config(), lmmc_nonlinear_reset_result(), lmmc_secant_solve(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, secant_state_t::local_cfg, lmmc_nonlinear_config_t::max_iter, secant_state_t::out_result, lmmc_nonlinear_result_t::residual_norm, lmmc_nonlinear_result_t::root, secant_state_t::user_data, secant_state_t::x0 , 以及 secant_state_t::x1.
被这些函数引用 lmmc_secant_solve().