LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solve_mixed_transcendental.hpp
浏览该文件的文档.
1/**
2 * @file solve_mixed_transcendental.hpp
3 * @brief 混合超越方程求解:符号预处理 + 自适应根隔离 + Newton-Raphson 精化.
4 *
5 * 本模块处理同时包含超越函数(sin,cos,tan,exp,ln)和代数项的方程.
6 * 求解流程:
7 * 1. 通过 factor_transcendental 执行符号分解;
8 * 2. 对整体因子执行自适应根隔离(符号变化检测与单调性确认);
9 * 3. 使用带区间约束的 Newton-Raphson 精化隔离根,并以二分法完成稳定收敛路径.
10 */
11#pragma once
12
13#include "symbolic.hpp"
14#include "solve_strategies.hpp"
16
17#include <memory>
18#include <vector>
19#include <optional>
20#include <string>
21
22namespace LMCAS {
23
24/// 搜索区间
26 lmmc_real_t lo; ///< 下界
27 lmmc_real_t hi; ///< 上界
28};
29
30/// 隔离子区间,包含至多一个根
32 lmmc_real_t lo; ///< 子区间下界
33 lmmc_real_t hi; ///< 子区间上界
34 bool confirmed; ///< 若导数单调性确认恰含一个根则为 true
35};
36
37/**
38 * @brief 受检混合超越方程求解结果.
39 *
40 * `Complete` 表示给定有界区间内的全部求解路径均已穷尽;
41 * `Inconclusive` 可携带已经通过区间与残差验证的候选根。恒零方程和
42 * 仅依赖未绑定参数的方程也返回 `Inconclusive`,因为有限向量无法表示其解集。
43 */
46
47/**
48 * @brief 在调用方计算上下文中执行混合超越方程求解.
49 *
50 * @param[in] expr 待求解表达式(视为 = 0)
51 * @param[in] var 求解变量名
52 * @param[in] opts 求解选项
53 * @param[in] context 计算预算与取消状态
54 * @return 受检的完整或未决结果
55 */
57 const std::shared_ptr<SymbolicExpr>& expr,
58 const std::string& var,
59 const SolveOptions& opts,
61
62/**
63 * @brief 使用默认计算上下文执行受检混合超越方程求解.
64 */
66 const std::shared_ptr<SymbolicExpr>& expr,
67 const std::string& var,
68 const SolveOptions& opts);
69
70/**
71 * @brief 判断表达式是否包含依赖指定变量的超越函数.
72 *
73 * 遍历 AST,检测 sin/cos/tan/exp/ln 节点的参数是否依赖 var.
74 * 若超越函数的参数不含 var(即为常数),则不计入.
75 *
76 * @param[in] expr 待检测的符号表达式
77 * @param[in] var 目标变量名
78 * @return 包含依赖 var 的超越函数时返回 true,否则返回 false
79 */
81 const std::shared_ptr<SymbolicExpr>& expr,
82 const std::string& var);
83
84/**
85 * @brief 判断换元结果是否为关于换元变量的多项式.
86 *
87 * 检查 detect_trans_substitutions 的输出:若映射为空或换元后表达式
88 * 仍非多项式形式,则返回 false.
89 *
90 * @param[in] sub_result 换元分析结果
91 * @return 换元后为多项式时返回 true,否则返回 false
92 */
94 const TransSubstitutionResult& sub_result);
95
96/**
97 * @brief 确定搜索区间:用户指定 > 周期扩展 > 默认 [-10, 10].
98 *
99 * 优先级:
100 * 1. 若 opts.has_search_interval 为 true,使用 [search_lo, search_hi];
101 * 2. 若表达式含周期函数(sin/cos/tan)且参数为 k*x+c 形式,
102 * 扩展默认区间覆盖至少两个完整周期,上限 [-100, 100];
103 * 3. 否则使用默认区间 [-10, 10].
104 *
105 * @param[in] expr 表达式
106 * @param[in] var 变量名
107 * @param[in] opts 求解选项
108 * @return 有效搜索区间;区间无效(lo >= hi 或宽度 <= tolerance)时返回 nullopt
109 */
110LMCAS_API std::optional<SearchInterval> determine_search_interval(
111 const std::shared_ptr<SymbolicExpr>& expr,
112 const std::string& var,
113 const SolveOptions& opts);
114
115/**
116 * @brief 自适应根隔离:将搜索区间划分为含至多一个根的子区间.
117 *
118 * 通过递归二分检测符号变化,定位根所在子区间.当导数可用时,
119 * 利用导数符号确认子区间内的单调性(即恰含一个根).
120 *
121 * 特殊处理:
122 * - 子区间宽度 < 1e-6 时停止细分;
123 * - 采样点产生 NaN/Inf 时跳过并缩小区间重新采样;
124 * - 超过 max_roots 限制时截断返回.
125 *
126 * @param[in] expr 表达式
127 * @param[in] derivative 表达式的导数(可为 nullptr,跳过单调性确认)
128 * @param[in] var 变量名
129 * @param[in] interval 搜索区间
130 * @param[in] opts 求解选项(max_roots,tolerance)
131 * @return 隔离子区间列表
132 */
133LMCAS_API std::vector<IsolatedInterval> isolate_roots(
134 const std::shared_ptr<SymbolicExpr>& expr,
135 const std::shared_ptr<SymbolicExpr>& derivative,
136 const std::string& var,
138 const SolveOptions& opts);
139
140/**
141 * @brief 去重并排序数值根.
142 *
143 * 对候选根进行两两比较,差值小于 10 * tolerance 的视为重复,
144 * 保留残差较小者.去重后按升序排列,并应用 max_roots 限制.
145 *
146 * @param[in,out] roots 候选根列表(会被排序修改)
147 * @param[in] tolerance 去重容差(实际阈值为 10 * tolerance)
148 * @param[in] max_roots 最大返回根数(-1 表示不限制)
149 * @return 去重,排序后的根值列表
150 */
151LMCAS_API std::vector<lmmc_real_t> deduplicate_roots(
152 std::vector<NumericRoot>& roots,
153 lmmc_real_t tolerance,
154 int max_roots);
155
156/**
157 * @brief 对隔离区间执行根精化,返回高精度数值根.
158 *
159 * 使用带区间约束的 Newton-Raphson 迭代精化根,导数不可用时回退到纯二分法.
160 * 收敛条件为 |f(x)| < tolerance,达到最大迭代次数后返回残差最小的结果
161 * (仅当残差 < tolerance),否则返回 nullopt.
162 *
163 * @param[in] expr 待求解表达式
164 * @param[in] derivative 表达式的导数(可为 nullptr,此时使用纯二分法)
165 * @param[in] var 求解变量名
166 * @param[in] interval 隔离子区间
167 * @param[in] opts 求解选项(tolerance, max_newton_iterations)
168 * @return 精化后的数值根;未收敛或残差超限时返回 nullopt
169 */
170LMCAS_API std::optional<NumericRoot> refine_root(
171 const std::shared_ptr<SymbolicExpr>& expr,
172 const std::shared_ptr<SymbolicExpr>& derivative,
173 const std::string& var,
175 const SolveOptions& opts);
176
177} // namespace LMCAS
#define LMCAS_API
Result< MathResult< std::vector< std::shared_ptr< SymbolicExpr > > > > MixedTranscendentalResult
受检混合超越方程求解结果.
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
bool confirmed
若导数单调性确认恰含一个根则为 true
std::vector< lmmc_real_t > deduplicate_roots(std::vector< NumericRoot > &roots, lmmc_real_t tolerance, int max_roots)
std::optional< SearchInterval > determine_search_interval(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
std::vector< IsolatedInterval > isolate_roots(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts)
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
__attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) bool contains_transcendental_of_var(const std bool is_polynomial_after_substitution(const TransSubstitutionResult &sub_result)
在调用方计算上下文中执行混合超越方程求解.
MixedTranscendentalResult solve_mixed_transcendental_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts, ComputationContext &context)
std::optional< NumericRoot > refine_root(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const IsolatedInterval &interval, const SolveOptions &opts)
bool contains_transcendental_of_var(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
隔离子区间,包含至多一个根
方程求解选项,控制数值求解行为和结果形式.
方程求解策略调度器 solve_dispatch 及相关选项结构体.
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.
混合超越方程不可约因式分解器公共 API.