LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
mixed_transcendental_numeric.cpp
浏览该文件的文档.
3#include <new>
4#include <stdexcept>
5
6namespace LMCAS::detail {
7
8/**
9 * @internal
10 * @brief 隔离并精化单个因子的数值根。
11 *
12 * 计算导数后用 isolate_roots 隔离根,再用 refine_root 逐根精化。
13 *
14 * @param[in] factor 待求解因子表达式
15 * @param[in] var 变量名
16 * @param[in] interval 搜索区间
17 * @param[in] opts 求解选项
18 * @return 精化后的数值根列表
19 */
21 const std::shared_ptr<SymbolicExpr>& factor,
22 const std::string& var,
24 const SolveOptions& opts,
26 bool& complete)
27{
28 std::vector<NumericRoot> roots;
29 std::shared_ptr<SymbolicExpr> derivative;
30 try {
31 if (factor && LMCAS::detail::node(factor)) {
32 derivative = make_expression_ptr(
33 differentiate_node(node(factor), var, budget));
34 }
35 } catch (const CasError& error) {
36 if (error.code != CasErrc::UnsupportedExpression) throw;
37 complete = false;
38 }
39 complete = false;
40 std::optional<CasError> failure;
41 auto intervals = isolate_roots_with_context(
42 factor, derivative, var, interval, opts,
43 budget, &failure, &complete);
44 if (failure) {
45 return Result<std::vector<NumericRoot>>::failure(*failure);
46 }
47
48 for (const auto& isolated : intervals) {
49 auto refined = refine_root_with_context(
50 factor, derivative, var, isolated, opts,
51 budget, &failure, &complete);
52 if (failure) {
53 return Result<std::vector<NumericRoot>>::failure(*failure);
54 }
55 if (refined) {
56 roots.push_back(*refined);
57 }
58 }
59 return Result<std::vector<NumericRoot>>::success(std::move(roots));
60}
61
62}
多元 Hensel 提升(单变量步)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::optional< NumericRoot > refine_root_with_context(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const IsolatedInterval &interval, const SolveOptions &opts, RewriteBudget &budget, std::optional< CasError > *failure, bool *complete)
Result< std::vector< NumericRoot > > mixed_numerical_path(const std::shared_ptr< SymbolicExpr > &factor, const std::string &var, const SearchInterval &interval, const SolveOptions &opts, RewriteBudget &budget, bool &complete)
隔离并精化单个因子的数值根。
std::vector< IsolatedInterval > isolate_roots_with_context(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts, RewriteBudget &budget, std::optional< CasError > *failure, bool *complete)
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
方程求解选项,控制数值求解行为和结果形式.