LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expr_solving.cpp
浏览该文件的文档.
1#include "expr.hpp"
2
3#include <utility>
4#include <vector>
5
7
8namespace LMCAS {
9
11 const std::string& variable,
13 const SolveOptions& options) {
14 if (!equation) {
16 "equation cannot be null", "LMCAS.solve_set");
17 }
18 if (variable.empty()) {
20 "solve variable cannot be empty",
21 "LMCAS.solve_set");
22 }
23 return solve_equation(equation, variable, context, options);
24}
25
27 const std::string& variable,
28 const SolveOptions& options) {
30 return solve_set(equation, variable, context, options);
31}
32
34 const std::string& variable,
36 const SolveOptions& options) {
37 auto solved = solve_set(original, variable, context, options);
38 if (!solved) {
39 return ExprSetResult::failure(solved.error());
40 }
41
42 const auto& solution_set = solved.value();
43 if (std::holds_alternative<EmptySolutions>(solution_set)) {
44 return expr_set({});
45 }
46 const auto* finite = std::get_if<FiniteSolutions>(&solution_set);
47 if (!finite) {
48 return expr_set_failure(
50 "solution set is not a finite enumerable set<Expr>",
52 }
53
54 std::vector<ExprPtr> elements;
55 elements.reserve(finite->values.size());
56 for (const auto& solution : finite->values) {
57 if (!solution.conditions.empty()) {
59 "conditional finite solutions cannot be lowered to set<Expr>",
61 }
62 elements.push_back(solution.value);
63 }
64 return expr_set(std::move(elements));
65}
66
68 const std::string& variable,
70 const SolveOptions& options) {
72}
74 const std::string& variable,
75 const SolveOptions& options) {
77 return solve_expr_set(equation, variable, context, options);
78}
79
80ExprSetResult roots(const ExprPtr& expression,
81 const std::string& variable,
83 const SolveOptions& options) {
84 return project_finite_expr_set(expression, variable, context, options);
85}
86
87ExprSetResult roots(const ExprPtr& expression,
88 const std::string& variable,
89 const SolveOptions& options) {
91 return roots(expression, variable, context, options);
92}
93
94ExprSetResult solve(const ExprPtr& equation,
95 const std::string& variable,
97 const SolveOptions& options) {
98 return solve_expr_set(equation, variable, context, options);
99}
100
102 const std::string& variable,
103 const SolveOptions& options) {
105 return solve(equation, variable, context, options);
106}
107
108}
static Result failure(CasErrc code, std::string message, std::string operation={})
const std::string & variable
static ExprSetResult project_finite_expr_set(const ExprPtr &original, const std::string &variable, ComputationContext &context, const SolveOptions &options)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Result< SolutionSet > SolveResult
ExprSetResult expr_set(std::vector< ExprPtr > elements)
const std::string ComputationContext const SolveOptions & options
ExprSetResult solve_expr_set(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
LMCAS::SolveResult solve_equation(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
constexpr const char * kSolveExprSetOperation
std::shared_ptr< SymbolicExpr > ExprPtr
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
Result< ExprSet > ExprSetResult
SolveResult solve_set(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprSetResult solve(const ExprPtr &equation, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprSetResult expr_set_failure(CasErrc code, std::string message, const char *operation)
方程求解选项,控制数值求解行为和结果形式.