LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
differentiation_arithmetic.cpp
浏览该文件的文档.
2
3namespace LMCAS {
4
8
10 if (!node.is_constant() && node.name() == var) {
12 } else {
14 }
15}
16
18 std::vector<std::shared_ptr<const SymbolicNode>> diff_ops;
19 std::size_t size = 1;
20 rewrite_budget()->append_size(size, node.operands().size());
21 diff_ops.reserve(node.operands().size());
22 for (const auto& op : node.operands()) {
23 op->accept(*this);
24 append_result(diff_ops, size, result);
25 }
27}
28
30 if (node.operands().empty()) {
32 return;
33 }
34
35 std::vector<std::shared_ptr<const SymbolicNode>> sum_terms;
36 std::size_t sum_size = 1;
37
38 for (size_t i = 0; i < node.operands().size(); ++i) {
40
41 node.operands()[i]->accept(*this);
42 auto d_term = result;
43
44 if (d_term->is_zero()) continue;
45
46 std::vector<std::shared_ptr<const SymbolicNode>> prod_terms;
47 std::size_t product_size = 1;
48 rewrite_budget()->append_size(product_size, node.operands().size());
49 prod_terms.reserve(node.operands().size());
50
51 for (size_t j = 0; j < node.operands().size(); ++j) {
53 append_result(prod_terms, product_size,
54 i == j ? d_term : node.operands()[j]);
55 }
56 append_result(sum_terms, sum_size,
57 SymbolicFactory::create_multiply(std::move(prod_terms), rewrite_budget()));
58 }
59
60 if (sum_terms.empty()) {
62 } else {
64 }
65}
66
68
69 node.base()->accept(*this);
70 auto du = result;
71 node.exponent()->accept(*this);
72 auto dv = result;
73
74 auto u = node.base();
75 auto v = node.exponent();
76
77 if (dv->is_zero()) {
78
79 auto n = v;
80
81 auto n_minus_1 = SymbolicFactory::create_add(
83
84 auto u_pow = LMCAS::detail::make_node<PowerNode>(u, n_minus_1);
85
87 } else {
88
89 auto ln_u = LMCAS::detail::make_node<FunctionNode>(FunctionNode::FuncType::Ln, std::vector<std::shared_ptr<const SymbolicNode>>{u});
90
91 auto t1 = SymbolicFactory::create_multiply({dv, ln_u}, rewrite_budget());
92
94 auto t2 = SymbolicFactory::create_multiply({v, du, u_inv}, rewrite_budget());
95
96 auto sum = SymbolicFactory::create_add({t1, t2}, rewrite_budget());
97
100 }
101}
102
103}
加法节点,表示多个操作数的求和。
std::shared_ptr< const SymbolicNode > result
求导结果节点。
void append_result(std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
void visit(const NumberNode &) override
void set_result(std::shared_ptr< const SymbolicNode > candidate)
乘法节点,表示多个操作数的乘积。
幂运算节点,表示 base^exponent。
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
变量节点,表示一个符号变量。
std::size_t append_size(std::size_t current, std::size_t child)
RewriteBudget * rewrite_budget() const noexcept
微分访问器,对 AST 执行符号求导。
std::shared_ptr< const Node > make_node(Args &&... args)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
const ExprPtr RelationOp op
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u