LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
nonlinear.h 文件参考

标量非线性方程求根:二分法,Newton,割线法. 更多...

#include <stddef.h>
#include "lmmc/numeric.h"
#include "lmmc/diagnostic.h"
nonlinear.h 的引用(Include)关系图:
此图展示该文件被哪些文件直接或间接地引用了:

浏览该文件的源代码.

结构体

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 中定义.


结构体说明

◆ lmmc_nonlinear_result_t

struct lmmc_nonlinear_result_t

求根结果统计.

在文件 nonlinear.h 第 45 行定义.

lmmc_nonlinear_result_t 的协作图:
成员变量
int converged

是否收敛.

size_t num_iter

实际迭代次数.

lmmc_real_t root

估计的根.

lmmc_real_t function_value

在 root 处的 f(x) .

lmmc_real_t residual_norm

残差范数 |f(root)| .

lmmc_nonlinear_failure_t failure_reason

失败原因,未失败为 LMMC_NONLINEAR_FAILURE_NONE .

◆ lmmc_nonlinear_config_t

struct lmmc_nonlinear_config_t

求根算法配置.

在文件 nonlinear.h 第 57 行定义.

lmmc_nonlinear_config_t 的协作图:
成员变量
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

统一诊断出口.

类型定义说明

◆ lmmc_scalar_func_t

typedef lmmc_real_t(*) lmmc_scalar_func_t(lmmc_real_t x, void *user_data)

标量函数签名: \(f(x)\) .

参数
x自变量.
user_data用户上下文指针.
返回
\(f(x)\) 的值.

在文件 nonlinear.h 第 23 行定义.

◆ lmmc_scalar_dfunc_t

typedef lmmc_real_t(*) lmmc_scalar_dfunc_t(lmmc_real_t x, void *user_data)

标量函数导数签名: \(f'(x)\) ,与 lmmc_scalar_func_t 同形参.

在文件 nonlinear.h 第 28 行定义.

枚举类型说明

◆ 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 

Newton 法导数过小.

LMMC_NONLINEAR_FAILURE_NUMERICAL_ISSUE 4 

出现 NaN / Inf 等数值问题.

LMMC_NONLINEAR_FAILURE_SINGULAR_STEP 5 

步长退化为零或反向震荡.

在文件 nonlinear.h 第 33 行定义.

函数说明

◆ lmmc_nonlinear_failure_string()

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_nonlinear_default_config()

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_bisection_solve()

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求根结果统计.
返回
副作用
  • 无内存分配.多次调用 func.

在文件 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_newton_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求根结果统计.
返回
副作用
  • 无内存分配.多次调用 func(和 dfunc).

在文件 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_secant_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求根结果统计.
返回
同 lmmc_newton_solve.
副作用
  • 无内存分配.多次调用 func.

在文件 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().

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