LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
differentiation_arithmetic.cpp
浏览该文件的文档.
1
#include "
internal/visitors/differentiation_visitor.hpp
"
2
3
namespace
LMCAS
{
4
5
void
DifferentiationVisitor::visit
(
const
NumberNode
&) {
6
set_result
(
SymbolicFactory::create_number
(BigInt(0)));
7
}
8
9
void
DifferentiationVisitor::visit
(
const
VariableNode
& node) {
10
if
(!node.is_constant() && node.name() ==
var
) {
11
set_result
(
SymbolicFactory::create_number
(BigInt(1)));
12
}
else
{
13
set_result
(
SymbolicFactory::create_number
(BigInt(0)));
14
}
15
}
16
17
void
DifferentiationVisitor::visit
(
const
AddNode
& node) {
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
}
26
set_result
(
SymbolicFactory::create_add
(std::move(diff_ops),
rewrite_budget
()));
27
}
28
29
void
DifferentiationVisitor::visit
(
const
MultiplyNode
& node) {
30
if
(node.operands().empty()) {
31
set_result
(
SymbolicFactory::create_number
(BigInt(0)));
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) {
39
rewrite_budget
()->
consume
();
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) {
52
rewrite_budget
()->
consume
();
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()) {
61
set_result
(
SymbolicFactory::create_number
(BigInt(0)));
62
}
else
{
63
set_result
(
SymbolicFactory::create_add
(std::move(sum_terms),
rewrite_budget
()));
64
}
65
}
66
67
void
DifferentiationVisitor::visit
(
const
PowerNode
& node) {
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
(
82
{n,
SymbolicFactory::create_number
(BigInt(-1))},
rewrite_budget
());
83
84
auto
u_pow =
LMCAS::detail::make_node<PowerNode>
(
u
, n_minus_1);
85
86
set_result
(
SymbolicFactory::create_multiply
({n, u_pow, du},
rewrite_budget
()));
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
93
auto
u_inv =
LMCAS::detail::make_node<PowerNode>
(
u
,
SymbolicFactory::create_number
(BigInt(-1)));
94
auto
t2 =
SymbolicFactory::create_multiply
({
v
, du, u_inv},
rewrite_budget
());
95
96
auto
sum =
SymbolicFactory::create_add
({t1, t2},
rewrite_budget
());
97
98
auto
u_pow_v =
LMCAS::detail::make_node<PowerNode>
(
u
,
v
);
99
set_result
(
SymbolicFactory::create_multiply
({u_pow_v, sum},
rewrite_budget
()));
100
}
101
}
102
103
}
LMCAS::AddNode
加法节点,表示多个操作数的求和。
定义
arithmetic.hpp:55
LMCAS::DifferentiationVisitor::result
std::shared_ptr< const SymbolicNode > result
求导结果节点。
定义
differentiation_visitor.hpp:22
LMCAS::DifferentiationVisitor::var
std::string var
定义
differentiation_visitor.hpp:13
LMCAS::DifferentiationVisitor::append_result
void append_result(std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
定义
differentiation_visitor.hpp:70
LMCAS::DifferentiationVisitor::visit
void visit(const NumberNode &) override
定义
differentiation_arithmetic.cpp:5
LMCAS::DifferentiationVisitor::set_result
void set_result(std::shared_ptr< const SymbolicNode > candidate)
定义
differentiation_visitor.hpp:66
LMCAS::FunctionNode::FuncType::Ln
@ Ln
定义
functions.hpp:16
LMCAS::MultiplyNode
乘法节点,表示多个操作数的乘积。
定义
arithmetic.hpp:134
LMCAS::NumberNode
定义
numbers.hpp:8
LMCAS::PowerNode
幂运算节点,表示 base^exponent。
定义
arithmetic.hpp:218
LMCAS::SymbolicFactory::create_add
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
定义
symbolic_factory.cpp:12
LMCAS::SymbolicFactory::create_multiply
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
定义
symbolic_factory.cpp:83
LMCAS::SymbolicFactory::create_number
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
定义
symbolic_factory.cpp:7
LMCAS::VariableNode
变量节点,表示一个符号变量。
定义
arithmetic.hpp:10
LMCAS::detail::RewriteBudget::consume
void consume()
定义
rewrite_budget.cpp:98
LMCAS::detail::RewriteBudget::append_size
std::size_t append_size(std::size_t current, std::size_t child)
定义
rewrite_budget.cpp:188
LMCAS::detail::SymbolicVisitor::rewrite_budget
RewriteBudget * rewrite_budget() const noexcept
定义
base.hpp:220
differentiation_visitor.hpp
微分访问器,对 AST 执行符号求导。
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS
定义
assumption.hpp:11
LMCAS::v
__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
定义
vector_calculus_surfaces.hpp:59
LMCAS::op
const ExprPtr RelationOp op
定义
expr.hpp:151
LMCAS::u
__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
定义
vector_calculus_surfaces.hpp:59
src
differentiation_arithmetic.cpp
生成于
, 为 LMCAS使用
1.18.0