LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
integration_table_composite.cpp
浏览该文件的文档.
1
#include "
internal/integration_table_rules.hpp
"
2
3
namespace
LMCAS::integration_table_detail
{
4
5
void
load_logarithmic_rules
(std::vector<detail::IntegrationEntry>& table) {
6
{
7
auto
u
=
wildcard
(
"_u"
);
8
auto
pat = *SymbolicExpr::ln(
detail::make_expression_ptr
(
u
));
9
auto
x_ln_x = SymbolicExpr::multiply(
detail::make_expression_ptr
(
u
), SymbolicExpr::ln(
detail::make_expression_ptr
(
u
)));
10
auto
res = *
sym_sub
(*x_ln_x,
u
);
11
table.push_back(
detail::IntegrationEntry
(
"ln(x)"
, pat, res, {
"_u"
},
u_is_var
(
"_u"
), 60));
12
}
13
{
14
auto
u
=
wildcard
(
"_u"
);
15
auto
inv_u = SymbolicExpr::power(
detail::make_expression_ptr
(
u
), SymbolicExpr::number(-1));
16
auto
pat = *SymbolicExpr::multiply(SymbolicExpr::ln(
detail::make_expression_ptr
(
u
)), inv_u);
17
auto
ln_sq = SymbolicExpr::power(SymbolicExpr::ln(
detail::make_expression_ptr
(
u
)), SymbolicExpr::number(2));
18
auto
res = *SymbolicExpr::multiply(ln_sq,
sym_rational
(1, 2));
19
table.push_back(
detail::IntegrationEntry
(
"ln(x)/x"
, pat, res, {
"_u"
},
u_is_var
(
"_u"
), 50));
20
}
21
}
22
23
void
load_exponential_base_rules
(std::vector<detail::IntegrationEntry>& table) {
24
{
25
auto
a
=
wildcard
(
"_a"
);
26
auto
u
=
wildcard
(
"_u"
);
27
auto
pat = *SymbolicExpr::power(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
));
28
auto
inv_ln_a = SymbolicExpr::power(SymbolicExpr::ln(
detail::make_expression_ptr
(
a
)), SymbolicExpr::number(-1));
29
auto
a_pow_u = SymbolicExpr::power(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
));
30
auto
res = *SymbolicExpr::multiply(a_pow_u, inv_ln_a);
31
table.push_back(
detail::IntegrationEntry
(
"a^x"
, pat, res, {
"_a"
,
"_u"
},
32
[](
const
MatchMap
& m,
const
std::string& var,
ComputationContext
&
context
) {
33
if
(!
u_is_var_a_indep
(
"_u"
,
"_a"
)(m, var,
context
)) {
return
false
; }
34
std::optional<detail::AssumptionFacts> assumptions;
35
if
(
context
.assumptions()) { assumptions.emplace(*
context
.assumptions()); }
36
const
FactsQuery
& facts = assumptions ?
37
static_cast<
const
FactsQuery
&
>
(*assumptions) :
detail::no_facts
();
38
auto
logarithm = SymbolicExpr::ln(
detail::make_expression_ptr
(m.at(
"_a"
)));
39
return
normalization_proved
(
detail::query_definedness
(
40
detail::node
(logarithm), facts,
Domain::Real
,
context
)) &&
41
normalization_proved
(
detail::query_nonzero_value
(
42
detail::node
(logarithm), facts,
Domain::Real
,
context
));
43
}, 70));
44
}
45
}
46
47
void
load_scaled_radical_rules
(std::vector<detail::IntegrationEntry>& table) {
48
{
49
auto
u
=
wildcard
(
"_u"
);
50
auto
a
=
wildcard
(
"_a"
);
51
auto
a_sq = SymbolicExpr::power(
detail::make_expression_ptr
(
a
), SymbolicExpr::number(2));
52
auto
u_sq = SymbolicExpr::power(
detail::make_expression_ptr
(
u
), SymbolicExpr::number(2));
53
auto
neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
54
auto
a_sq_minus_u_sq = SymbolicExpr::add(a_sq, neg_u_sq);
55
auto
pat = *SymbolicExpr::power(SymbolicExpr::sqrt(a_sq_minus_u_sq), SymbolicExpr::number(-1));
56
57
auto
u_over_a = SymbolicExpr::multiply(
detail::make_expression_ptr
(
u
),
58
SymbolicExpr::power(
make_unary_function
(FT::Abs,
detail::make_expression_ptr
(
a
)),
59
SymbolicExpr::number(-1)));
60
auto
res = *
make_unary_function
(FT::ArcSin, u_over_a);
61
table.push_back(
detail::IntegrationEntry
(
"1/sqrt(a^2-x^2)"
, pat, res, {
"_u"
,
"_a"
},
62
u_is_var_a_nonzero
(
"_u"
,
"_a"
,
true
), 50));
63
}
64
}
65
66
void
load_scaled_trig_rules
(std::vector<detail::IntegrationEntry>& table) {
67
{
68
auto
a
=
wildcard
(
"_a"
);
69
auto
u
=
wildcard
(
"_u"
);
70
auto
pat = *SymbolicExpr::sin(SymbolicExpr::multiply(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
)));
71
auto
inv_a = SymbolicExpr::power(
detail::make_expression_ptr
(
a
), SymbolicExpr::number(-1));
72
auto
neg_inv_a = SymbolicExpr::multiply(SymbolicExpr::number(-1), inv_a);
73
auto
cos_ax = SymbolicExpr::cos(SymbolicExpr::multiply(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
)));
74
auto
res = *SymbolicExpr::multiply(neg_inv_a, cos_ax);
75
table.push_back(
detail::IntegrationEntry
(
"sin(a*x)"
, pat, res, {
"_a"
,
"_u"
},
76
u_is_var_a_nonzero
(
"_u"
,
"_a"
), 55));
77
}
78
{
79
auto
a
=
wildcard
(
"_a"
);
80
auto
u
=
wildcard
(
"_u"
);
81
auto
pat = *SymbolicExpr::cos(SymbolicExpr::multiply(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
)));
82
auto
inv_a = SymbolicExpr::power(
detail::make_expression_ptr
(
a
), SymbolicExpr::number(-1));
83
auto
sin_ax = SymbolicExpr::sin(SymbolicExpr::multiply(
detail::make_expression_ptr
(
a
),
detail::make_expression_ptr
(
u
)));
84
auto
res = *SymbolicExpr::multiply(inv_a, sin_ax);
85
table.push_back(
detail::IntegrationEntry
(
"cos(a*x)"
, pat, res, {
"_a"
,
"_u"
},
86
u_is_var_a_nonzero
(
"_u"
,
"_a"
), 55));
87
}
88
{
89
auto
u
=
wildcard
(
"_u"
);
90
auto
u_sq = SymbolicExpr::power(
detail::make_expression_ptr
(
u
), SymbolicExpr::number(2));
91
auto
pat = *SymbolicExpr::multiply(
detail::make_expression_ptr
(
u
), SymbolicExpr::cos(u_sq));
92
93
auto
u_sq_r = SymbolicExpr::power(
detail::make_expression_ptr
(
u
), SymbolicExpr::number(2));
94
auto
res = *SymbolicExpr::multiply(
sym_rational
(1, 2), SymbolicExpr::sin(u_sq_r));
95
table.push_back(
detail::IntegrationEntry
(
"x*cos(x^2)"
, pat, res, {
"_u"
},
u_is_var
(
"_u"
), 35));
96
}
97
}
98
99
void
load_exponential_trig_rules
(std::vector<detail::IntegrationEntry>& table) {
100
{
101
auto
u
=
wildcard
(
"_u"
);
102
auto
pat = *SymbolicExpr::multiply(
103
SymbolicExpr::exp(
detail::make_expression_ptr
(
u
)),
104
SymbolicExpr::sin(
detail::make_expression_ptr
(
u
)));
105
106
auto
sin_u = SymbolicExpr::sin(
detail::make_expression_ptr
(
u
));
107
auto
neg_cos_u = SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::cos(
detail::make_expression_ptr
(
u
)));
108
auto
sin_minus_cos = SymbolicExpr::add(sin_u, neg_cos_u);
109
auto
exp_u = SymbolicExpr::exp(
detail::make_expression_ptr
(
u
));
110
auto
res = *SymbolicExpr::multiply(
111
sym_rational
(1, 2),
112
SymbolicExpr::multiply(exp_u, sin_minus_cos));
113
table.push_back(
detail::IntegrationEntry
(
"exp(x)*sin(x)"
, pat, res, {
"_u"
},
u_is_var
(
"_u"
), 35));
114
}
115
}
116
117
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::FactsQuery
定义
facts_query.hpp:16
integration_table_rules.hpp
LMCAS::detail::make_expression_ptr
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
定义
base.hpp:111
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::query_nonzero_value
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
定义
facts_query.cpp:708
LMCAS::detail::no_facts
const FactsQuery & no_facts() noexcept
定义
facts_query_adapters.cpp:96
LMCAS::detail::query_definedness
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
定义
facts_query.cpp:703
LMCAS::integration_table_detail
定义
integration_table_algebraic.cpp:4
LMCAS::integration_table_detail::load_scaled_radical_rules
void load_scaled_radical_rules(std::vector< detail::IntegrationEntry > &table)
定义
integration_table_composite.cpp:47
LMCAS::integration_table_detail::u_is_var_a_nonzero
auto u_is_var_a_nonzero(const std::string &u_wc, const std::string &a_wc, bool real_scale=false)
定义
integration_table_rules.hpp:26
LMCAS::integration_table_detail::u_is_var_a_indep
auto u_is_var_a_indep(const std::string &u_wc, const std::string &a_wc)
定义
integration_table_rules.hpp:17
LMCAS::integration_table_detail::u_is_var
auto u_is_var(const std::string &wc)
定义
integration_table_rules.hpp:8
LMCAS::integration_table_detail::load_exponential_trig_rules
void load_exponential_trig_rules(std::vector< detail::IntegrationEntry > &table)
定义
integration_table_composite.cpp:99
LMCAS::integration_table_detail::load_logarithmic_rules
void load_logarithmic_rules(std::vector< detail::IntegrationEntry > &table)
定义
integration_table_composite.cpp:5
LMCAS::integration_table_detail::load_exponential_base_rules
void load_exponential_base_rules(std::vector< detail::IntegrationEntry > &table)
定义
integration_table_composite.cpp:23
LMCAS::integration_table_detail::load_scaled_trig_rules
void load_scaled_trig_rules(std::vector< detail::IntegrationEntry > &table)
定义
integration_table_composite.cpp:66
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::wildcard
SymbolicExpr wildcard(const std::string &name)
定义
matcher.cpp:9
LMCAS::Domain::Real
@ Real
Real numbers
定义
assumption.hpp:17
LMCAS::sym_rational
std::shared_ptr< SymbolicExpr > sym_rational(const BigInt &numerator, const BigInt &denominator)
定义
integration_support.hpp:70
LMCAS::a
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
定义
vector_calculus_curves.hpp:50
LMCAS::MatchMap
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式
定义
matcher.hpp:21
LMCAS::normalization_proved
bool normalization_proved(const Result< Tribool > &result)
定义
normalization_utils.hpp:12
LMCAS::make_unary_function
std::shared_ptr< SymbolicExpr > make_unary_function(FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &operand)
定义
integration_support.hpp:95
LMCAS::sym_sub
std::shared_ptr< SymbolicExpr > sym_sub(const SymbolicExpr &lhs, const SymbolicExpr &rhs)
定义
integration_support.hpp:62
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
LMCAS::detail::IntegrationEntry
定义
integration_support.hpp:31
src
integration_table_composite.cpp
生成于
, 为 LMCAS使用
1.18.0