LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
symbolic_calculus_adapter.cpp
浏览该文件的文档.
3
4namespace LMCAS {
5
6std::shared_ptr<SymbolicExpr> SymbolicExpr::series(
7 const std::string& variable,
8 const std::shared_ptr<SymbolicExpr>& point,
9 int order,
10 const LMCAS::AssumptionContext*) const {
12 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
13 (context).limits().max_ast_nodes, "transform");
14 if (!impl_->root || !point) return nullptr;
15 if (order < 0) return nullptr;
16
17 auto variable_expr = SymbolicExpr::variable(variable);
18 auto delta = SymbolicExpr::add(
19 variable_expr,
20 SymbolicExpr::multiply(SymbolicExpr::number(-1), point));
21 std::vector<std::shared_ptr<const SymbolicNode>> terms;
22 auto derivative = LMCAS::detail::make_expression_ptr(impl_->root->clone());
23
24 for (int n = 0;; ++n) {
25 if (n > 0) {
26 derivative = detail::make_expression_ptr(detail::differentiate_node(detail::node(derivative), variable, transform_budget));
27 if (!derivative) return nullptr;
28 derivative = detail::make_expression_ptr(detail::normalize_node(detail::node(derivative), transform_budget));
29 }
30
31 auto coefficient = detail::make_expression_ptr(detail::substitute_node(detail::node(derivative), variable, detail::node(point), transform_budget));
32 if (!coefficient) return nullptr;
33 coefficient = detail::make_expression_ptr(detail::normalize_node(detail::node(coefficient), transform_budget));
34
35 auto term = coefficient;
36 if (n > 0) {
37 term = SymbolicExpr::multiply(
38 term,
39 SymbolicExpr::power(delta, SymbolicExpr::number(n)));
40 }
41 if (n > 1) {
42 auto factorial = BigInt::factorial(BigInt(n));
43 term = SymbolicExpr::multiply(
44 term,
45 SymbolicExpr::number(Rational(BigInt(1), factorial)));
46 }
47 terms.push_back(LMCAS::detail::node(term));
48 if (n == order) break;
49 }
50
51 if (terms.empty()) return SymbolicExpr::number(0);
53}
54
55std::shared_ptr<SymbolicExpr> SymbolicExpr::make_limit(
56 const std::shared_ptr<SymbolicExpr>& expression,
57 const std::string& variable,
58 const std::shared_ptr<SymbolicExpr>& point) {
59 if (!expression || !point) return nullptr;
62 LMCAS::detail::node(expression), variable,
64}
65
66} // namespace LMCAS
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::shared_ptr< const Node > make_node(Args &&... args)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::string const LimitExprPtr & point
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::vector< FGLMPoly > const MonomialOrder & order
@ Rational
Rational numbers
内部 AST 定义。